地形循环依赖挑战



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

我们有一个用户数据模板文件,用于让每个新的 AWS 服务器向 Chef Automate 注册。 Chef 通过用户数据脚本中设置的"node_name"来引用每个客户端,默认情况下是实例 ID。 但是在 Chef UI 或"刀节点列表"中查看时,实例 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 设置为随机数的"守护者"。 这导致了循环错误:( -> 表示"取决于") 实例 -> 用户数据 -> 随机 -> 实例

还尝试转储随机生成,只是将实例 id 的子字符串附加到node_name。 同样的问题,虽然周期更短:实例 -> 用户数据 -> 实例。

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

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

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

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

最新更新