【问题标题】:How to create a Terraform with if, else, elsif statement?如何使用 if、else、elsif 语句创建 Terraform?
【发布时间】:2019-08-28 13:43:39
【问题描述】:

我正在设置一个 terraform 模块来创建一个极光集群。
我需要有一个跨区域复制的选项,因此我需要确定与源区域相关的副本区域。
有什么办法可以在 terraform 中做一个多选项条件?

【问题讨论】:

    标签: terraform terraform-provider-aws


    【解决方案1】:

    这是使用 coalesce() 函数的一种方式:

    locals{
      prod = "${var.environment == "PROD" ? "east" : ""}"
      prod2 = "${var.environment == "PROD2" ? "west2" : ""}"
      nonprod = "${var.environment != "PROD" && var.environment != "PROD2" ? "west" : ""}"
      region = "${coalesce(local.prod,local.prod2, local.nonprod)}"
    }
    

    【讨论】:

      【解决方案2】:
      locals {
        test = "${ condition ? value : (elif-condition ? elif-value : else-value)}"
      }
      

      对于更直接的“if-elif-else”方法,您可以将 if 简写与其他简写一起嵌入以产生类似的效果。如果您的用例也在 for 循环中,您也可以这样做:

      locals {
        test = {
          for i in list : 
            key => "${ condition ? value : (elif-condition ? elif-value : else-value)}"
        }
      }
      

      适用于任何使用“${}”语法的情况

      【讨论】:

        【解决方案3】:

        您可以尝试只使用maplookup。示例:

        /* In your variables.tf */
        variable "region_mapping" {
          description = "mapping for cross-region replication"
          default = {
            "us-east-1" = "us-east-2",
            "us-west-1" = "us-west-2"
          }
        }
        
        /* Then create use lookup to get the replication region from the deployment region */
        resource "example" "example" {
          region = "${lookup(var.region_mapping, var.region)}"
        }
        

        如果var.region 是您部署当前集群的位置,并且其值为例如us-east-1,则查找将返回us-east-2 作为您应该部署副本的区域。

        根据您的需要进行调整。

        【讨论】:

        • 这有帮助,我最终使用 list 而不是 map 我需要 count.index 来查找值,谢谢@Esteban Garcia
        【解决方案4】:

        从 terraform 0.12 开始,您可以使用地图来伪造开关,例如

        locals {
          environments = {
            prod = "east",
            prod2 = "west2"
          }
          
          region = lookup(environment_region, lower(var.environment), "west")
        }
        

        这样做的好处是,如果结果更复杂,您可以从地图返回对象/列表,而不是简单的字符串。

        例如,我有一个集中命名模块,它根据资源类型等根据不同的规则组成名称。

        locals {
          parts_map = {
            # NB Location should always be last to ensure geo-separation of names
            prefix = [ local.type.code, var.name, var.role, var.environment, module.location.code ]
            suffix = [ var.name, var.role, var.environment, local.type.code, module.location.code ]
            mode3  = [ var.name, local.type.code, var.role, var.environment, module.location.code ]
        }
        
        parts = compact(local.parts_map[local.type.order])
        

        【讨论】:

          【解决方案5】:

          Terraform

          但是,您可以在 Terrafom Conditions 中使用经典的布尔逻辑

          【讨论】:

            【解决方案6】:

            我花了几个小时来处理这个问题,试图创建数组来满足我的要求。根据@MrJ1m0thy 的回答,我创建了这个三元组,其中包含多个模拟 if / elseif / else 的选项:

            conditioning_a != "condition_a" ? "value1" : (conditioning_b == "condition_b" ? "value_b" : (conditioning_c == "condition_c" ? "value_c" : (conditioning_d == "condition_d" ? "value_d" : "value2")))
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-01-16
              • 1970-01-01
              • 1970-01-01
              • 2019-10-03
              • 2016-10-13
              • 2021-12-21
              • 2012-02-28
              • 2016-09-15
              相关资源
              最近更新 更多