Search code examples
openstackprovisioningterraform

Terraform, How to run the provisioner on existing resources?


My question is similar to this git hub post:

https://github.com/hashicorp/terraform/issues/745

It is also related to another stack exchange post of mine:

Terraform stalls while trying to get IP addresses of multiple instances?

I am trying to bootstrap several servers and there are several commands I need to run on my instances that require the IP addresses of all the other instances. However I cannot access the variables that hold the IP addresses of my newly created instances until they are created. So when I try to run a provisioner "remote-exec" block like this:

  provisioner "remote-exec" {
    inline = [
      "sudo apt-get update",
      "sudo apt-get install -y curl",
      "echo ${openstack_compute_instance_v2.consul.0.network.0.fixed_ip_v4}",
      "echo ${openstack_compute_instance_v2.consul.1.network.1.fixed_ip_v4}",
      "echo ${openstack_compute_instance_v2.consul.2.network.2.fixed_ip_v4}"
    ]
  }

Nothing happens because all the instances are waiting for all the other instances to finish being created and so nothing is created in the first place. So I need a way for my resources to be created and then run my provisioner "remote-exec" block commands after they are created and terraform can access the IP addresses of all my instances.


Solution

  • The solution is to create a resource "null_resource" "nameYouWant" { } and then run your commands inside that. They will run after the initial resources are created:

    resource "aws_instance" "consul" {
      count = 3
      ami = "ami-ce5a9fa3"
      instance_type = "t2.micro"
      key_name = "ansible_aws"
      tags {
        Name = "consul"
      }
    }
    
    resource "null_resource" "configure-consul-ips" {
      count = 3
    
      connection {
        user = "ubuntu"
        private_key="${file("/home/ubuntu/.ssh/id_rsa")}"
        agent = true
        timeout = "3m"
      }
    
      provisioner "remote-exec" {
        inline = [
          "sudo apt-get update",
          "sudo apt-get install -y curl",
          "sudo echo '${join("\n", aws_instance.consul.*.private_ip)}' > /home/ubuntu/test.txt"
        ]
      }
    }
    

    Also see the answer here:

    Terraform stalls while trying to get IP addresses of multiple instances?

    Thank you so much @ydaetskcor for the answer