Terraform 使用局部变量而不是输入变量动态创建地图

kam*_*dra 1 terraform terraform-provider-aws terraform0.12+

要求:我有一堆 EC2。我根据标签对其进行分组。在此示例中,组总数 = 4,每个组有 7 个 EC2:1 个父级 - 6 个子级。在这里我分享一个命名很重要的孩子的代码。

工作代码:这里我分享子 EC2 代码,该代码与名为 :ws_to_Child_Node_name_map_count 的地图类型的输入变量完美配合。现在我希望它是可扩展的(父子数量),我希望使用“在本地动态创建的地图”而不是使用输入变量。主.tf

resource "aws_instance" "ec2_instance_child" {
  count                   = var.ec2_instance_child_count
  tags = {
    NodeName       = "${lookup(var.ws_to_Child_Node_name_map_count, count.index+1, 99)}"
  }
}
Run Code Online (Sandbox Code Playgroud)

变量.tf

variable "ws_to_Child_Node_name_map_count"  {
  type = map
  default = {
      "1"="1"
      "2"="2"
      "3"="3"
      "4"="4"
      "5"="5"
      "6"="6"
      "7"="1"
      "8"="2"
      "9"="3"
      "10"="4"
      "11"="5"
      "12"="6"
      "13"="1"
      "14"="2"
      "15"="3"
      "16"="4"
      "17"="5"
      "18"="6"
      "19"="1"
      "20"="2"
      "21"="3"
      "22"="4"
      "23"="5"
      "24"="6"
    }
  }
variable "ec2_instance_child_count" {
  description = "Number of instances to run"
  default     = "24"   #number of group *6
}
Run Code Online (Sandbox Code Playgroud)

上面显示的地图我想使用两个变量动态创建,将来我将不再是常量。

variable "child_count" {
  default     = 6
}

variable "group_count" {
  default     =  4
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ins 5

您在此处编写的映射表似乎描述了模运算的一种变体,该变体从一而不是零开始计数。

如果这是您的意图,您可以使用表达式动态计算此值,而不是生成单独的映射表。

variable "child_count" {
  default     = 6
}

variable "group_count" {
  default     =  4
}

resource "aws_instance" "example" {
  count = var.child_count * var.group_count

  tags = {
    # The % symbol is Terraform's modulo operator
    NodeName = ((count.index - 1) % var.child_count) + 1
  }
}
Run Code Online (Sandbox Code Playgroud)

上面表达式中的- 1and+ 1允许您使用从一开始的计数而不是从零开始的计数。对于零基础的,这将减少到count.index % var.child_count


如果出于某种原因您仍然希望将映射表设置为本地值,则可以在表达式中执行上述for计算

locals {
  lookup_table = {
    for n in range(1, (var.child_count * var.group_count) + 1) :
    n => ((n - 1) % var.child_count) + 1
  }
}
Run Code Online (Sandbox Code Playgroud)

这使用range函数从 1 计数到总计数,然后生成一个映射,该结果的每个元素都有一个元素,其中该值是我在resource上面的块中显示的相同模计算的结果。

从 Terraform 0.12 开始,永远不需要使用null_resourceornull_data_source作为转换列表的技巧,因为for表达式语法现在可以满足相同的用例。