首页 文章

Terraform循环依赖性挑战

提问于
浏览
1

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

我们有一个用户数据模板文件,用于让每个新的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的循环错误 .

1 回答

  • 1

    正如您所见, 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

相关问题