Terraform local-exec Provisioner to run on multiple Azure virtual machines

前提是你 提交于 2021-01-01 06:45:29

问题


I had a working TF setup to spin up multiple Linux VMs in Azure. I was running a local-exec provisioner in a null_resource to execute an Ansible playbook. I was extracting the private IP addresses from the TF state file. The state file was stored locally.

I have recently configured Azure backend and now the state file is stored in a storage account.

I have modified the local provisioner and am trying to obtain all the private IP addresses to run the Ansible playbook against, as follows:

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"

I have also tried:

resource "null_resource" "Ansible4Ubuntu" {
  provisioner "local-exec" {
    command = "sleep 20;ansible-playbook -i '${azurerm_network_interface.unic.private_ip_address}', vmlinux-playbook.yml"

They both work fine with the first VM only and ignores the rest. I have also tried with count.index+1 and self.private_ip_address, but no luck.

Actual result: TF provides the private IP of only the first VM to Ansible.

Expected result: TF to provide a list of all private IPs to Ansible so that it can run the playbook against all of them.

PS: I am also looking at using the TF's remote_state data structure, but seems like the state file contains IPs from previous builds as well, making it hard to extract the ones good for the current build.

I would appreciate any help.

Thanks Asghar


回答1:


As Matt said, the null_resource just run one time, so it just works fine with the first VM and ignores the rest. You need to configure triggers for the null_resource with the NIC list to make it run multiple times. Sample code like this:

resource "null_reousrce" "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"
  }

}

You can change something in it as you want. For information, see null_resource.



来源:https://stackoverflow.com/questions/55955007/terraform-local-exec-provisioner-to-run-on-multiple-azure-virtual-machines

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!