Terraform函数

Terraform函数

HCL

HCL(HashiCorp Configuration Language)作为核心语言

配置文件支持两种格式:

  1. HCL(HashiCorp Configuration Language), 文件名以 .tf 结尾
  2. JSON, 文件名以 .tf.json 结尾

表达式

条件表达式

1
condition ? true_val : false_val

for 表达式

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

for 表达式创建对象

1
2
3
4
5
output "vpc_ids" {
  value = {
    for k, v in alicloud_vpc.example : k => v.id    # 这个 => 就是赋值的意思
  }
}

splat 表达式

比用 for 表达式更简洁的循环方式


内置函数

Terraform 语言包括许多内置函数, 可以从表达式中调用这些函数来转换;
function(arg1,arg2)

数值类

计算函数

max(12, 54, 3)
min(12, 54, 3)
ceil(5.2) –> 6 # 向上取整
floor(4.5) –> 4 # 向下取整
pow(3, 2) –> 9 # 计算指数幂
abs(number)
log(16, 2) –> 4 # 除

parseint() # 进制转换, 解析字符串数字 为对应进制的整数
parseint(“100”, 10)
parseint(“FF”, 16) –> 255
parseint(“aA”, 62) –> 656

示例

1
2
3
4
5
6
output "my_func1" {
  value = {
    f1 = [max(1, 2, 3), min(7, 8, 9), parseint("111", 2)],
    f2 = [max([1, 2, 3]...), min([7, 8, 9]...), parseint("111", 2)]
  }
}

字符串

format() 按指定格式拼接字符串 format(“Hello, %s!”, “Terraform”)
lower()
upper()
title(“hello world”) # 首字母大写

join() 用分隔符将字符串列表拼接为一个字符串; join(", “, [“a”, “b”, “c”])
split() 将字符串按分隔符拆分为列表
substr() 从字符串中截取子串 substr(“hello world”, 0, 5)
replace() 替换字符串中的内容
chomp(“hello\r\n”) –> hello
endswith(string, suffix)

trimspace(“a b c”) –> “abc” # 清理空格
trimprefix(“dev-server”, “dev-”) –> server # 清除前面的字符
trimsuffix(“user.txt”, “.txt”) –> user # 清除后面的字符

1
2
3
4
5
6
7
8
9
output "my_func2" {
  value = {
    f1 = format("Hello %s!", "anliven"),
    f2 = join(":", ["name", "age", "title"]),
    f3 = replace("a=b=c", "=", "–"),
    f4 = split(",", "name,age,title")

  }
}

set-map

element() 通过索引获取列表中的某个元素 element([“a”, “b”, “c”], 1)
length() 获取列表、映射或字符串的长度 length([“a”, “b”, “c”])
lookup(map,key,default) 在映射中查找键的值,若不存在则返回默认值 lookup({a=“A”, b=“B”}, “c”, “C”)
keys() 返回映射的所有键组成的列表 keys({a=1, b=2})
values(map) 创建map中value的list

merge(map1,map2,map3) 合并多个映射或对象, 相同key会被最后覆盖 merge({a=1}, {b=2})
flatten() 将嵌套的列表展开为单层列表 flatten([[“a”], [“b”, “c”]])

alltrue() 判断元素中都是 true
anytrue() 判断元素中存在 true

chunklist(list, size) 按照指定size拆分list

compact(list) 去除list中的空元素
concat(list1, list2) 合并两个list
contains(list, value) 判断元素是否存在list中
distinct(list) 去除list中的重复元素

list[index] 根据index获取list中的元素

index(list, value) 返回value元素的index

sort([“z”, “b”, “a”]) # 排序

toset() # 将字符串列表转换为集合, 会丢弃 顺序 并删除重复元素

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

locals {
  list1 = [1, 2, 3]
  list2 = [7, 8, 9, null]
  list3 = ["a", "b", "c", "a", "b", "c"]
}
//内置Collection集合函数
output "my_func3" {
  value = {
    p1 = alltrue([true, false]) //判断元素中都是true
    p2 = anytrue([])            //判断元素中存在true

    p3  = chunklist(["a", "b", "c"], 2)      //按照指定size拆分list
    p4  = compact(local.list2)               //去除list中的空元素
    p5  = concat(local.list1, local.list2)   //合并两个list
    p7  = distinct(local.list3)              //去除list中的重复元素
    p8  = element(local.list3, 0)            //根据index获取list中的元素
    p9  = flatten([[["a", "b"], []], ["c"]]) //将多层list转换成单list
    p10 = index(local.list3, "c")            //返回value元素的index, 返回第一个匹配的索引

    p11 = length({ "a" = 1, "b" = 2 })                      //计算stringlistmap的长度
    p12 = lookup({ a = "111", b = "222" }, "c", "what?")    //检索map的key,不存在返口default
    p13 = merge({ a = "b", c = "d" }, { e = "f", c = "z" }) //合并map,相同key会被最后覆盖
    p14 = keys({ a = 1, c = 2, d = 3 })                     //创建map中key的list
    p15 = values({ a = 3, c = 2, d = 1 })                   //创建map中value的list

    p6  = contains(local.list2, 9)      # 判断元素是否存在list中
    p16 = contains(["us-east-1", "us-west-2"], var.region)

  }
}

正则

regex() # regex("[0-9]+”, “env42-prod”)
regexall() # 多次

编码和加解密

base64decode()
base64encode()
base64gzip()
csvdecode
jsondecode
jsonencode
textdecodebase64
textencodebase64
urlencode
yamldecode
yamlencode

brypt
bash64sha256
bash64sha512
filebase64sha256
filemd5
filesha1
filesha256
md5
sha1
sha256
sha512
uuid
uuidv5

路径和文件名

bashpath
dirname
pathexpand
basename
file() 读取文件的内容 value = file("${path.module}/config.json")
fileexists
fileexists
filebase64
templatefile() 动态渲染模板

templatefile

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
nginx.conf.tmpl 原始文件内容
server {
  listen 80;
  server_name ${domain};
}

output "nginx_config" {
  value = templatefile("${path.module}/nginx.conf.tmpl", {
    domain = "example.com"  # 变量渲染
  })
}

时间

formatdate
plantimestamp
timeadd
timecmp
timestamp

ip

cidrhost
cidrnetmask
cidrsubnet() # 子网计算
cidrsubnets()

cidrsubnet 从 CIDR 生成子网

cidrsubnet(原始网段, 掩码, 子网步长)

default = cidrsubnet(“172.20.0.0/16”, 8, 36) # 最终等于 172.20.36.0/24

理解

  1. 172.20.0.0/16
  2. 16+8=24
  3. 将 “172.20.0.0/16” 拆成 24 个子网
  4. 使用第 36 个子网

cidrsubnet(“10.0.0.0/16”, 8, 1) –> “10.0.1.0/24”
cidrsubnet(“10.0.0.0/16”, 8, 2) –> “10.0.2.0/24”

技巧

展开参数 …

把列表中的值作为多个参数传给函数时,可以在列表后加 …

1
2
# 等同于 min(1, 2, 3)
min([1, 2, 3]...)
Licensed under CC BY-NC-SA 4.0
转载或引用本文时请遵守许可协议,知会作者并注明出处
不得用于商业用途!
最后更新于 2025-09-20 00:00 UTC