Terraform函数

  1. 数值计算函数
    1. 求绝对值abs()
    2. 求大于等于该数值的最小整数ceil()
    3. 求小于等于该数值的最大整数floor()
    4. 求对数log()
    5. 求指数pow()
    6. 求最大值max()
    7. 求最小值min()
    8. 字符串转换为整数parseint()
  2. 字符串函数
    1. 删除字符串尾部的换行符chomp()
    2. 格式化输出format()
    3. 遍历格式化列表formatlist()
    4. 字符串连接join()
    5. 转换为小写lower()
    6. 转换为大写upper()
    7. 首字母大写title()
    8. 字符串替换replace()
    9. 字符串分割split()
    10. 字符串反转strrev()
    11. 字符串截取substr()
    12. 去除头尾某些特定字符
    13. 正则匹配
  3. 集合类函数
    1. 判断列表是否全为真alltrue()
    2. 判断列表是否有真anytrue()
    3. 列表分片chunklist()
    4. 返回第一个非空元素coalesce()
    5. 返回第一个非空列表coalescelist()
    6. 从字符串列表里把空的去掉compact()
    7. 连接多个列表concat()
    8. 判断是否存在某个元素contains()
    9. 去除重复元素distinct()
    10. 获取列表的某个元素element()
    11. 把内嵌的列表都展开成一个列表flatten()
    12. 获取列表中的元素的索引值index()
    13. 获取map的所有key值keys()
    14. 获取map的value值values()
    15. 获取字符串、列表、map等的长度length()
    16. 根据key值在map中找到对应的value值lookup()
    17. 对key值进行匹配matchkeys()
    18. map合并merge()
    19. 取集合的一个元素one()
    20. 生成顺序列表range()
    21. 反转列表reverse()
    22. 对set求交集setintersection()
    23. 列出所有组合可能setproduct()
    24. set的减法setsubtract()
    25. set的加法setunion()
    26. 截取列表部分slice()
    27. 对列表中的字符串进行排序sort()
    28. 求和sum()
    29. 对map的key和value进行换位transpose()
    30. 根据key和value的列表按一对一关系生成map集合zipmap()
  4. 加解密函数
    1. base64加解密
    2. md5签名
    3. 生成UUID
    4. csv文本解析
    5. json编解码
    6. URL编码
    7. YAML编解码
    8. 文件处理
  5. 时间函数
    1. 时间格式化formatdate()
    2. 时间加减timeadd()
  6. 类型转换函数
    1. 判断表达式是否会执行出错can()
    2. 判断值类型type()
    3. 类型转换函数

为了在表达式上更加灵活地方便计算,Terraform提供了大量的内置函数。
Terraform目前不支持自定义函数,只能使用自带的。
如下整理出Terraform自带的内置函数列表,方便查阅。

执行terraform console命令进入到Terraform Console界面,可以执行并验证如下函数的执行效果。

# 执行terraform console命令进入到Terraform Console界面
$ terraform console
>  

数值计算函数

求绝对值abs()

> abs(-12)
12
> abs(0)
0

求大于等于该数值的最小整数ceil()

> ceil(1)
1
> ceil(1.1)
2
> ceil(1.9)
2

求小于等于该数值的最大整数floor()

> floor(6)
6
> floor(6.9)
6
> floor(5.34)
5

求对数log()

> log(16,2)
4
> log(9,3)
2.0000000000000004
>

求指数pow()

> pow(6,0)
1
> pow(6,1)
6
> pow(6,2)
36

求最大值max()

> max(2,98,75,4)
98

求最小值min()

> min(0,23,9,-1)
-1

字符串转换为整数parseint()

第二参数表示需要转换成的目标进制

> parseint("16", 10)
16
> parseint("16", 16)
22
> parseint("FF", 16)
255
> parseint("1010", 2)
10

字符串函数

删除字符串尾部的换行符chomp()

> chomp("www.baidu.com")
"www.baidu.com"
> chomp("www.baidu.com\n")
"www.baidu.com"
> chomp("www.baidu.com\n\n")
"www.baidu.com"
> chomp("www.baidu.com\n\n\r")
"www.baidu.com"
> chomp("www.baidu.com\n\n\ra") # 这里字符串尾部没有换行符,中间的换行符不会被删除
<<EOT
www.baidu.com

a
EOT
>

格式化输出format()

> format("Hi, %s", "ABC")
"Hi, ABC"
> format("My name is %s, i'm %d", "zhangsan", 18)
"My name is zhangsan, i'm 18"
> format("The result is %.2f", 3)
"The result is 3.00"
> format("The result is %.2f", 3.1415)
"The result is 3.14"
> format("The result is %8.2f", 3.1415)
"The result is     3.14"

遍历格式化列表formatlist()

参数可以是列表list,也可以是单个变量

> formatlist("My name is %s, i'm %d", ["zhangsan","lisi","wangwu"], [12,13,14])
tolist([
  "My name is zhangsan, i'm 12",
  "My name is lisi, i'm 13",
  "My name is wangwu, i'm 14",
])

字符串连接join()

> join(".", ["www","baidu","com"])
"www.baidu.com"
> join(". ", ["www","baidu","com"])
"www. baidu. com"
>

转换为小写lower()

> lower("WWW.BAIDU.COM")
"www.baidu.com"

转换为大写upper()

> upper("www.baidu.com")
"WWW.BAIDU.COM"

首字母大写title()

> title("www.baidu.com")
"Www.Baidu.Com"

字符串替换replace()

> replace("www.baidu.com","baidu","google")
"www.google.com"
> replace("hello larry","/la.*y/","google") # 这里使用了正则表达式
"hello google"

字符串分割split()

> split(".","www.baidu.com")
tolist([
  "www",
  "baidu",
  "com",
])

字符串反转strrev()

> strrev("baidu")
"udiab"
>

字符串截取substr()

> substr("baidu",0,3)
"bai"
> substr("baidu",-4,-1) # 编号为负数时最后一个字符的编号为-1
"aidu"

去除头尾某些特定字符

trim()函数只要有特定字符就删除:

> trim("?!what?!!!!!","?!")
"what"
> trim("abaaaaabbLarry Dengaab", "ab")
"Larry Deng"

trimprefix()函数去除头部特定字符串:

> trimprefix("?!what?!!!!!", "?!")
"what?!!!!!"

trimsuffix()函数去除尾部特定字符串:

> trimsuffix("?!what?!!!!!", "!!!")
"?!what?!!"

trimspace()函数去除头尾的空格、换行等空串:

> trimspace(" Larry Deng \n\r")
"Larry Deng"

正则匹配

regex()函数匹配第一个:

> regex("[a-z\\.]+", "2021www.pkslow.com2022larry deng 31415926")
"www.pkslow.com"

regexall()函数匹配所有:

> regexall("[a-z\\.]+", "2021www.pkslow.com2022larry deng 31415926")
tolist([
  "www.pkslow.com",
  "larry",
  "deng",
])

集合类函数

判断列表是否全为真alltrue()

空列表直接返回true,列表元素只能是bool类型或者对应的字符串。

> alltrue([true, "true"])
true
> alltrue([true, "true", false])
false
> alltrue([])
true
> alltrue([1]) # 列表元素不是bool类型或者不是bool类型对应的字符串,返回false
╷
│ Error: Invalid function argument
│ 
│   on <console-input> line 1:
│   (source code not available)
│ 
│ Invalid value for "list" parameter: element 0: bool required.

判断列表是否有真anytrue()

只要列表元素有一个为真就返回true,空列表返回false。

> anytrue([true])
true
> anytrue([true, false])
true
> anytrue([false, false])
false
> anytrue([])
false

列表分片chunklist()

根据分片数来对列表进行切分。

> chunklist(["www", "pkslow", "com", "Larry", "Deng"], 3)
tolist([
  tolist([
    "www",
    "pkslow",
    "com",
  ]),
  tolist([
    "Larry",
    "Deng",
  ]),
])

返回第一个非空元素coalesce()

> coalesce("", "a", "b")
"a"
> coalesce("", "", "b")
"b"

返回第一个非空列表coalescelist()

> coalescelist([], ["pkslow"])
[
  "pkslow",
]

从字符串列表里把空的去掉compact()

> compact(["", "www", "", "pkslow", "com"])
tolist([
  "www",
  "pkslow",
  "com",
])

连接多个列表concat()

> concat([1, 2, 3], [4, 5, 6])
[
  1,
  2,
  3,
  4,
  5,
  6,
]

判断是否存在某个元素contains()

> contains(["www", "pkslow", "com"], "pkslow")
true
> contains(["www", "pkslow", "com"], "Larry")
false

去除重复元素distinct()

> distinct([1, 2, 2, 1, 3, 8, 1, 10])
tolist([
  1,
  2,
  3,
  8,
  10,
])

获取列表的某个元素element()

循环访问数组元素,不会存在索引越界的问题。

> element(["a", "b", "c"], 1)
"b"
> element(["a", "b", "c"], 2)
"c"
> element(["a", "b", "c"], 3)
"a"
> element(["a", "b", "c"], 4)
"b"

把内嵌的列表都展开成一个列表flatten()

> flatten([1, 2, 3, [1], [[6]]])
[
  1,
  2,
  3,
  1,
  6,
]

获取列表中的元素的索引值index()

> index(["www", "pkslow", "com"], "pkslow")
1

获取map的所有key值keys()

> keys({name="Larry", age=18, webSite="www.pkslow.com"})
[
  "age",
  "name",
  "webSite",
]

获取map的value值values()

> values({name="Larry", age=18, webSite="www.pkslow.com"})
[
  18,
  "Larry",
  "www.pkslow.com",
]

获取字符串、列表、map等的长度length()

> length("pkslow")
6
> length([])
0
> length(["pkslow"])
1
> length(["pkslow", "com"])
2
> length({pkslow = "com"})
1

根据key值在map中找到对应的value值lookup()

lookup(map, key, default)根据key值在map中找到对应的value值,如果没有则返回默认值。

> lookup({name = "Larry", age = 18}, "age", 1)
18
> lookup({name = "Larry", age = 18}, "myAge", 1)
1

对key值进行匹配matchkeys()

matchkeys(valueslist, keyslist, searchset)对key值进行匹配,匹配到key值后,返回对应的Value值。

> matchkeys(["a", "b", "c", "d"], [1, 2, 3, 4], [2, 4])
tolist([
  "b",
  "d",
])

map合并merge()

merge()合并map,key相同的会被最后的覆盖。

> merge({name = "Larry", webSite = "pkslow.com"}, {age = 18})
{
  "age" = 18
  "name" = "Larry"
  "webSite" = "pkslow.com"
}
> merge({name = "Larry", webSite = "pkslow.com"}, {age = 18}, {age = 13})
{
  "age" = 13
  "name" = "Larry"
  "webSite" = "pkslow.com"
}

取集合的一个元素one()

one()取集合的一个元素,如果为空则返回null;如果只有一个元素,则返回该元素;如果多个元素,则报错。

> one([])
null
> one(["pkslow"])
"pkslow"
> one(["pkslow", "com"])
╷
│ Error: Invalid function argument
│ 
│   on <console-input> line 1:
│   (source code not available)
│ 
│ Invalid value for "list" parameter: must be a list, set, or tuple value with either zero or one elements.

生成顺序列表range()

存在三个生成顺序列表的range()函数:
range(max)range(start, limit)range(start, limit, step)

> range(3)
tolist([
  0,
  1,
  2,
])
> range(1, 6)
tolist([
  1,
  2,
  3,
  4,
  5,
])
> range(1, 6, 2)
tolist([
  1,
  3,
  5,
])

反转列表reverse()

> reverse([1, 2, 3, 4])
[
  4,
  3,
  2,
  1,
]

对set求交集setintersection()

> setintersection([1, 2, 3], [2, 3, 4], [2, 3, 6])
toset([
  2,
  3,
])

列出所有组合可能setproduct()

> setproduct(["Larry", "Harry"], ["Deng", "Potter"])
tolist([
  [
    "Larry",
    "Deng",
  ],
  [
    "Larry",
    "Potter",
  ],
  [
    "Harry",
    "Deng",
  ],
  [
    "Harry",
    "Potter",
  ],
])

set的减法setsubtract()

> setsubtract([1, 2, 3], [3, 4])
toset([
  1,
  2,
])

set的加法setunion()

> setunion([1, 2, 3], [3, 4])
toset([
  1,
  2,
  3,
  4,
])
> setunion(setsubtract(["a", "b", "c"], ["a", "c", "d"]), setsubtract(["a", "c", "d"], ["a", "b", "c"]))
toset([
  "b",
  "d",
])

截取列表部分slice()

slice(list, startindex, endindex)截取列表部分,包括startindex,但不包括endindex,下标从0开始。

> slice(["a", "b", "c", "d", "e"], 1, 4)
[
  "b",
  "c",
  "d",
]

对列表中的字符串进行排序sort()

sort()对列表中的字符串进行排序,要注意如果输入的是数字,会先转化为字符串再排序。

> sort(["larry", "pkslow", "com", "deng"])
tolist([
  "com",
  "deng",
  "larry",
  "pkslow",
])
> sort([3, 6, 1, 9, 12, 79, 22]) # 从排序结果看按首字符做升序,所以是字符串排序
tolist([
  "1",
  "12",
  "22",
  "3",
  "6",
  "79",
  "9",
])

求和sum()

> sum([3, 1.2, 9, 17.3, 2.2])
32.7

对map的key和value进行换位transpose()

> transpose({"a" = ["1", "2"], "b" = ["2", "3"]})
tomap({
  "1" = tolist([
    "a",
  ])
  "2" = tolist([
    "a",
    "b",
  ])
  "3" = tolist([
    "b",
  ])
})

根据key和value的列表按一对一关系生成map集合zipmap()

> zipmap(["age", "name"], [18, "Larry Deng"])
{
  "age" = 18
  "name" = "Larry Deng"
}

加解密函数

base64加解密

> base64encode("pkslow") # Base64加密
"cGtzbG93"
> base64decode("cGtzbG93") # Base64解密
"pkslow"
> textencodebase64("pkslow", "UTF-8")
"cGtzbG93"
> textdecodebase64("cGtzbG93", "UTF-8")
"pkslow"

md5签名

> md5("www.baidu.com")
"dab19e82e1f9a681ee73346d3e7a575e"

生成UUID

> uuid()
"17c8fde5-7982-c3ca-8cef-016498cefed6"

csv文本解析

> csvdecode("seq,name,age\n1,larry,18\n2,pkslow,3\n3,Jeremy,29")
tolist([
  {
    "age" = "18"
    "name" = "larry"
    "seq" = "1"
  },
  {
    "age" = "3"
    "name" = "pkslow"
    "seq" = "2"
  },
  {
    "age" = "29"
    "name" = "Jeremy"
    "seq" = "3"
  },
])

json编解码

> jsonencode({"name"="Larry", "age"=18}) # json编码
"{\"age\":18,\"name\":\"Larry\"}"
> jsondecode("{\"age\":18,\"name\":\"Larry\"}") # json解码
{
  "age" = 18
  "name" = "Larry"
}

URL编码

> urlencode("Larry Deng/a/:/./@")
"Larry+Deng%2Fa%2F%3A%2F.%2F%40"

YAML编解码

> yamlencode({"a":"b", "c":"d"}) # yaml编码
<<EOT
"a": "b"
"c": "d"

EOT
> yamlencode({"foo":[1, 2, 3], "bar": "baz"}) # yaml编码
<<EOT
"bar": "baz"
"foo":
- 1
- 2
- 3

EOT
> yamlencode({"foo":[1, {"a":"b","c":"d"}, 3], "bar": "baz"}) # yaml编码
<<EOT
"bar": "baz"
"foo":
- 1
- "a": "b"
  "c": "d"
- 3

EOT
> yamldecode("hello: world") # yaml解码
{
  "hello" = "world"
}
> yamldecode("true") # yaml解码
true
> yamldecode("{a: &foo [1, 2, 3], b: *foo}") # yaml解码
{
  "a" = [
    1,
    2,
    3,
  ]
  "b" = [
    1,
    2,
    3,
  ]
}

文件处理

获取文件绝对路径:

> abspath(path.root)
"/root"

获取路径中的目录,或者是文件名:

> dirname("/root/iac/hello")
"/root/iac"
> dirname("/root/iac/hello/")
"/root/iac/hello"
> basename("/root/iac/hello")
"hello"
> basename("/root/iac/hello/")
"hello"

判断文件是否存在,并获取文件内容:

> fileexists("/root/iac/hello/main.tf")
true
> file("/root/iac/hello/main.tf") # 获取文件内容
> filebase64("/root/iac/hello/main.tf") # 对文件内容进行Base64编码

根据模式匹配所有文件:

> fileset("/root/iac/hello", "*.tf")
toset([
  "main.tf",
])

模板化文件:templatefile(path, vars)指定文件和变量,把变量值替换掉模板中的变量。
给定一个模块文件backends.tftpl,文件内容如下:

%{ for addr, port in ip_addrs ~}
backend ${addr}:${port}
%{ endfor ~}
> templatefile("/root/iac/hello/backends.tftpl", { port = 8080, ip_addrs = ["10.0.0.1", "10.0.0.2"] })
<<EOT
backend 0:10.0.0.1
backend 1:10.0.0.2

EOT

时间函数

时间格式化formatdate()

获取当前时间,并格式化显示,格式请参考:formatdate Function

> formatdate("YYYY-MM-DD hh:mm:ss / D MMMM YYYY", timestamp())
"2023-09-09 10:27:12 / 9 September 2023"
> formatdate("EEEE, DD-MMM-YY hh:mm:ss ZZZ", "2018-01-02T23:12:01Z")
"Tuesday, 02-Jan-18 23:12:01 UTC"

时间加减timeadd()

时间加减函数:timeadd(),支持的单位有:纳秒(ns), 微秒(usµs), 毫秒(ms), 秒(s), 分钟(m)和小时(h)。

> timeadd(timestamp(), "24h")
"2023-09-10T10:27:48Z"
> timeadd(timestamp(), "-24h10m")
"2023-09-08T10:17:55Z"

类型转换函数

判断表达式是否会执行出错can()

> can(regex("^ami-", "ami-123"))
true
> can(regex("^ami-", "bmi-123"))
false

判断值类型type()

> type("hello")
string
> type(["hello"])
tuple([
    string,
])

类型转换函数

tobool()函数只能转换bool类型的值或其对应的字符串或null值,转换其他值报错。

> tobool(true)
true
> tobool("true")
true
> tobool(null)
tobool(null)
> tobool(1)
╷
│ Error: Invalid function argument
│ 
│   on <console-input> line 1:
│   (source code not available)
│ 
│ Invalid value for "v" parameter: cannot convert number to bool.

还有其他类型转换函数,如:tolist()tomap()tonumber()toset()tostring()等。

更多函数详见:Built-in Functions

【参考】
Built-in Functions
Terraform的函数


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,在下面评论区告诉我^_^^_^