我有一个有效的 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/