Skip to content

0. 表达式

条件表达式

bash
condition ? true_val : false_val

condition 条件 (返回值true/false
true_val 条件为true的值
false_val 条件为false的值
condition ? true_val : false_val

condition 条件 (返回值true/false
true_val 条件为true的值
false_val 条件为false的值

比如:

var.region != "" ? var.region : "cn-beijing"
var.region != "" ? var.region : "cn-beijing"

作用是:如果变量 var.region 非空字符串,就使用它本身;否则使用默认值 "cn-beijing"

部分含义
var.region != ""判断变量 region 是否不等于空字符串
?如果条件成立(为 true)
var.region返回 region 的值
:否则(如果条件为 false)
"cn-beijing"返回字符串 "cn-beijing"

for表达式

json
[ for VAR in OBJECT : VAR]
[ for INDEX, VAR in OBJECT: "${INDEX}=${VAR}"]
[ for VAR in OBJECT : VAR]
[ for INDEX, VAR in OBJECT: "${INDEX}=${VAR}"]

借助for表达式可以对数据进行处理,生成新的数据对象;

splat表达式

splat 表达式提供了一种更简洁的方式来表达可以用for表达式执行的常见操作。

1. 引用命名值

Terraform 中定义了多种命名值,表达式中的每一个命名值都关联到一个具体的值,我们可以用单一命名值作为一个表达式,或是组合多个命名值来计算出一个新值。

命名值有如下种类:

  • <RESOURCE TYPE>.<NAME>:表示一个资源对象。凡是不符合后面列出的命名值模式的表达式都会被 Terraform 解释为一个托管资源。如果资源声明了 count 元参数,那么该表达式表示的是一个对象实例的 list。如果资源声明了 for_each 元参数,那么该表达式表示的是一个对象实例的 map

  • var.<NAME>:表示一个输入变量

  • local.<NAME>:表示一个局部值

  • module.<MODULE_NAME>.<OUTPUT_NAME>:表示一个模块的一个输出值

  • data.<DATA_TYPE>.<NAME>:表示一个数据源实例。如果数据源声明了 count 元参数,那么该表达式表示的是一个数据源实例 list。如果数据源声明了 for_each 元参数,那么该表达式表示的是一个数据源实例 map

  • path.module:表示当前模块在文件系统中的路径

  • path.root:表示根模块(调用 Terraform 命令行执行的代码文件所在的模块)在文件系统中的路径

  • path.cwd:表示当前工作目录的路径。一般来说该路径等同于 path.root,但在调用 Terraform 命令行时如果指定了代码路径,那么二者将会不同。

2. 局部命名值

在某些特定表达式或上下文当中,有一些特殊的命名值可以被使用,他们是局部命名值。几种比较常见的局部命名值有:

  • count.index:表达当前 count 下标序号
  • each.key:表达当前 for_each 迭代器实例
  • self:在预置器中指代声明预置器的资源

https://www.cloudbolt.io/terraform-best-practices/terraform-for-loops/