首页 > 解决方案 > Terraform local-exec Provisioner 在多个 Azure 虚拟机上运行

问题描述

我有一个有效的 TF 设置来在 Azure 中启动多个 Linux VM。我在 null_resource 中运行 local-exec 配置程序来执行 Ansible 剧本。我正在从 TF 状态文件中提取私有 IP 地址。状态文件存储在本地。

我最近配置了 Azure 后端,现在状态文件存储在存储帐户中。

我已经修改了本地配置器,并试图获取所有私有 IP 地址来运行 Ansible 剧本,如下所示:

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。

我将不胜感激任何帮助。

谢谢阿斯加尔

标签: azureansiblecloudterraform

解决方案


正如马特所说,null_resource 只运行一次,所以它在第一个虚拟机上工作得很好,而忽略了其余的。您需要使用 NIC 列表为 null_resource 配置触发器,以使其多次运行。示例代码如下:

resource "null_resource" "Ansible4Ubuntu" {

    triggers = {
      network_interface_ids = "${join(",", azurerm_network_interface.unic.*.id)}"
    }

    provisioner "local-exec" {
      command = "sleep 20;ansible-playbook -i '${join(" ", azurerm_network_interface.unic.*.private_ip_address)}, vmlinux-playbook.yml"
  }

}

您可以根据需要更改其中的某些内容。有关信息,请参阅null_resource


推荐阅读