Terrafrom函數解析
- 2020 年 3 月 18 日
- 筆記
Terraform支援很多內建的函數可以用來處理字元串、數值計算、加密等。調用方式如下:
<FUNCTION NAME>(<ARGUMENT 1>, <ARGUMENT 2>)
本文主要對Terraform支援的函數進行總結,簡要說明其用處及用法。
數值計算函數
函數名 |
描述 |
使用示例 |
示例結果 |
---|---|---|---|
abs |
計算絕對值 |
abs(-123.4) |
123.4 |
ceil |
向上取整 |
ceil(5.1) |
6 |
floor |
向下取整 |
floor(4.9) |
4 |
log |
計算對數 |
log(16, 2) |
4 |
max |
取最大值 |
max(12, 54, 3) |
54 |
min |
取最小值 |
min(12, 54, 3…) |
3 |
parseint |
將字元串轉換為整數 |
parseint("FF", 16) |
255 |
pow |
計算x的y次冪 |
pow(3, 2) |
9 |
signum |
計算數字的正負,正數返回1,負數返回-1,0返回0 |
signum(-13) |
-1 |
字元串處理函數
函數名 |
描述 |
使用示例 |
示例結果 |
---|---|---|---|
chomp |
移除字元串末尾的換行符 |
chomp("hellorn") |
hello |
format |
格式化字元串 |
format("Hello, %s!", "world") |
Hello, world! |
formatlist |
格式化字元串,返回字元串列表 |
format("Hello, %s", "world", "tencent") |
"Hello, world", "Hello, tencent" |
indent |
在多行字元串的每一行前面添加指定數量的空格(統一縮進) |
indent(2, "testnnew") |
testn new |
join |
把數組中的所有元素放入一個字元串,元素通過指定的分隔符分隔 |
join (", ", "foo", "bar", "baz") |
foo, bar, baz |
lower |
將字元串中的字母轉換為小寫 |
lower("HELLO") |
hello |
uper |
將字元串中的字元轉換為大寫 |
upper("hello") |
HELLO |
regex |
正則匹配函數 |
regex("a-z+", "53453453.345345aaabbbccc23454") |
aaabbbccc |
regexall |
正則匹配函數,返回所有的匹配的字串列表 |
regexall("a-z+", "1234abcd5678efgh9") |
"abcd","efgh" |
replace |
字元替換函數,支援正則匹配 |
replace("hello world", "/w.*d/", "everybody") |
hello everybody |
split |
分割字元串 |
split(",", "foo,bar,baz") |
"foo","bar","baz" |
strrev |
翻轉字元串 |
strrev("hello") |
olleh |
substr |
在字元串中抽取從start下標開始的指定數目的字元 |
substr("hello world", 1, 4) |
ello |
title |
將給定字元串的每一行首字母大寫 |
title("hello world") |
Hello World |
trim |
移除字元串開頭和結尾的指定字元 |
trim("?!hello?!", "!?") |
hello |
trimprefix |
移除字元串開頭的指定字元 |
trimprefix("helloworld", "hello") |
world |
trimsuffix |
移除字元串結尾的指定字元 |
trimsuffix("helloworld", "world") |
hello |
trimspace |
移除字元串開頭和結尾的空白字元 |
trimspace(" hellonn") |
hello |
集合函數
函數名 |
描述 |
使用示例 |
示例結果 |
---|---|---|---|
chunklist |
將單個list分割為多個固定大小的list |
chunklist(list, chunk_size) |
|
coalesce |
返回第一個非空的字元串 |
coalesce("", "b") |
b |
coalescelist |
返回第一個非空的list |
coalescelist([], "c", "d") |
"c","d" |
compact |
移除list中的空字元串 |
compact("a", "", "b", "c") |
"a","b","c" |
concat |
將多個list合併為一個list |
concat("a", "", "b", "c") |
"a", "", "b", "c" |
contains |
判斷list中是否包含給定的值 |
contains("a", "b", "c", "a") |
true |
distinct |
移除list中的重複元素 |
distinct("a", "b", "a", "c", "d", "b") |
"a", "b", "c", "d" |
element |
返回list指定位置的元素 |
element("a", "b", "c", 1) |
b |
flatten |
將所有list中的元素合併到一個list |
flatten(["a", "b", [], "c"]) |
"a", "b", "c" |
index |
找到給定值在list中的位置 |
index("a", "b", "c", "b") |
1 |
keys |
返回map中的所有key |
keys({a=1, c=2, d=3}) |
"a","c","d" |
length |
返回list, map或string的長度 |
length("hello") |
5 |
list |
將所有參數組成list |
list("a", "b", "c") |
"a","b","c" |
lookup |
查找map中的值,如果不存在,返回default |
lookup({a="ay", b="bee"}, "a", "what?") |
ay |
map |
將所有參數組成map |
map("a", "b", "c", "d") |
{"a" = "b", "c" = "d"} |
merge |
將多個map合併為一個map,並移除重複的key |
merge({"a"="b", "c"="d"}, {"e"="f", "c"="z"}) |
{"a" = "b", "c" = "z", "e" = "f"} |
range |
根據start, limit, step生成一個list |
range(start, limit, step) |
|
reverse |
翻轉list |
reverse(1, 2, 3) |
3,2,1 |
setintersection |
返回多個集合中都有的元素集合 |
setintersection("a", "b", "b", "c", "b", "d") |
"b" |
setproduct |
返回集合的笛卡爾積 |
setproduct("a", "b") |
["a","b"] |
setsubtract |
返回第一個集合中有的但第二個集合中沒有的元素集合 |
setsubtract("a", "b", "c", "a", "c") |
"b" |
setunion |
返回多個集合的並集 |
setunion("a", "b", "b", "c", "d") |
"d","b","c","a" |
slice |
從list中取連續的子list |
slice("a", "b", "c", "d", 1, 3) |
"b","c" |
sort |
對list按升序排序 |
sort("e", "d", "a", "x") |
"a","d","e","x" |
transpose |
交換map的key和value |
transpose({"a" = "1", "2", "b" = "2", "3"}) |
{"1" = "a","2" = "a","b","3" = "b"}} |
values |
返回map的所有value |
values({a=3, c=2, d=1}) |
3,2,1 |
zipmap |
將兩個list組合成map |
zipmap("a", "b", 1, 2) |
{"a" = 1,"b" = 2} |
編碼函數
函數名 |
描述 |
使用示例 |
示例結果 |
---|---|---|---|
base64decode |
base64解碼函數 |
base64decode("SGVsbG8gV29ybGQ=") |
Hello World |
base64encode |
base64編碼函數 |
base64encode("Hello World") |
SGVsbG8gV29ybGQ= |
base64gzip |
gzip壓縮字元串然後base64編碼 |
base64gzip("AAAAAAAAAAAAAAAAAAAAAAAA") |
H4sIAGUdX14AA3N0xA64ADb7j4sZAAAA |
csvdecode |
解碼csv格式的字元串數據 |
csvdecode("a,b,cn1,2,3") |
{"a" = "1","b" = "2","c" = "3"} |
jsondecode |
json解碼函數 |
jsondecode("{"hello": "world"}") |
{"hello" = "world"} |
jsonencode |
json編碼函數 |
jsonencode({"hello"="world"}) |
{"hello":"world"} |
urlencode |
url編碼函數 |
urlencode("Hello World") |
Hello%20World |
yamldecode |
yaml解碼函數 |
yamldecode("{"hello": "world"}") |
{"hello" = "world"} |
yamlencode |
yaml編碼函數 |
yamlencode({"a":"b"}) |
"a": "b" |
文件操作函數
函數名 |
描述 |
使用示例 |
示例結果 |
---|---|---|---|
abspath |
返回絕對路徑 |
abspath(path.root) |
/home/user/some/terraform/root |
dirname |
返迴文件路徑,移除最後的文件名 |
dirname("foo/bar/baz.txt") |
foo/bar |
pathexpand |
展開用戶的HOME目錄 |
pathexpand("~/.ssh/id_rsa") |
/home/steve/.ssh/id_rsa |
basename |
返迴路徑中的文件名 |
basename("foo/bar/baz.txt") |
baz.txt |
file |
讀取文件並返迴文件內容 |
file("hello.txt") |
Hello World |
fileexists |
判斷給定的路徑是否存在 |
fileexists("hello.txt") |
true |
fileset |
正則匹配目錄下的文件 |
fileset(path.module, "files/*.txt") |
"files/hello.txt","files/world.txt" |
filebase64 |
讀取文件並返迴文件內容的base64編碼 |
filebase64("hello.txt") |
SGVsbG8gV29ybGQ= |
templatefile |
讀取模板文件並渲染 |
templatefile(path, vars) |
|
日期時間函數
函數名 |
描述 |
使用示例 |
示例結果 |
---|---|---|---|
formatdate |
格式化日期時間格式,輸入日期為RFC 3339格式 |
formatdate("MMM DD, YYYY", "2018-01-02T23:12:01Z") |
Jan 02, 2018 |
timeadd |
加一段時間到日期上,返回一個新日期 |
timeadd("2019-11-22T00:00:00Z", "10m") |
2019-11-22T00:10:00Z |
timestamp |
返回當前時間 |
timestamp() |
2019-05-13T07:44:12Z |
哈希和加密函數
函數名 |
描述 |
使用示例 |
示例結果 |
---|---|---|---|
base64sha256 |
計算字元串的SHA256哈希值,然後base64編碼 |
base64sha256("hello world") |
uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek= |
base64sha512 |
計算字元串的SHA512哈希值,然後base64編碼 |
base64sha512("hello world") |
MJ7MSJwS1utMxA9QyQLytNDtd+5RGnx6m808qG1M2G+Y… |
bcrypt |
計算Blowfish演算法加密值 |
bcrypt("hello world") |
$2a$10$D5grTTzcsqyvAeIAnY/mYOIqliCoG7eAMX0/oFcuD.iErkksEbcAa |
filebase64sha256 |
計算文件的SHA256哈希值,然後base64編碼 |
filebase64sha256(filepath) |
|
filebase64sha512 |
計算文件的SHA512哈希值,然後base64編碼 |
filebase64sha512(filepath) |
|
filemd5 |
計算文件的md5值 |
filemd5(filepath) |
|
filesha1 |
計算文件的sha1值 |
filesha1(filepath) |
|
filesha256 |
計算文件的sha256值 |
filesha256(filepath) |
|
filesha512 |
計算文件的sha512值 |
filesha512(filepath) |
|
md5 |
計算字元串的md5值 |
md5("hello world") |
5eb63bbbe01eeed093cb22bb8f5acdc3 |
rsadecrypt |
解密RSA加密的密文 |
rsadecrypt(ciphertext, privatekey) |
|
sha1 |
計算字元串的sha1值 |
sha1("hello world") |
2aae6c35c94fcfb415dbe95f408b9ce91ee846ed |
sha256 |
計算字元串的sha256值 |
sha256("hello world") |
b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 |
sha512 |
計算字元串的sha512值 |
sha512("hello world") |
309ecc489c12d6eb4cc40f50c902f2b4d0e… |
uuid |
隨機生成唯一ID |
uuid() |
b5ee72a3-54dd-c4b8-551c-4bdc0204cedb |
uuidv5 |
根據名稱生成唯一ID |
uuidv5("url", "https://www.terraform.io/") |
9db6f67c-dd95-5ea0-aa5b-e70e5c5f7cf5 |
IP相關函數
函數名 |
描述 |
使用示例 |
示例結果 |
---|---|---|---|
cidrhost |
根據IP地址前綴和編號計算IP地址 |
cidrhost("10.12.127.0/20", 16) |
10.12.112.16 |
cidrnetmask |
計運算元網掩碼 |
cidrnetmask("172.16.0.0/12") |
255.240.0.0 |
cidrsubnet |
計運算元網地址(具體規則看官方文檔) |
cidrsubnet("172.16.0.0/12", 4, 2) |
172.18.0.0/16 |
類型轉換函數
函數名 |
描述 |
使用示例 |
示例結果 |
---|---|---|---|
can |
表明表達式是否能正確計算出結果 |
can(local.foo.bar) |
false |
tobool |
轉換為布爾值 |
tobool("true") |
true |
tolist |
轉換為list |
tolist("a", "b", 3) |
"a","b","3" |
tomap |
轉換為map |
tomap({"a" = "foo", "b" = true}) |
{"a" = "foo", "b" = "true"} |
tonumber |
轉換為數字 |
tonumber("1") |
1 |
toset |
轉換為set |
toset("a", "b", 3) |
"a","b","3" |
tostring |
轉換為字元串 |
tostring(1) |
1 |