【问题标题】:Terraform local-exec Provisioner to run on multiple Azure virtual machinesTerraform local-exec Provisioner 在多个 Azure 虚拟机上运行
【发布时间】: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 地址上执行.这样做也可以解决您的问题的更好方法可能是使用 Terraform template 将所有 IP 地址输出到 Ansible 主机文件中,然后您可以利用该文件。

标签: azure ansible cloud terraform


【解决方案1】:

正如马特所说,null_resource 只运行一次,所以它在第一个 VM 上运行良好,而忽略了其余部分。您需要使用 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

【讨论】:

  • 谢谢查尔斯。该代码就像一个魅力,在命令中进行了微小的更改(引号中的逗号): command = "sleep 20;ansible-playbook -i ${join(",", azurerm_network_interface.cnic.*.private_ip_address)} vmlinux -playbook.yml"
  • 刚刚尝试为单个 VM 提供配置,Ansible 报告库存错误:null_resource.DataDisks4Ubuntu (local-exec): Executing: ["/bin/sh" "-c" "sleep 10 ; ansible- playbook -i 100.96.85.4 datadisk-playbook.yml"] null_resource.DataDisks4Ubuntu (local-exec): [警告]: 无法解析 /home/linuxadm/Automation/Terraform/dev-both-works/100.96.85.4 作为清单source null_resource.DataDisks4Ubuntu (local-exec): [WARNING]: No inventory was parsed, only implicit localhost is available....我猜IP地址的末尾必须有一个逗号才能使它工作?跨度>
猜你喜欢
  • 2020-01-02
  • 2019-09-30
  • 1970-01-01
  • 2023-02-14
  • 1970-01-01
  • 2019-08-20
  • 2017-01-07
  • 1970-01-01
  • 2020-03-22
相关资源
最近更新 更多