首页 文章

将 Map 列表映射到terraform中选定字段值的列表

提问于
浏览
6

如果资源使用count参数来指定terraform中的多个资源,则有一种简单的语法,用于为资源实例提供专用字段的列表/数组 .

例如

aws_subnet.foo.*.id

由于许多版本可以声明具有复杂结构的变量,例如 Map 列表 .

variable "data" {
  type = "list"
  default = [
    {
      id = "1"
      ...
    },
    {
      id = "10"
      ...
    }
  ]
}

我正在寻找一种可能性来为我可以为多种资源做的变量做同样的事情:将数组投影到数组元素的字段值数组 .

不幸

var.data.*.id

不适用于资源 . 有没有可能这样做?

3 回答

  • 0

    template_file可以帮到你 .

    data "template_file" "data_id" {
      count = "${length(var.data)}"
      template = "${lookup(var.data[count.index], "id")}"
    }
    

    然后你得到一个列表 "${data.template_file.data_id.*.rendered}" ,其元素值为"id" .

    您可以通过这样的索引获取其元素

    "${data.template_file.data_id.*.rendered[0]}"
    

    或通过功能元素()

    "${element(data.template_file.data_id.*.rendered, 0)}"
    
  • 5

    在撰写本文时,Terraform在其插值语言中没有广义投影功能 . “splat语法”是作为资源的特殊情况实现的 .

    虽然深层结构是可能的,但使用起来还不方便,所以建议仍然保持相对平坦 . 将来很可能会添加新的语言功能,使这种东西更有用 .

  • 10

    如果找到了使用模板渲染的工作解决方案来绕过 Map 问题列表:

    resource "aws_instance" "k8s_master" {
      count                       = "${var.master_count}"
      ami                         = "${var.ami}"
      instance_type               = "${var.instance_type}"
      vpc_security_group_ids      = ["${aws_security_group.k8s_sg.id}"]
      associate_public_ip_address = false
      subnet_id                   = "${element(var.subnet_ids,count.index % length(var.subnet_ids))}"
      user_data                   = "${file("${path.root}/files/user_data.sh")}"
      iam_instance_profile        = "${aws_iam_instance_profile.master_profile.name}"
    
      tags = "${merge(
        local.k8s_tags,
        map(
          "Name", "k8s-master-${count.index}",
          "Environment", "${var.environment}"
        )
      )}"
    }
    
    data "template_file" "k8s_master_names" {
      count    = "${var.master_count}"
      template = "${lookup(aws_instance.k8s_master.*.tags[count.index], "Name")}"
    }
    
    output "k8s_master_name" {
      value = [
        "${data.template_file.k8s_master_names.*.rendered}",
      ]
    }
    

    这将导致以下输出:

    k8s_master_name = [
        k8s-master-0,
        k8s-master-1,
        k8s-master-2
    ]
    

相关问题