尝试获取多个实例的IP地址时Terraform停顿了吗?

时间:2016-06-14 23:27:33

标签: amazon-web-services openstack provisioning terraform

所以我使用terraform来配置ec2实例和openstack实例。我试图引用我正在创建的实例的IP地址,因为我需要运行使用它们的命令(设置consul)。然而,在添加对这些变量的引用之后,terraform就会停止运行,并且在运行terraform applyterraform plan之后绝对没有任何内容:

以下是我尝试运行的资源块的示例:

resource "aws_instance" "consul" {
  count = 3
  ami = "ami-ce5a9fa3"
  instance_type = "t2.micro"
  key_name = "ansible_aws"
  tags {
    Name = "consul"
  }

  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",
      "echo ${aws_instance.consul.0.private_ip} >> /home/ubuntu/test.txt",
      "echo ${aws_instance.consul.1.private_ip} >> /home/ubuntu/test.txt",
      "echo ${aws_instance.consul.2.private_ip} >> /home/ubuntu/test.txt"
    ]
  }
}

更新:所以我尝试使用我的openstack云运行类似命令并遇到同样的问题:

  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}"
    ]
  }

所以我发现如果只使用其中一个IP地址,那么在创建第一个实例之前,其他实例甚至都不会被创建,如下面的块中所示:

  provisioner "remote-exec" {
    inline = [
      "echo ${openstack_compute_instance_v2.consul.0.network.0.fixed_ip_v4}",
    ]
  }

我需要同时创建所有实例,并且可以在创建后立即访问创建的所有其他实例的IP地址。

1 个答案:

答案 0 :(得分:3)

因此,仔细研究一下,看起来它实际上是一个issue with Terraform,它被锁定在一个依赖循环中。

同样的问题还包括一种解决方法,使用null_resource然后连接到所有配置的实例并针对它们运行脚本。

对于您的用例,您可以使用以下内容:

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"
    ]
  }
}

这应该调出3个实例然后连接到它们,安装curl然后创建一个文件,其中包含3个实例的私有IP地址的新行分隔列表。