Terraform设置程序仅针对新实例触发/仅运行一次

时间:2020-09-08 19:25:29

标签: terraform

我有要为创建的所有计算实例运行的条件配置步骤,但是只能运行一次。

我知道我可以将配置放入计算资源中,但是那不是有条件的。 如果将其放在null_resource中,则需要一个触发器,而且我不知道如何仅在新创建的资源上进行触发器(即,如果我已经有1个实例,并且想要扩展为2个实例,我想只能在正在创建的第二个上运行配置,而不能在已经配置的第一个上再次运行。

如何获取一个变量,该变量仅给出刚创建的实例的ID或ip,而不是所有实例?

在预配器的示例下面。

resource "null_resource" "provisioning" {
  count = var.condition ? length(var.instance_ips) : 0

  triggers = {
    instance_ids = join(",", var.instance_ips)
  }

  connection {
    agent = false
    timeout = "4m"
    host = var.instance_ips[count.index]
    user = "user"
    private_key = var.ssh_private_key
  }

  provisioner "remote-exec" {
    inline = [ do something, then remove the public key from authorized_keys ]
  }
}

PS:之所以只能运行一次(而不是再次运行并且如果已经进行了准备则什么也不做)是因为我要在完成后销毁供应的公共密钥,因为它使用的是tf生成的密钥对并且私钥最终出现在状态文件中,我想确保可以访问密钥对的某人仍然无法访问该实例。 从authorized_keys中删除公钥后,第二次运行的预配器将无法连接,超时并失败。 我发现我可以使用on_failure: continue键,但是如果它由于合理的原因而实际失败,那么它也会继续。

我还可以使用由local-exec设置程序在本地生成的密钥对,这样它就不会显示在状态文件中,但是密钥是一个文件,如果有人可以访问,它就没有太大的不同。对它该文件需要保留在计算机上,这可能无法与需要运行的基础上重新创建的云资源管理器环境一起使用。

然后我确定还有其他方法来供应文件或脚本,但是在这种情况下,它包含TF生成的实例相关性数据,我不想将其保留在cloud-init中。

因此,我归结为需要找到一种方法来使用仅包含新实例的trigger

任何想法如何做到这一点?

1 个答案:

答案 0 :(得分:0)

https://www.terraform.io/docs/provisioners/

本文档以last resource的形式列出了预配者,并针对各种常见资源提供了一些有关如何避免不得不使用它的建议。

user_data执行脚本,该脚本是专门为临时一次运行的操作而设计的。由于定义user_data支持所有常规Terraform插值,因此如果需要条件逻辑,则可以利用该机会传递环境变量或选择性地包括/排除脚本的某些部分。

缺点是user_data中的任何更改都会导致重新创建实例或创建新的启动配置/模板。

相关问题