表达式用于引用或计算配置中的值,最简单的表达式是文字表达式,如 "hello world" 或 5。Terraform支持多种表达式,包括运算符、条件表达式以及丰富的内置函数。
通过 terraform console 命令可以打开一个交互式的控制台,您可以使用该控制台进行表达式及内置函数的体验和测试。
运算符
运算符是执行特定的数学或逻辑操作的服务,Terraform支持以下类型的运算符:
| 运算符类型 | 说明 | 包含运算符 |
|---|---|---|
| 算术运算符 | 操作数和结果都为数字类型 | +、-(减法)、*、/、%、-(负数) |
| 关系运算符 | 操作数为任意类型,结果为布尔值 | ==、!= |
| 比较运算符 | 操作数为数字类型,结果为布尔值 | >、>=、<、<= |
| 逻辑运算符 | 操作数和结果都为布尔类型 | | |、&&、! |
在表达式中使用多个运算符时,将按照以下优先级从高到低进行求解:
!、- (负数)
*、/、%
+、- (减法)
>、>=、<、<=
==、!=
&&
||
条件表达式
条件表达式采用布尔表达式的值进行二选一,其语法可表示为:
condition ? true_value : false_value该语句含义:如果 condition 为 true,结果为 true_value,否则为 false_value。
注意:条件表达式的结果可以是任意类型,但 true_value 和 false_value 的类型必须保持一致。
条件表达式的常见用法是使用默认值替换无效值,示例如下:
var.a != "" ? var.a : "default-a"该语句含义:如果 var.a 的值不为空,则返回 var.a 的值,否则返回默认值 "default-a"。
for表达式
for表达式用于遍历集合类型(map、list、set)中的每个元素,并对元素进行处理,最后将结果输出为一个新的集合类型。
for表达式的输出结果类型由所使用的括号类型决定:
使用 [ 和 ]:生成一个列表
使用 { 和 }:生成一个映射/对象
示例1:列表元素转换(输出列表)
假设列表 var.mylist 的值为 ["AA", "BBB", "CCCC"],通过for表达式将每个字符串元素转换为小写,输出列表:
> [for str in var.mylist : lower(str)]
[
"aa",
"bbb",
"cccc",
]示例2:列表转映射(输出映射)
基于上述 var.mylist,通过for表达式生成映射,映射关系通过 => 确定(键为原列表元素,值为小写后的元素):
> {for str in var.mylist : str => lower(str)}
{
"AA" = "aa"
"BBB" = "bbb"
"CCCC" = "cccc"
}示例3:映射键值转换
假设映射 var.mymap 的值为 {element1="aaa", element2="bbb", element3="ccc"},通过for表达式将映射中每个值转换为大写:
> {for key, value in var.mymap : key => upper(value)}
{
"element1" = "AAA"
"element2" = "BBB"
"element3" = "CCC"
}示例4:带条件过滤的for表达式
通过 if 语句对元素进行过滤,仅处理满足条件的元素。例如,遍历列表 var.list,仅将长度 ≥3 的元素转换为大写:
> [for str in var.list : upper(str) if length(str) >= 3]
[
"BBB",
"CCCC",
]参考资料:https://www.terraform.io/docs/configuration/expressions.html