【问题标题】:How to approach repeatable items in Terraform如何在 Terraform 中处理可重复的项目
【发布时间】:2017-08-11 14:27:45
【问题描述】:

假设我需要在 terraform 中配置大量 vpc 子网。每个子网都有一个 cidr、一个名称和一个可用区。因此,在其他配置管理工具中,我会执行以下操作:

[  
   {  
      "name":"subnet1",
      "cidr":"10.0.0.1/24",
      "az":"us-west-1a"
   },
   {  
      "name":"subnet2",
      "cidr":"10.0.0.2/24",
      "az":"us-west-1b"
   }
]

然后遍历那个数组。

据我所知,Terraform 没有数组/对象的概念。因此,对于单个属性的数组,我只使用一个列表项:

subnets: ["10.0.0.1/24","10.0.0.2/24"]

但这不允许我命名或放置我想要的子网。 我知道我也可以在 Terraform 中使用多个列表,例如:

subnet_names: ["subnet1", "subnet2"]
subnets: ["10.0.0.1/24","10.0.0.2/24"]
subnet_az: ["us-west-1a", "us-west-1b"]

但这让我觉得混乱且违反直觉。我看到的最后一个选项是将所有内容混合成一个丑陋的字符串列表,然后在 Terraform 中将它们分开:

things: ["subnet1__10.0.0.1/24__us-west-1a","subnet2__10.0.0.2/24__us-west-2a"]

但这太丑了。

如何在 Terraform 中处理数组/对象类型的重复?现在我刚刚明确定义了我所有的东西,这导致一个简单的 vpc 定义长达 300 行:-(

【问题讨论】:

标签: terraform


【解决方案1】:

如您所见,目前 Terraform 不支持您在此处尝试创建的结构化数据列表。

如您在问题中所示,拥有多个平面字符串列表是此问题的一种常见解决方案。它有效,但正如您所见,以这种方式跟踪哪些值属于一起有点违反直觉。

另一种可能产生更具可读性和可维护性的结果的替代方法是将您的 aws_subnet 资源分解到一个模块中,该模块负责处理所有子网始终相同的元素。然后,您可以为每个子网实例化一次模块,只提供不同的值:

module "subnet1" {
  source = "./subnet"

  name = "subnet1"
  cidr = "10.0.0.1/24"
  az   = "us-west-1a"
}

module "subnet2" {
  source = "./subnet"

  name = "subnet2"
  cidr = "10.0.0.2/24"
  az   = "us-west-1b"
}

在许多情况下,AZ 和 CIDR 块之间存在某种系统关系。如果这对你来说是真的,那么你也可以使用你的模块来编码这些编号规则。例如,在您的 subnet 模块中:

variable "region_network_numbers" {
  default = {
    "us-west-1" = 0
    "us-east-1" = 1
    "us-west-2" = 2
  }
}

variable "az_network_numbers" {
  default = {
    a = 1
    b = 2
  }
}

variable "base_cidr_block" {
  default = "10.0.0.0/8"
}

variable "az" {
}

data "aws_availability_zone" "selected" {
  name = "${var.az}"
}

resource "aws_subnet" "main" {
  cidr_block = "${cidrsubnet(cidrsubnet(var.base_cidr_block, 8, var.region_network_numbers[data.aws_availability_zone.selected.region]), 4, var.az_network_numbers[data.aws_availability_zone.selected.name_suffix])}"
  # ...
}

有了这个,只需向模块提供az 参数就足够了,cidrname 从 AZ 名称系统地生成。这与 the aws_availability_zone data source 示例中所示的一般概念相同,并且 Terraform 存储库本身中有 a more complete, elaborate example of this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 2019-08-17
    • 2019-09-24
    • 2018-02-04
    • 2018-05-19
    相关资源
    最近更新 更多