Terraform 在尝试获取多个实例的 IP 地址时停顿?
Terraform stalls while trying to get IP addresses of multiple instances?
所以我使用 terraform 来配置 ec2 实例和 openstack 实例。我正在尝试引用我正在创建的实例的 IP 地址,因为我需要 运行 使用它们的命令(以设置 consul)。然而,在添加对这些变量的引用之后,terraform 只是停止并且在 I 运行 a terraform apply
或 terraform 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 地址。
所以仔细观察一下,它看起来实际上是一个 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 地址的新行分隔列表。
所以我使用 terraform 来配置 ec2 实例和 openstack 实例。我正在尝试引用我正在创建的实例的 IP 地址,因为我需要 运行 使用它们的命令(以设置 consul)。然而,在添加对这些变量的引用之后,terraform 只是停止并且在 I 运行 a terraform apply
或 terraform 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 地址。
所以仔细观察一下,它看起来实际上是一个 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 地址的新行分隔列表。