azure - Terraform local-exec Provisioner 在多个 Azure 虚拟机上运行

标签 azure ansible cloud terraform

我有一个有效的 TF 设置,可以在 Azure 中启动多个 Linux VM。我在 null_resource 中运行本地执行配置程序来执行 Ansible playbook。我从 TF 状态文件中提取私有(private) IP 地址。状态文件存储在本地。

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

我已经修改了本地配置程序,并尝试获取所有私有(private) 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"

它们都仅适用于第一个虚拟机,并忽略其余虚拟机。我也尝试过使用 count.index+1 和 self.private_ip_address,但没有运气。

实际结果:TF 仅向 Ansible 提供第一个虚拟机的私有(private) IP。

预期结果:TF 向 Ansible 提供所有私有(private) IP 的列表,以便它可以针对所有这些 IP 运行 playbook。

PS:我也在考虑使用 TF 的 remote_state 数据结构,但似乎状态文件也包含来自以前版本的 IP,因此很难提取适合当前版本的 IP。

如果有任何帮助,我将不胜感激。

谢谢 阿斯加尔

最佳答案

正如 Matt 所说,null_resource 仅运行一次,因此它仅适用于第一个虚拟机,并忽略其余虚拟机。您需要使用网卡列表为 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 .

关于azure - Terraform local-exec Provisioner 在多个 Azure 虚拟机上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55955007/

相关文章:

azure - 集成测试连接到服务总线队列的 Azure 函数应用程序

python - 获取 Ansible 错误的 python 解释器错误?

java - PCF 应用程序到应用程序 Oauth 2 grant_type = 'client_credentials' 和范围 uaa.resources。本地测试

超出 Azure 配额

Azure:使用云服务或虚拟网络对虚拟机进行分组

ansible - .ansible/tmp/ansible-tmp-* 权限被拒绝

python - ansible 无法使用 "brew install ansible"命令完美安装在 MacOS 中不起作用?错误 : -sh:/usr/local/bin/ansible: No such file or directory

visual-studio-2012 - 将 TF.exe 与 Team Foundation Service 一起使用?

amazon-web-services - 对于现有的 AWS ACM 证书,我可以从电子邮件验证切换到 DNS 验证吗?

node.js - 如何在azure函数nodejs中动态设置要存储在Blob存储中的blob名称?