2016-06-14 30 views
2

所以我使用terraform来提供ec2实例和openstack实例。我试图引用我创建的实例的IP地址,因为我需要运行使用它们的命令(设置consul)。添加引用到这些变量后然而terraform只是摊出来,也绝对没有什么后,我运行一个terraform applyterraform planTerraform在尝试获取多个实例的IP地址时停顿?

以下是资源块的什么我试图运行示例:

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

所以我发现,如果我不是只用一个

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

我需要在同一时间被创建,并有机会获得IP我的所有实例:IP地址,然后,直到我的第一个实例被创建,像下面的块中的其他情况下甚至不会被创建创建后立即创建的所有其他实例的地址。

+0

看起来像一个_very_快速浏览应该做你想要的。它出什么问题了? – ydaetskcoR

+0

这应该不成问题。 'aws_instance.consul ...'部分表示从一个名为'consul'的'aws_instance'资源获取输出。如果你删除'count'并且有一个''echo $ {aws_instance.consul.private_ip} >>/home/ubuntu/test.txt'“会发生什么? – ydaetskcoR

+0

所以我尝试着用我的OpenStack做一些非常类似的事情,并得到了同样的问题。在运行'terraform apply'后​​,我的终端开始不做任何事情。等待它做了5分钟后,我做了一个双'control + c'退出,然后出现一堵错误。 –

回答

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个实例,然后连接到它们,安装卷曲,然后创建一个文件与新的行分隔私人列表3个实例的IP地址。

+0

非常感谢你的工作! –

+0

我注意到'null resources'无法运行其他服务器执行的所有命令,所以基本上它不会重新连接到在前面'resource'块中创建的服务器。另一个解决方案是在第一个3之后创建另一个服务器,并从该新服务器运行远程bash命令。将它应用到我的terraform脚本中非常容易,因为无论如何我需要创建一个负载平衡器实例。因此,第四个实例运行我需要的命令并可以访问前3台服务器的IP地址。 –