0. 表达式
条件表达式
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表达式
[ 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/