Terraform 循环依赖挑战

Terraform cyclic dependency challenge

好的,所以大部分都在工作,除了...

我们有一个用户数据模板文件,用于让每个新的 AWS 服务器注册到 Chef Automate。 Chef 通过在用户数据脚本中设置的 "node_name" 来引用每个客户端,默认情况下是实例 ID。但是当在 Chef UI 或 "knife node list" 中查看时,实例 ID 并不完全是用户友好的。我们能够使用模板写出有意义的 node_name。类似于:

data "template_file" "user-data-qa" {
  count = "${var.QA_numhosts}"
  template = "${file("userdata.tpl")}"
  vars {
    node_name = "${var.customer_name}-QA-${format("%d", count.index + 1)}"
  }
}

但是,如果我们重建实例,我们会从 Chef 收到错误消息,因为新实例尝试使用相同的名称注册,但使用的是新生成的密钥。

所以,我们在node_name中添加了一个随机数后缀。我们希望每次重建实例时更新这个随机数。第一次尝试是将实例 ID 设置为随机数的 "keeper"。这导致了循环错误:( -> means "depends on") Instance -> User Data -> Random -> Instance

还尝试了转储随机生成并仅将实例 ID 的子字符串附加到 node_name。同样的问题,虽然周期更短:Instance -> User Data -> Instance.

有什么办法解决这个问题吗?简而言之,我们想要将一个字符串附加到 node_name,它被插入到用户数据中,并且该字符串应该在每次实例终止和重新启动时更新。没有来自 Terraform 的循环错误。

instance-id,如你所见,是计算出来的,所以你不能在资源本身的定义中使用它,或者通过依赖循环。

与其在 Terraform 中填充实例 ID,不如尝试让用户数据脚本本身获取实例 ID 并使用该值填充 node_name.rb。您可以使用简单的 curl 和 echo:

来做到这一点

echo "node_name '$(curl --silent /dev/null http://169.254.169.254/latest/meta-data/instance-id)'" > path/to/node_name.rb