首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将逗号分隔的数组传递给terraform v0.12.0中的资源?

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

Stack Overflow用户
提问于 2019-05-26 13:50:25
回答 1查看 2.5K关注 0票数 2

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

代码语言:javascript
复制
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"
    }
   }

运行此操作将给出一个错误:

代码语言:javascript
复制
Error: Cycle: aws_instance.consul-server[1], aws_instance.consul-server[0]

(这是在为var.consum-server_ count在变量中声明2的计数之后)

有人能告诉我做这件事的正确方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-26 15:01:45

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

如何内插列表以生成有效的JSON数组

使用jsonencode

最干净的方法是根本不使用本地文档,而只使用jsonencode函数。

你可以这样做:

代码语言:javascript
复制
locals {
  arr = ["host1", "host2", "host3"]
}

output "test" {
  value = jsonencode(
    {
      "consul" = {
        "servers" = local.arr
      }
    })
}

这就产生了产出:

代码语言:javascript
复制
Outputs:

test = {"consul":{"servers":["host1","host2","host3"]}}

使用联接函数和

Chef provisioner的文档建议在JSON字符串中使用一个heredoc,所以您也可以这样做:

代码语言:javascript
复制
locals {
  arr = ["host1", "host2", "host3"]
  sep = "\", \""
}

output "test" {
  value = <<-EOF
    {
      "consul": {
        "servers": ["${join(local.sep, local.arr)}"]
      }
    }
  EOF
}

如果我这么说:

代码语言:javascript
复制
Outputs:

test = {
  "consul": {
    "servers": ["host1", "host2", "host3"]
  }
}

这里有一些需要注意的事情:

  • 您正在尝试加入您的主机,以便它们在JSON数组的上下文中成为有效的JSON。你需要加入他们的",",而不仅仅是一个逗号。这就是为什么我定义了一个局部变量sep = "\", \""
  • 当你显然需要split的时候,你似乎在尝试在那里使用join

循环依赖问题

错误消息的原因:

代码语言:javascript
复制
Error: Cycle: aws_instance.consul-server[1], aws_instance.consul-server[0]

就是你有一个循环依赖关系。考虑一下这个简化的例子:

代码语言:javascript
复制
resource "aws_instance" "example" {
  count         = 3
  ami           = "ami-08589eca6dcc9b39c"
  instance_type = "t2.micro"
  user_data     = <<-EOF
    hosts="${join(",", aws_instance.example[count.index].id)}"
  EOF
}

或者,对于相同的结果,也可以使用splat表示法,即aws_instance.example.*.id

Terraform计划的结果是:

代码语言:javascript
复制
▶ terraform012 plan 
...
Error: Cycle: aws_instance.example[2], aws_instance.example[1], aws_instance.example[0]

因此,您会得到一个循环错误,因为aws_instance.example.*.id取决于正在创建的aws_instance.example,因此资源取决于自身。换句话说,您不能使用资源本身内部导出的资源值。

做什么?

我对领事不太了解,但尽管如此,我还是有点困惑,为什么要在servers字段中使用servers实例in。领事配置不需要IP地址或主机名吗?

在任何情况下,您可能都需要在此资源之外自己计算主机名,或者作为静态输入参数计算,或者以某种方式计算。我想你最后会有这样的结果:

代码语言:javascript
复制
variable "host_names" {
  type    = list
  default = ["myhost1"]
}

resource "aws_instance" "consul_server" {
  ...
  provisioner "chef" {
    attributes_json = jsonencode(
      {
        "consul" = {
          "servers" = var.host_names
        }
      })
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56314095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档