【问题标题】:Terraform: call null_resource (local-exec) BEFORE the other modulesTerraform:在其他模块之前调用 null_resource (local-exec)
【发布时间】:2020-12-24 02:47:35
【问题描述】:

我有一个 python 脚本,它为我使用 terraform 创建的每个 AWS EC2 实例生成自定义 cloud-init 脚本。但现在我无法对terraform apply 进行一次调用,因为此时 cloud-init 的文件不存在,并且出现错误。所以现在我正在使用terraform apply -target=null_resource.pynit_lite 来生成文件,然后使用terraform apply 来创建基础架构。

我希望先执行 null_resource,然后执行其余部分,以便在创建 ec2 资源时存在 cloud-init 文件,这样我就可以对 terraform apply 进行一次调用。

我想我需要实现某种“depends_on”,以便 EC2 模块等待 null_resource 完成,但这不是 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
}

我看过这个问题,但它没有为此提供解决方案:Unable to make Terraform module dependent on resource

这是非阻塞的,但肯定很烦人,因此我们将不胜感激。

谢谢。

【问题讨论】:

    标签: dependencies terraform


    【解决方案1】:

    从最近(terraform 13)开始,模块还支持资源已经可以使用的depends_on 功能。 medium 上有一篇非常棒的文章,它解释了如何实现这样的结构。在您的情况下,这将是:

    resource "null_resource" "pynit_lite" {
      provisioner "local-exec" {
        command = "python3 pynit_lite.py"
      }
    }
    
    module "EC2" {
      # ...
       depends_on = [null_resource.pynit_lite]
    }
    

    另一种不太可行的方法是使用带有 terragrunt 的前挂钩,它是 terraform 周围的薄包装。在这个之前的钩子中,您还可以运行您的命令。您可以阅读更多关于 here 的信息。示例:

    terraform {
      before_hook "before_hook" {
        commands     = ["apply", "plan"]
        execute      = ["python3", "pynit_lite.py"]
      }
    }
    

    【讨论】:

    • 谢谢,我一定会试试的。 ??
    • 你到底是什么意思?
    猜你喜欢
    • 2020-03-22
    • 2016-11-28
    • 2020-07-09
    • 2020-07-07
    • 2019-08-20
    • 2020-07-01
    • 1970-01-01
    • 2020-07-09
    • 2021-05-03
    相关资源
    最近更新 更多