Terraform provisioner触发器仅适用于新实例/仅运行一次

Terraform provisioner触发器仅适用于新实例/仅运行一次,terraform,Terraform,我想为所有创建的计算实例运行条件配置步骤,但只运行一次。 我知道我可以将资源调配放在计算资源中,但它不能是有条件的。 如果我把它放在一个null_resource中,我需要一个触发器,并且我不知道如何仅在新创建的资源上触发(即,如果我已经有1个实例,并且希望扩展到2个,我只想在创建的第2个实例上运行配置,而不想在已经配置的第1个实例上再次运行) 我怎样才能得到一个变量,它只给我刚刚创建的实例的id或ip,而不是所有实例的id或ip 下面是供应器的示例 resource "null_re

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

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

我怎样才能得到一个变量,它只给我刚刚创建的实例的id或ip,而不是所有实例的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生成的密钥对,私钥最终位于状态文件中,我想确保访问密钥对的人仍然无法访问该实例。 一旦从
授权密钥中删除公钥,第二次运行的provisioner将无法连接、超时并失败。
我发现我可以使用
on_failure:continue
键,但如果它由于合法原因实际失败,它也会继续

我还可以使用一个密钥对,它是通过
本地exec
provisioner在本地生成的,这样它就不会显示在状态文件中,但是密钥是一个文件,如果有人访问它,它就不会有太大的不同;该文件需要保留在计算机上,这可能无法与根据运行需要重新创建的cloud resource manager环境一起正常工作

然后我确定还有其他方法来提供文件或脚本,但在本例中,它包含TF生成的实例依赖数据,我不希望将其留在cloud init中

因此,我需要找到一种方法来使用只包含新实例的
触发器

有什么办法吗?

本文档将供应器列为
最后一个资源
,并提供一些建议,说明如何避免在各种常见资源中使用它

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

缺点是,用户数据的任何更改都会导致重新创建实例,或创建新的启动配置/模板。

本文档将供应器列为
最后一个资源
,并提供一些建议,说明如何避免在各种常见资源中使用它

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


缺点是,
user\u数据的任何更改
都会导致重新创建实例,或创建新的启动配置/模板。

user\u数据最终会出现在cloud init脚本中,因为数据的敏感性,我不想使用该脚本。另外,正如您所说,用户数据的更改意味着销毁实例,如果数据发生更改,这是可以的,但不是我在这里要求的。用户_数据最终会出现在cloud init脚本中,我提到过,由于数据的敏感性,我不希望出现这种情况。另外,正如您所说,用户数据的更改意味着销毁实例,如果数据发生更改,这是可以的,但不是我在这里要求的。