Terraform:配置后如何将实例 IP 发送到 aws_instances
Terraform : How to send instance IPs to aws_instances after provisioned
示例代码
resource "aws_instance" "A" {
#provisioning declarations
}
resource "aws_instance" "B" {
#provisioning declarations
}
# Crux of problem : This should run after all instances are provisioned sending all IPs to each
resource "null_resource" "send_instance_ips" {
depends_on = [aws_instance.A, aws_instance.B]
for_each = { for idx, instance in [aws_instance.A, aws_instance.B]: idx=> instance}
connection {
type = "ssh"
user = "admin-user"
private_key = file("~/id_rsa")
host = each.value.public_ip
}
provisioner "remote-exec" {
inline = [
"echo ${aws_instance.A.*.private_ip} > a_ip.txt",
"echo ${aws_instance.B.*.private_ip} > b_ip.txt"
]
}
}
问题:如何在配置后调用module/provision向实例发送数据
我在尝试创建计划时遇到的问题
Error: 2 problems:
- Invalid template interpolation value: Cannot include the given value in a string template: string required.
- Invalid template interpolation value: Cannot include the given value in a string template: string required.
您可以使用 for_each
在 null_resource
中循环您的实例。例如(示例在 ubuntu
个实例上测试,因此您必须根据自己的情况调整连接详细信息):
resource "null_resource" "send_instance_ips" {
for_each = { for idx, instance in [aws_instance.A,aws_instance.B]:
idx=>instance}
connection {
user = "ubuntu"
host = each.value.public_ip
type = "ssh"
private_key = file("~/.ssh/id_rsa")
}
provisioner "remote-exec" {
inline = [
"echo ${each.value.private_ip} > a_ip.txt"
]
}
}
此外,我不确定您是需要每个实例中所有实例的所有 IP,还是只需要循环中的当前实例 IP。我选择使用示例中的第二个选项。但该示例也可以调整为使用所有 IP,但这需要修改您的 inline
部分。
示例代码
resource "aws_instance" "A" {
#provisioning declarations
}
resource "aws_instance" "B" {
#provisioning declarations
}
# Crux of problem : This should run after all instances are provisioned sending all IPs to each
resource "null_resource" "send_instance_ips" {
depends_on = [aws_instance.A, aws_instance.B]
for_each = { for idx, instance in [aws_instance.A, aws_instance.B]: idx=> instance}
connection {
type = "ssh"
user = "admin-user"
private_key = file("~/id_rsa")
host = each.value.public_ip
}
provisioner "remote-exec" {
inline = [
"echo ${aws_instance.A.*.private_ip} > a_ip.txt",
"echo ${aws_instance.B.*.private_ip} > b_ip.txt"
]
}
}
问题:如何在配置后调用module/provision向实例发送数据
我在尝试创建计划时遇到的问题
Error: 2 problems:
- Invalid template interpolation value: Cannot include the given value in a string template: string required.
- Invalid template interpolation value: Cannot include the given value in a string template: string required.
您可以使用 for_each
在 null_resource
中循环您的实例。例如(示例在 ubuntu
个实例上测试,因此您必须根据自己的情况调整连接详细信息):
resource "null_resource" "send_instance_ips" {
for_each = { for idx, instance in [aws_instance.A,aws_instance.B]:
idx=>instance}
connection {
user = "ubuntu"
host = each.value.public_ip
type = "ssh"
private_key = file("~/.ssh/id_rsa")
}
provisioner "remote-exec" {
inline = [
"echo ${each.value.private_ip} > a_ip.txt"
]
}
}
此外,我不确定您是需要每个实例中所有实例的所有 IP,还是只需要循环中的当前实例 IP。我选择使用示例中的第二个选项。但该示例也可以调整为使用所有 IP,但这需要修改您的 inline
部分。