Dependencies Terraform:在其他模块之前调用null_资源(本地exec)
我有一个python脚本,它为我使用terraform创建的每个AWS EC2实例生成定制的cloud init脚本。但是现在我无法调用Dependencies Terraform:在其他模块之前调用null_资源(本地exec),dependencies,terraform,Dependencies,Terraform,我有一个python脚本,它为我使用terraform创建的每个AWS EC2实例生成定制的cloud init脚本。但是现在我无法调用terraformapply,因为cloudinit的文件当时不存在,我得到了一个错误。所以现在我正在做terraformapply-target=null\u resource.pynit\u lite来生成文件,然后terraformapply来创建基础设施 我想要的是先执行null_资源,然后执行其余的,以便在创建ec2资源时存在cloud init文件,
terraformapply
,因为cloudinit的文件当时不存在,我得到了一个错误。所以现在我正在做terraformapply-target=null\u resource.pynit\u lite
来生成文件,然后terraformapply
来创建基础设施
我想要的是先执行null_资源,然后执行其余的,以便在创建ec2资源时存在cloud init文件,这样我就可以对terraform apply
执行单个调用
我想我需要实现某种“dependens_-on”,以便EC2模块等待null_资源完成,但这不是terraform中的特性
我的代码如下所示:
provider "aws" {
region = var.region
profile = var.profile
}
resource "null_resource" "pynit_lite" {
provisioner "local-exec" {
command = "python3 pynit_lite.py"
}
}
data "aws_vpc" "devvpc" {
id = var.vpc_id
}
data "aws_subnet_ids" "devsubs" {
vpc_id = var.vpc_id
}
module "EC2" {
source = "../../../Modules/EC2"
name = var.instanceNames
DSKsize = var.DSKsize
root_volume_size = var.root_volume_size
ami = var.ami
instance_count = length(var.instanceNames)
instance_type = var.instance_type
key_name = var.key_name
ec2_security_group_ids = var.ec2_security_group_ids
script = var.scripts
subnet = var.subnet
vpc = var.vpc_id
}
output "EIP-public" {
value = module.EC2.EIPAddress
}
output "EIP-internal" {
value = module.EC2.InternalIps
}
我看过这个问题,但它没有提供解决方案:
这是非阻塞的,但肯定很烦人,所以任何帮助都将不胜感激
谢谢。因为最近(terraform 13),模块还支持资源已经可以使用的依赖功能。有一篇非常棒的文章介绍了如何实现这种结构。在您的情况下,这将是:
resource "null_resource" "pynit_lite" {
provisioner "local-exec" {
command = "python3 pynit_lite.py"
}
}
module "EC2" {
# ...
depends_on = [null_resource.pynit_lite]
}
另一个不太可行的方法是使用terragrunt的前钩子,这是一个围绕terraform的薄包装。在此之前的钩子中,您还可以运行您的命令。你可以阅读更多关于这方面的内容。例如:
terraform {
before_hook "before_hook" {
commands = ["apply", "plan"]
execute = ["python3", "pynit_lite.py"]
}
}
谢谢,我一定会试试的。