首页 > 解决方案 > 如何在 terraform for 循环中使用 if/else 语句

问题描述

是否可以在 terraform 中执行此操作?


for i in range(10):
    if var != "" and i > 2:
        # Something to do
    elif var != "" and i < 2:
        # Something to do
    else:
        # Something else to do

我想要实现的是创建列表,但我需要 for 循环中的 if/else 语句。到目前为止,我取得的成就是:


for i in range(10):
    if var != "":
        # Something to do

标签: loopsfor-loopif-statementterraform

解决方案


很难回答这个问题,因为您似乎已经决定了一个问题的解决方案,但您实际上并没有说明潜在的问题是什么。不过,我会尽量直接回答你的问题。

在考虑处理 Terraform 中的问题时,最好从使用其他值从表达式构造值的角度进行思考,而不是编写命令式语句来描述如何构造这些值。在这种情况下,我会尝试将您的问题分为两部分:

  1. var当设置为空字符串与其他情况时,做一些不同的事情。
  2. 在构造列表的前两个元素时做一些不同的事情,但仅限于非空字符串的情况。

其中第一个听起来像一个条件表达式,因为您想根据一个条件在两个可能的结果之间进行选择:

locals {
  example = (
    var != "" ?
    (expression for normal case) :
    (expression for empty case)
  )
}

您没有包含有关在“空情况”中应该发生什么的详细信息,但是由于您建议您使用命令式语言中的循环,我认为您的问题最好映射到 Terraform 中的for表达式

locals {
  example = (
    var != "" ?
    (expression for normal case) :
    [ for i in range(10) : (something based on i) ]
  )
}

“正常情况”具有根据索引是否小于 2 执行不同操作的额外细节:

locals {
  example = (
    var != "" ?
    [
      for i in range(10) : (
        i < 2 ?
        (something based on i) :
        (something else based on i)
      )
    ]
    [ for i in range(10) : (something based on i) ]
  )
}

(您的原始问题使用i < 2and i > 2,而我上面的答案承认使用i < 2and代替;我假设这种解释更有可能,但是如果您确实需要做一些特殊的事情,而这与更少的情况不同,则i >= 2此答案将不起作用i == 2大于或大于。)

如果没有更多关于您要解决的潜在问题的详细信息,我无法进一步回答这个问题,但是由于您似乎对 Python 很熟悉,我确实为您提供了两个通用映射,可以帮助您从 Python 进行翻译- Terraform-ish 方法的 ish 方法:

在这两种情况下,这些构造都具有相似的功能,但语法不同。如果您觉得先在 Python 中探索更舒服,那么我建议您使用这些特定的 Python 构造来构建您的解决方案,然后您应该能够将结果转换为等效的 Terraform 表达式。


推荐阅读