【问题标题】:Tricky conversion of variable using locals in terraform在 terraform 中使用本地变量进行变量的棘手转换
【发布时间】:2021-07-17 03:30:50
【问题描述】:

为以下要求寻找可能的解决方案/方法。

我有一个如下的变量

nodes= {
  "type1" = { 
     max_size = 4
     tags = { "key1" = "value1" 
               "key2" = "value2"   }  # structure of tags can be changed as needed
}

然后我有一个本地人将引用此标签以在 asg 中使用

locals {
    for nodetype, nodeconfig in var.nodes
    ..
    ..
      node_tags = nodeconfig.tags
}

local.node_tags 必须采用以下最终形式

{
  "key" = "key1"
  "value" = "value1"
  "propagate_at_launch" = "true"
},
{
 "key" = "key2"
  ...
  ...
}

我需要在 asg 中使用这些

resource "aws_autoscaling_group" "nodes" {
  for_each = { for i in local.nodes ....
...
...
tags = each.value.node_tags

 }

类似的用例 - https://github.com/terraform-aws-modules/terraform-aws-autoscaling#tags

我在下面尝试了一些东西..看起来很丑而且不起作用。

locals {
    for nodetype, nodeconfig in var.nodes
    ..
    ..
      node_tags = {for i in nodeconfig.tags : "{i}" => { 
          "key" = keys(i),
          "value" = values(i),
          "propagate_at_launch" = "true"
           } 
     }
}

【问题讨论】:

    标签: amazon-web-services terraform terraform-provider-aws terraform0.12+


    【解决方案1】:

    这个呢:

    variable "nodes" {
    
        default = {
            "type1" = { 
               max_size = 4
               tags = { "key1" = "value1" 
                         "key2" = "value2"
                      } 
           },
           
            "type2" = { 
               max_size = 4
               tags = { "key11" = "value11" 
                        "key22" = "value22"
                      } 
           },       
        }
    }
    
    
    locals {
    
      node_tags = values(merge([for nodetype, nodeconfig in var.nodes: 
                     {for tag_key , tag_value in nodeconfig.tags:
                        "${nodetype}-${tag_key}-${tag_value}" => 
                                    {key = tag_key
                                     value = tag_value
                                    "propagate_at_launch" = "true"}
                     }                          
                  ]...))
    
    }
    
    
    
    
    output "test" {
    
      value = local.node_tags
    
    }
    

    给出:

    test = [
      {
        "key" = "key1"
        "propagate_at_launch" = "true"
        "value" = "value1"
      },
      {
        "key" = "key2"
        "propagate_at_launch" = "true"
        "value" = "value2"
      },
      {
        "key" = "key11"
        "propagate_at_launch" = "true"
        "value" = "value11"
      },
      {
        "key" = "key22"
        "propagate_at_launch" = "true"
        "value" = "value22"
      },
    ]
    
    

    【讨论】:

    • 太棒了,我真的没想到这个qn会有回应。我也让它工作了。我将下面的代码称为 each.value.tags ,我应该使用 values(each.value.tags) 代替。谢谢马尔辛,你是摇滚明星! ``` node_tags = {for k,v in nodeconfig.tags : "${k}-${v}" => { ..} ````
    • @Devopsnoob 没问题。很高兴它解决了:-)
    猜你喜欢
    • 2022-01-25
    • 2021-01-28
    • 2021-06-22
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 2018-10-08
    相关资源
    最近更新 更多