类型图的变量插值

时间:2019-06-23 11:26:40

标签: terraform

已升级到terraform v0.12.2,大多数事情都无法直接进行。 (很糟糕,我没有在升级前检查此页面:https://www.terraform.io/upgrade-guides/0-12.html

无论如何,大多数问题都已解决,但是map类型的变量插值仍然无法正常工作。在v012.x之前的版本中,这将非常完美:

security_groups.tf

// SecurityGroup: default access
resource "aws_security_group" "default" {
  count        = "${length(var.s_zones)}"
  vpc_id       = "${element(aws_vpc.vpcs.*.id, count.index)}"
  name         = "${var.vpc_names[count.index]}-default"

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["${var.vpn_cidrs["lan"]}",
                   "${var.vpn_cidrs["ovp"]}"]
    description = "SSH from vpn"
  }
}

vars.tf

// Variable: vpn_cidrs
variable "vpn_cidrs" {
  type = "map"
  default = {
    lan = ["10.0.11.0/28", "10.0.12.0/28"]
    ovp = ["10.1.13.0/28", "10.1.14.0/28"]
  }
}

对于v0.12.2,它返回:

  

错误:属性值类型错误

     资源中../../modules/vpc/security_groups.tf第55行的

  “ aws_security_group”“默认”:55:cidr_blocks =   [“ $ {var.vpn_cidrs [” lan“]}”,

     

属性“ cidr_blocks”的值不合适:元素0:字符串   必填。

我尝试使用新的构造函数:

// Variable: vpn_cidrs
variable "vpn_cidrs" {
  type = map(string)
  default = {
    lan1 = "10.0.11.0/28",
    lan2 = "10.0.12.0/28",
    ovp1 = "10.1.13.0/28",
    ovp2 = "10.1.14.0/28",
  }
}

但是后来我不知道如何在模块中将其用于SG规则。有人知道我缺少什么或如何解决?自从星期五晚上以来,真的很卡住。任何有针对性的示例代码都将受到高度赞赏。

-S

1 个答案:

答案 0 :(得分:1)

"${var.vpn_cidrs["lan"]}"返回列表 ["10.0.11.0/28", "10.0.12.0/28"],但错误消息状态要求为字符串

尝试使用"${join(", ", var.vpn_cidrs["lan"])}"生成字符串10.0.11.0/28, 10.0.12.0/28

要生成两个列表 vpn_cidrs [“ lan”] vpn_cidrs [“ ovp”] 的组合列表,请使用concat()函数(请参见here

cidr_blocks = "${concat(var.vpn_cidrs["lan"], var.vpn_cidrs["ovp"])}"

这会生成["10.0.11.0/28", "10.0.12.0/28", "10.1.13.0/28", "10.1.14.0/28"]