Terraform函数
HCL
HCL(HashiCorp Configuration Language)作为核心语言
配置文件支持两种格式:
- HCL(HashiCorp Configuration Language), 文件名以 .tf 结尾
- JSON, 文件名以 .tf.json 结尾
表达式
条件表达式
condition ? true_val : false_valfor 表达式
[ for VAR in OBJECT : VAR]
[ for INDEX, VAR in OBJECT: "${INDEX}=${VAR}"]for 表达式创建对象
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
示例
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 # 清除后面的字符
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() # 将字符串列表转换为集合, 会丢弃 顺序 并删除重复元素
示例
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 }) //计算string、list、map的长度
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
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
理解
- 172.20.0.0/16
- 16+8=24
- 将 "172.20.0.0/16" 拆成 24 个子网
- 使用第 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"
技巧
展开参数 ...
把列表中的值作为多个参数传给函数时,可以在列表后加 ...
# 等同于 min(1, 2, 3)
min([1, 2, 3]...)