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_eachnull_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 部分。