【发布时间】:2019-09-21 03:02:24
【问题描述】:
我有一个有效的 TF 设置来在 Azure 中启动多个 Linux VM。我在 null_resource 中运行 local-exec 配置程序来执行 Ansible 剧本。我正在从 TF 状态文件中提取私有 IP 地址。状态文件存储在本地。
我最近配置了 Azure 后端,现在状态文件存储在存储帐户中。
我已经修改了本地配置器,并试图获取所有私有 IP 地址来运行 Ansible playbook,如下所示:
resource "null_resource" "Ansible4Ubuntu" {
provisioner "local-exec" {
command = "sleep 20;ansible-playbook -i '${element(azurerm_network_interface.unic.*.private_ip_address, count.index)}', vmlinux-playbook.yml"
我也试过了:
resource "null_resource" "Ansible4Ubuntu" {
provisioner "local-exec" {
command = "sleep 20;ansible-playbook -i '${azurerm_network_interface.unic.private_ip_address}', vmlinux-playbook.yml"
它们都只适用于第一个 VM,而忽略了其余部分。我也试过count.index+1 and self.private_ip_address,但没有运气。
实际结果:TF 仅将第一个 VM 的私有 IP 提供给 Ansible。
预期结果:TF 向 Ansible 提供所有私有 IP 的列表,以便它可以针对所有这些运行 playbook。
PS:我也在考虑使用 TF 的 remote_state 数据结构,但状态文件似乎也包含以前构建的 IP,因此很难提取适合当前构建的 IP。
我将不胜感激。
谢谢 阿斯加尔
【问题讨论】:
-
我觉得这里的实际问题是
local-exec每个块只会执行一次,而不是每次资源迭代一次,这就是为什么你只能在第一个 IP 地址上执行.这样做也可以解决您的问题的更好方法可能是使用 Terraformtemplate将所有 IP 地址输出到 Ansible 主机文件中,然后您可以利用该文件。
标签: azure ansible cloud terraform