《Terraform 101 从入门到实践》 Functions函数

打印 上一主题 下一主题

主题 1010|帖子 1010|积分 3030

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
《Terraform 101 从入门到实践》这本小册在南瓜慢说官方网站GitHub两个地方同步更新,书中的示例代码也是放在GitHub上,方便大家参考查看。
Terraform的函数

Terraform为了让大家在表达式上可以更加灵活方便地进行计算,提供了大量的内置函数(Function)。目前并不支持自定义函数,只能使用Terraform自带的。使用函数的格式也很简单,直接写函数名+参数即可。如下面的函数为取最大值:
  1. > max(34, 45, 232, 25)
  2. 232
复制代码
这里把函数单独列成一章不是因为它很难理解,而因为它很常用,值得把这些函数梳理一下,以便查询使用吧。
数值计算函数

绝对值abs:
  1. > abs(5)
  2. 5
  3. > abs(-3.1415926)
  4. 3.1415926
  5. > abs(0)
  6. 0
复制代码
返回大于等于该数值的最小整数:
  1. > ceil(3)
  2. 3
  3. > ceil(3.1)
  4. 4
  5. > ceil(2.9)
  6. 3
复制代码
小于等于该数值的最大整数:
  1. > floor(6)
  2. 6
  3. > floor(6.9)
  4. 6
  5. > floor(5.34)
  6. 5
复制代码
对数函数:
  1. > log(16, 2)
  2. 4
  3. > log(9, 3)
  4. 2.0000000000000004
复制代码
指数函数:
  1. > pow(6, 2)
  2. 36
  3. > pow(6, 1)
  4. 6
  5. > pow(6, 0)
  6. 1
复制代码
最大值、最小值:
  1. > max(2, 98,  75, 4)
  2. 98
  3. > min(2, 98,  75, 4)
  4. 2
复制代码
字符串转换成整数,第二个参数为进制:
  1. > parseint("16", 10)
  2. 16
  3. > parseint("16", 16)
  4. 22
  5. > parseint("FF", 16)
  6. 255
  7. > parseint("1010", 2)
  8. 10
复制代码
信号量函数:
  1. > signum(6)
  2. 1
  3. > signum(-6)
  4. -1
  5. > signum(0)
  6. 0
复制代码
字符串函数

删去换行,在从文件中读取文本时非常有用:
  1. > chomp("www.pkslow.com")
  2. "www.pkslow.com"
  3. > chomp("www.pkslow.com\n")
  4. "www.pkslow.com"
  5. > chomp("www.pkslow.com\n\n")
  6. "www.pkslow.com"
  7. > chomp("www.pkslow.com\n\n\r")
  8. "www.pkslow.com"
  9. > chomp("www.pkslow.com\n\n\ra")
  10. <<EOT
  11. www.pkslow.com
  12. a
  13. EOT
复制代码
遍历格式化列表:
  1. > format("Hi, %s!", "Larry")
  2. "Hi, Larry!"
  3. > format("My name is %s, I'm %d", "Larry", 18)
  4. "My name is Larry, I'm 18"
  5. > format("The reuslt is %.2f", 3)
  6. "The reuslt is 3.00"
  7. > format("The reuslt is %.2f", 3.1415)
  8. "The reuslt is 3.14"
  9. > format("The reuslt is %8.2f", 3.1415)
  10. "The reuslt is     3.14"
复制代码
参数可以是List,还可以是单个变量。
字符串连接:
  1. > formatlist("My name is %s, I'm %d %s.", ["Larry", "Jeremy", "Tailor"], [18, 28, 33], "in 2022")
  2. tolist([
  3.   "My name is Larry, I'm 18 in 2022.",
  4.   "My name is Jeremy, I'm 28 in 2022.",
  5.   "My name is Tailor, I'm 33 in 2022.",
  6. ])
复制代码
大小写字母转换:
  1. > join(".", ["www", "pkslow", "com"])
  2. "www.pkslow.com"
  3. > join(", ", ["Larry", "Pkslow", "JJ"])
  4. "Larry, Pkslow, JJ"
复制代码
首字母大写:
  1. > lower("Larry Nanhua DENG")
  2. "larry nanhua deng"
  3. > upper("Larry Nanhua DENG")
  4. "LARRY NANHUA DENG"
复制代码
替换:
  1. > title("larry")
  2. "Larry"
复制代码
分割:
  1. > replace("www.larrydpk.com", "larrydpk", "pkslow")
  2. "www.pkslow.com"
  3. > replace("hello larry", "/la.*y/", "pkslow")
  4. "hello pkslow"
复制代码
反转:
  1. > split(".", "www.pklow.com")
  2. tolist([
  3.   "www",
  4.   "pklow",
  5.   "com",
  6. ])
复制代码
截取:
  1. > strrev("pkslow")
  2. "wolskp"
复制代码
去除头尾某些特定字符,注意这里只要有对应字符就会删除:
  1. > substr("Larry Deng", 0, 5)
  2. "Larry"
  3. > substr("Larry Deng", -4, -1)
  4. "Deng"
复制代码
去除头尾特定字符串,注意与上面的区别:
  1. > trim("?!what?!!!!!", "?!")
  2. "what"
  3. > trim("abaaaaabbLarry Dengaab", "ab")
  4. "Larry Deng"
复制代码
去除头尾的空格、换行等空串:
  1. > trimsuffix("?!what?!!!!!", "!!!")
  2. "?!what?!!"
  3. > trimprefix("?!what?!!!!!", "?!")
  4. "what?!!!!!"
复制代码
正则匹配,下面的例子是匹配第一个和匹配所有:
  1. > trimspace(" Larry Deng \n\r")
  2. "Larry Deng"
复制代码
更多正则匹配语法可参考:https://www.terraform.io/language/functions/regex
集合类函数

alltrue:判断列表是否全为真,空列表直接返回true。只能是bool类型或者对应的字符串。
  1. > regex("[a-z\\.]+", "2021www.pkslow.com2022larry deng 31415926")
  2. "www.pkslow.com"
  3. > regexall("[a-z\\.]+", "2021www.pkslow.com2022larry deng 31415926")
  4. tolist([
  5.   "www.pkslow.com",
  6.   "larry",
  7.   "deng",
  8. ])
复制代码
anytrue:判断列表是否有真,只要有一个为真就返回true。空列表为false。
  1. > alltrue([true, "true"])
  2. true
  3. > alltrue([true, "true", false])
  4. false
  5. > alltrue([])
  6. true
  7. > alltrue([1])
  8. │ Error: Invalid function argument
  9. │   on <console-input> line 1:
  10. │   (source code not available)
  11. │ Invalid value for "list" parameter: element 0: bool required.
复制代码
chunklist分片:根据分片数来对列表进行切分。
  1. > anytrue([true])
  2. true
  3. > anytrue([true, false])
  4. true
  5. > anytrue([false, false])
  6. false
  7. > anytrue([])
  8. false
复制代码
coalesce返回第一个非空元素:
  1. > chunklist(["www", "pkslow", "com", "Larry", "Deng"], 3)
  2. tolist([
  3.   tolist([
  4.     "www",
  5.     "pkslow",
  6.     "com",
  7.   ]),
  8.   tolist([
  9.     "Larry",
  10.     "Deng",
  11.   ]),
  12. ])
复制代码
coalescelist返回第一个非空列表:
  1. > coalesce("", "a", "b")
  2. "a"
  3. > coalesce("", "", "b")
  4. "b"
复制代码
从字符串列表里把空的去掉:
  1. > coalescelist([], ["pkslow"])
  2. [
  3.   "pkslow",
  4. ]
复制代码
concat连接多个列表:
  1. > compact(["", "www", "", "pkslow", "com"])
  2. tolist([
  3.   "www",
  4.   "pkslow",
  5.   "com",
  6. ])
复制代码
contains判断是否存在某个元素:
  1. > concat([1, 2, 3], [4, 5, 6])
  2. [
  3.   1,
  4.   2,
  5.   3,
  6.   4,
  7.   5,
  8.   6,
  9. ]
复制代码
distinct去除重复元素:
  1. > contains(["www", "pkslow", "com"], "pkslow")
  2. true
  3. > contains(["www", "pkslow", "com"], "Larry")
  4. false
复制代码
element获取列表的某个元素:
  1. > distinct([1, 2, 2, 1, 3, 8, 1, 10])
  2. tolist([
  3.   1,
  4.   2,
  5.   3,
  6.   8,
  7.   10,
  8. ])
复制代码
flatten把内嵌的列表都展开成一个列表:
  1. > element(["a", "b", "c"], 1)
  2. "b"
  3. > element(["a", "b", "c"], 2)
  4. "c"
  5. > element(["a", "b", "c"], 3)
  6. "a"
  7. > element(["a", "b", "c"], 4)
  8. "b"
复制代码
index获取列表中的元素的索引值:
  1. > flatten([1, 2, 3, [1], [[6]]])
  2. [
  3.   1,
  4.   2,
  5.   3,
  6.   1,
  7.   6,
  8. ]
复制代码
keys获取map的所有key值:
  1. > index(["www", "pkslow", "com"], "pkslow")
  2. 1
复制代码
values获取map的value值:
  1. > keys({name="Larry", age=18, webSite="www.pkslow.com"})
  2. [
  3.   "age",
  4.   "name",
  5.   "webSite",
  6. ]
复制代码
length获取字符串、列表、Map等的长度:
  1. > values({name="Larry", age=18, webSite="www.pkslow.com"})
  2. [
  3.   18,
  4.   "Larry",
  5.   "www.pkslow.com",
  6. ]
复制代码
lookup(map, key, default)根据key值在map中找到对应的value值,如果没有则返回默认值:
  1. > length([])
  2. 0
  3. > length(["pkslow"])
  4. 1
  5. > length(["pkslow", "com"])
  6. 2
  7. > length({pkslow = "com"})
  8. 1
  9. > length("pkslow")
  10. 6
复制代码
matchkeys(valueslist, keyslist, searchset)对key值进行匹配。匹配到key值后,返回对应的Value值。
  1. > lookup({name = "Larry", age = 18}, "age", 1)
  2. 18
  3. > lookup({name = "Larry", age = 18}, "myAge", 1)
  4. 1
复制代码
merge合并Map,key相同的会被最后的覆盖:
  1. > matchkeys(["a", "b", "c", "d"], [1, 2, 3, 4], [2, 4])
  2. tolist([
  3.   "b",
  4.   "d",
  5. ])
复制代码
one取集合的一个元素,如果为空则返回null;如果只有一个元素,则返回该元素;如果多个元素,则报错:
  1. > merge({name = "Larry", webSite = "pkslow.com"}, {age = 18})
  2. {
  3.   "age" = 18
  4.   "name" = "Larry"
  5.   "webSite" = "pkslow.com"
  6. }
  7. > merge({name = "Larry", webSite = "pkslow.com"}, {age = 18}, {age = 13})
  8. {
  9.   "age" = 13
  10.   "name" = "Larry"
  11.   "webSite" = "pkslow.com"
  12. }
复制代码
range生成顺序列表:
  1. > one([])
  2. null
  3. > one(["pkslow"])
  4. "pkslow"
  5. > one(["pkslow", "com"])
  6. │ Error: Invalid function argument
  7. │   on <console-input> line 1:
  8. │   (source code not available)
  9. │ Invalid value for "list" parameter: must be a list, set, or tuple value with either zero or one elements.
复制代码
reverse反转列表:
  1. range(max)
  2. range(start, limit)
  3. range(start, limit, step)
  4. > range(3)
  5. tolist([
  6.   0,
  7.   1,
  8.   2,
  9. ])
  10. > range(1, 6)
  11. tolist([
  12.   1,
  13.   2,
  14.   3,
  15.   4,
  16.   5,
  17. ])
  18. > range(1, 6, 2)
  19. tolist([
  20.   1,
  21.   3,
  22.   5,
  23. ])
复制代码
setintersection对set求交集:
  1. > reverse([1, 2, 3, 4])
  2. [
  3.   4,
  4.   3,
  5.   2,
  6.   1,
  7. ]
复制代码
setproduct列出所有组合可能:
  1. > setintersection([1, 2, 3], [2, 3, 4], [2, 3, 6])
  2. toset([
  3.   2,
  4.   3,
  5. ])
复制代码
setsubtract:set的减法
  1. > setproduct(["Larry", "Harry"], ["Deng", "Potter"])
  2. tolist([
  3.   [
  4.     "Larry",
  5.     "Deng",
  6.   ],
  7.   [
  8.     "Larry",
  9.     "Potter",
  10.   ],
  11.   [
  12.     "Harry",
  13.     "Deng",
  14.   ],
  15.   [
  16.     "Harry",
  17.     "Potter",
  18.   ],
  19. ])
复制代码
setunion:set的加法
  1. > setsubtract([1, 2, 3], [3, 4])
  2. toset([
  3.   1,
  4.   2,
  5. ])
  6. # 求不同
  7. > setunion(setsubtract(["a", "b", "c"], ["a", "c", "d"]), setsubtract(["a", "c", "d"], ["a", "b", "c"]))
  8. [
  9.   "b",
  10.   "d",
  11. ]
复制代码
slice(list, startindex, endindex)截取列表部分,包括startindex,但不包括endindex:
  1. > setunion([1, 2, 3], [3, 4])
  2. toset([
  3.   1,
  4.   2,
  5.   3,
  6.   4,
  7. ])
复制代码
sort对列表中的字符串进行排序,要注意如果输入的是数字,会先转化为字符串再排序:
  1. > slice(["a", "b", "c", "d", "e"], 1, 4)
  2. [
  3.   "b",
  4.   "c",
  5.   "d",
  6. ]
复制代码
sum求和:
  1. > sort(["larry", "pkslow", "com", "deng"])
  2. tolist([
  3.   "com",
  4.   "deng",
  5.   "larry",
  6.   "pkslow",
  7. ])
  8. > sort([3, 6, 1, 9, 12, 79, 22])
  9. tolist([
  10.   "1",
  11.   "12",
  12.   "22",
  13.   "3",
  14.   "6",
  15.   "79",
  16.   "9",
  17. ])
复制代码
transpose对Map的key和value进行换位:
  1. > sum([3, 1.2, 9, 17.3, 2.2])
  2. 32.7
复制代码
zipmap根据key和value的列表按一对一关系生成Map:
  1. > transpose({"a" = ["1", "2"], "b" = ["2", "3"]})
  2. tomap({
  3.   "1" = tolist([
  4.     "a",
  5.   ])
  6.   "2" = tolist([
  7.     "a",
  8.     "b",
  9.   ])
  10.   "3" = tolist([
  11.     "b",
  12.   ])
  13. })
复制代码
加密解密

Base64:
  1. > zipmap(["age", "name"], [18, "Larry Deng"])
  2. {
  3.   "age" = 18
  4.   "name" = "Larry Deng"
  5. }
复制代码
csv文本解析:
  1. > base64encode("pkslow")
  2. "cGtzbG93"
  3. > base64decode("cGtzbG93")
  4. "pkslow"
  5. > textencodebase64("pkslow", "UTF-8")
  6. "cGtzbG93"
  7. > textdecodebase64("cGtzbG93", "UTF-8")
  8. "pkslow"
复制代码
Json解析:
  1. > csvdecode("seq,name,age\n1,larry,18\n2,pkslow,3\n3,Jeremy,29")
  2. tolist([
  3.   {
  4.     "age" = "18"
  5.     "name" = "larry"
  6.     "seq" = "1"
  7.   },
  8.   {
  9.     "age" = "3"
  10.     "name" = "pkslow"
  11.     "seq" = "2"
  12.   },
  13.   {
  14.     "age" = "29"
  15.     "name" = "Jeremy"
  16.     "seq" = "3"
  17.   },
  18. ])
复制代码
URL:
  1. > jsonencode({"name"="Larry", "age"=18})
  2. "{"age":18,"name":"Larry"}"
  3. > jsondecode("{"age":18,"name":"Larry"}")
  4. {
  5.   "age" = 18
  6.   "name" = "Larry"
  7. }
复制代码
YAML:
  1. > urlencode("Larry Deng/a/:/./@")
  2. "Larry+Deng%2Fa%2F%3A%2F.%2F%40"
复制代码
文件处理:
获取绝对路径:
  1. > yamlencode({"a":"b", "c":"d"})
  2. "a": "b"
  3. "c": "d"
  4. > yamlencode({"foo":[1, 2, 3], "bar": "baz"})
  5. "bar": "baz"
  6. "foo":
  7. - 1
  8. - 2
  9. - 3
  10. > yamlencode({"foo":[1, {"a":"b","c":"d"}, 3], "bar": "baz"})
  11. "bar": "baz"
  12. "foo":
  13. - 1
  14. - "a": "b"
  15.   "c": "d"
  16. - 3
  17. > yamldecode("hello: world")
  18. {
  19.   "hello" = "world"
  20. }
  21. > yamldecode("true")
  22. true
  23. > yamldecode("{a: &foo [1, 2, 3], b: *foo}")
  24. {
  25.   "a" = [
  26.     1,
  27.     2,
  28.     3,
  29.   ]
  30.   "b" = [
  31.     1,
  32.     2,
  33.     3,
  34.   ]
  35. }
复制代码
获取路径中的目录,或者是文件名:
  1. > abspath(path.root)
  2. "/Users/larry"
复制代码
判断文件是否存在,并获取文件内容:
  1. > dirname("/home/larry/soft/terraform")
  2. "/home/larry/soft"
  3. > dirname("/home/larry/soft/terraform/")
  4. "/home/larry/soft/terraform"
  5. > basename("/home/larry/soft/terraform")
  6. "terraform"
  7. > basename("/home/larry/soft/terraform/")
  8. "terraform"
复制代码
根据模式匹配所有文件:
  1. > fileexists("/Users/larry/.bash_profile")
  2. true
  3. > file("/Users/larry/.bash_profile")
  4. > filebase64("/Users/larry/.bash_profile")
复制代码
templatefile(path, vars)模板化文件:指定文件和变量,把变量值替换掉模板中的变量。
时间函数

获取当前时间,并格式化显示,格式请参考:https://www.terraform.io/language/functions/formatdate
  1. > fileset("/Users/larry", "*.bash*")
  2. toset([
  3.   ".bash_history",
  4.   ".bash_profile",
  5.   ".bash_profile.backup",
  6. ])
复制代码
时间加减:
  1. > formatdate("YYYY-MM-DD hh:mm:ss / D MMMM YYYY", timestamp())
  2. "2022-03-05 08:25:48 / 5 March 2022"
  3. > formatdate("EEEE, DD-MMM-YY hh:mm:ss ZZZ", "2018-01-02T23:12:01Z")
  4. "Tuesday, 02-Jan-18 23:12:01 UTC"
复制代码
支持的单位有:"ns", "us" (or "µs"), "ms", "s", "m", and "h".
其它

加密:
  1. > timeadd(timestamp(), "24h")
  2. "2022-03-06T08:28:52Z"
  3. > timeadd(timestamp(), "-24h10m")
  4. "2022-03-04T08:19:08Z"
复制代码
UUID:
  1. > md5("www.pkslow.com")
  2. "97e164b60faf4d7875c2a8a5bc3f2245"
复制代码
IP:
  1. > uuid()
  2. "049bf418-15d1-e034-28db-92945067dcf6"
复制代码
更多请参考官网。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

飞不高

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表