如何将逗号分隔的数组传递给terraform v0.12.0中的资源?

如何将逗号分隔的数组传递给terraform v0.12.0中的资源?,terraform,hcl,terraform0.12+,Terraform,Hcl,Terraform0.12+,在以下代码块中,我尝试将服务器名称数组传递给attributes_json块: resource "aws_instance" "consul-server" { ami = var.consul-server instance_type = "t2.nano" key_name = var.aws_key_name iam_instance_profile = "dna_inst_mgmt" vpc_security_group_ids = [

在以下代码块中,我尝试将服务器名称数组传递给attributes_json块:

resource "aws_instance" "consul-server" {
    ami = var.consul-server
    instance_type = "t2.nano"
    key_name = var.aws_key_name
    iam_instance_profile = "dna_inst_mgmt"
    vpc_security_group_ids = [
        "${aws_security_group.yutani_consul.id}",
        "${aws_security_group.yutani_ssh.id}"
    ]
        subnet_id = "${aws_subnet.public_1_subnet_us_east_1c.id}"
        associate_public_ip_address = true
      tags = {
        Name = "consul-server${count.index}"
    }

    root_block_device {
        volume_size = "30"
        delete_on_termination = "true"
    }

    connection {
        type = "ssh"
        user = "chef"
        private_key = "${file("${var.aws_key_path}")}"
        timeout = "2m"
        agent = false
        host = self.public_ip
    }

   count = var.consul-server_count

   provisioner "chef" {
         attributes_json = <<-EOF
                {
                    "consul": {
                            "servers": ["${split(",",aws_instance.consul-server[count.index].id)}"]
                      }
                }
                EOF
        use_policyfile = true
        policy_name = "consul_server"
        policy_group = "aws_stage_enc"
        node_name       = "consul-server${count.index}"
        server_url      = var.chef_server_url
        recreate_client = true
        skip_install = true
        user_name       = var.chef_username
        user_key        = "${file("${var.chef_user_key}")}"
       version         = "14"
    }
   }
(这是在为var.consu-server_count在变量中声明计数2之后)


谁能告诉我正确的方法是什么吗?

这里有两个问题:(1)如何在JSON字符串中插入逗号分隔的列表;以及(2)导致循环依赖性错误的原因

如何插入列表以生成有效的JSON数组 使用jsonencode 最干净的方法是根本不使用herdeoc,只使用函数

您可以这样做:

本地人{
arr=[“主机1”、“主机2”、“主机3”]
}
输出“测试”{
value=jsonencode(
{
“领事”={
“服务器”=local.arr
}
})
}
这就产生了输出:

输出:
测试={“领事”:{“服务器”:[“主机1”、“主机2”、“主机3”]}
使用join函数和heredoc Chef provisioner的文档建议对JSON字符串使用heredoc,因此您也可以这样做:

本地人{
arr=[“主机1”、“主机2”、“主机3”]
sep=“\”,\“”
}
输出“测试”{

value=Thank you:)我希望可以根据我想要部署的实例数量使此列表变为变量。嵌套循环是否可以在该局部变量定义中工作以提供该变量?@TyMac.Ok。我看到了问题所在,您得到了循环依赖关系,因为AWS实例ID只有在提供程序创建了实例。我会在有时间的时候用一些建议更新我的答案。@TyMac,扩展了很多。这有帮助吗?非常扩展谢谢!服务器字段的原因听起来像你猜的那样-Chef配置了领事服务器的“重试加入”选项与实例列表。我希望将实例名称与主机名、chef节点名和DNS名称合并,以便“retry_join”字段中的名称在每个位置都显示相同,特别是在运行“Consor members”时。听起来我实际上应该使用“.DNS_name”而不是“.id”@TyMac,这里有一个
.public\u dns
,但它不会有任何帮助,因为您仍然无法在资源块中引用它。我认为您需要以某种方式提前告诉Terraform dns名称。
Error: Cycle: aws_instance.consul-server[1], aws_instance.consul-server[0]