如何将逗号分隔的数组传递给terraform v0.12.0中的资源?
在以下代码块中,我尝试将服务器名称数组传递给attributes_json块:如何将逗号分隔的数组传递给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 = [
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]