“如何结合”;知识产权;及;名称“;在具有Terraform local exec的实例列表中

“如何结合”;知识产权;及;名称“;在具有Terraform local exec的实例列表中,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我试图从Terraform中读取实例public_IP和实例名称,然后将它们写入同一行的文件中 使用下一个命令,我编写下一个文件: provisioner "local-exec" { command = "echo \"${join("\n", aws_instance.nodeStream.*.public_ip)}\" >> ../ouput_file" } 输出文件: 34.14.219.13 64.2.201.14 59.12.31.15 34.14.219.13

我试图从Terraform中读取实例public_IP和实例名称,然后将它们写入同一行的文件中

使用下一个命令,我编写下一个文件:

provisioner "local-exec" {
  command =  "echo \"${join("\n", aws_instance.nodeStream.*.public_ip)}\" >> ../ouput_file"
}
输出文件:

34.14.219.13
64.2.201.14
59.12.31.15
34.14.219.13 instance_name1
64.2.201.14 instance_name2
59.12.31.15 instance_name3
我想要的是下一个输出文件:

34.14.219.13
64.2.201.14
59.12.31.15
34.14.219.13 instance_name1
64.2.201.14 instance_name2
59.12.31.15 instance_name3
因此,我尝试了下一步的两个列表:

provisioner "local-exec" {
      command =  "echo \"${concat(sort(lookup(aws_instance.node1Stream.*.tags, "Name")), sort(aws_instance.node1Stream.*.public_ip))}\" >> ../../output_file"
    }
前几次抛出:

Error: Invalid function argument: Invalid value for "inputMap" parameter: lookup() requires a map as the first argument.

由于您的目标是从数据结构生成字符串,因此这似乎是一个很好的用途:

如果您的最终目标是将数据放入文件中,而这不仅仅是为了解决这个问题而设计的示例,那么我建议使用
local_file
资源,以便Terraform可以像其他任何资源一样管理该文件,包括在无需任何特殊供应器触发的情况下,如果输入发生变化,则可能对其进行更新:

resource "local_file" "hosts_file" {
  filename = "${path.root}/../../output_file"
  content  = <<EOT
    %{ for inst in aws_instance.node1Stream ~}
    ${inst.private_ip} ${inst.tags["Name"]}
    %{ endfor ~}
  EOT
}
资源“本地\u文件”“承载\u文件”{
filename=“${path.root}/./../output\u文件”

content=什么是“不工作”意思?错误和文件的输出是什么?@AndyShinn它在部署时抛出错误:“错误:无效的函数参数:“inputMap”参数的值无效:lookup()需要一个映射作为第一个参数。”