Terraform函数

为了在表达式上更加灵活地方便计算,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()等。

相关推荐
弗锐土豆5 小时前
Windows系统中Oracle VM VirtualBox的安装
windows·虚拟机·virtualbox
秋の花5 小时前
【JAVA基础】Java集合基础
java·开发语言·windows
贩卖纯净水.6 小时前
Chrome调试工具(查看CSS属性)
前端·chrome
零意@8 小时前
ubuntu切换不同版本的python
windows·python·ubuntu
写bug的小屁孩9 小时前
前后端交互接口(三)
运维·服务器·数据库·windows·用户界面·qt6.3
hairenjing112311 小时前
在 Android 手机上从SD 卡恢复数据的 6 个有效应用程序
android·人工智能·windows·macos·智能手机
plmm烟酒僧14 小时前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv
Jtti17 小时前
Windows系统服务器怎么设置远程连接?详细步骤
运维·服务器·windows
小奥超人17 小时前
PPT文件设置了修改权限,如何取消权?
windows·经验分享·microsoft·ppt·办公技巧
熊的猫17 小时前
JS 中的类型 & 类型判断 & 类型转换
前端·javascript·vue.js·chrome·react.js·前端框架·node.js