В этом посте мы обсудим функции Terraform. Язык Terraform включает ряд встроенных функций, которые можно вызывать из выражений для преобразования и комбинирования значений. Общий синтаксис для вызовов функций — это имя функции, за которым следуют аргументы, разделенные запятыми, в круглых скобках.
<function_name>(<argument1>, <argument2>, …<argumentN>)
Далее мы собираемся объяснить функции Terraform на примерах. Мы будем использовать консоль terraform для этой демонстрации.
Функции Terraform:
Откройте terraform console
terraform console
Числовые функции
abs(number): возвращает абсолютное значение заданного числа.
abs(-19.86)
#возвращает 19.86
ceil(number): возвращает ближайшее целое число, которое больше или равно заданному значению
ceil(7.1)
#возвращает 8
floor(number): возвращает ближайшее целое число, которое меньше или равно заданному значению
floor(7.1)
#возвращает 7
log(number, base): log возвращает логарифм заданного числа по заданному основанию.
log(16,2)
#возвращает 4
max(N1,N2,..Nn): берет одно или несколько чисел и возвращает наибольшее число из набора.
max(3,2,6,8.8,7)
#возвращает 8.8
min(N1,N2,..Nn): принимает одно или несколько чисел и возвращает наименьшее число из набора.
min(3,2,6,8.8,7)
#возвращает 2
pow(number,power): вычисляет показатель степени, возводя свой первый аргумент в степень второго аргумента.
pow(8,2)
#возвращает 64
signum(number): определяет знак числа, возвращая число от -1 до 1 для представления знака.
signum(-4)
#возвращает -1
signum(4)
#возвращает 1
Строковые функции
chomp("string"): удаляет символы новой строки в конце строки.
chomp("cloudaffaire\n")
#возвращает cloudaffaire
(**удаляет только \ n с конца)
format(spec, values...): создает строку путем форматирования ряда других значений в соответствии со строкой спецификации
format("Welcome, to %s", "CloudAffaire")
#возвращает Welcome, to CloudAffaire
format("The year is %d", 2019)
#возвращает The year is 2019
format("%4.4f+", 3.86)
#возвращает 3.8600+
Спецификация форматирования
formatlist(spec, values...): formatlist создает список строк путем форматирования ряда других значений
в соответствии со строкой спецификации. Строка спецификации использует тот же синтаксис, что и формат.
formatlist("www.%s.com",list("azure","aws","google"))
#возвращает [www.azure.com,www.aws.com,www.google.com]
indent(num_spaces, string): добавляет заданное количество пробелов в начало всех строк, кроме первой, в данной многострочной строке.
indent(8,"hi, \n welcome \n to \n cloudaffaire")
#1st line hi has no indentaton
join(separator, list): создает строку, объединяя вместе все элементы заданного списка строк с заданным разделителем.
join(".",list("www","google","com"))
#возвращает www.google.com
lower(string): преобразует все буквы в заданной строке в нижний регистр.
lower("CLOUDAFFAIRE")
#возвращает cloudaffaire
upper(string): преобразует все буквы в заданной строке в верхний регистр.
upper("cloudaffaire")
#возвращает CLOUDAFFAIRE
replace(string, substring, replacement): ищет в заданной строке другую заданную подстроку,
и заменяет каждое вхождение заданной строкой замены.
replace("www.google.com","google","cloudaffaire")
#возвращает www.cloudaffaire.com
split(separator, string): создает список, разделяя заданную строку на все вхождения заданного разделителя.
split(".","www.google.com")
#возвращает ["www","google","com"]
strrev(string): меняет местами символы в строке. Обратите внимание, что символы обрабатываются как символы Unicode.
strrev("google")
#возвращает: elgoog
(поддерживается только в terraform версии 0.12 или новее)
substr(string, offset, length): извлекает подстроку из заданной строки по смещению и длине.
substr("www.google.com",4,6)
#возвращает google
title(string): преобразует первую букву каждого слова в заданной строке в верхний регистр.
title("welcome to cloudaffaire")
#возвращает Welcome To Cloudaffaire
trimspace(string): удаляет любые пробелы из начала и конца данной строки.
trimspace(" hello, all ")
#возвращает "hello, all
"
Функции по работе с коллекциями
chunklist(list, chunk_size): разбивает один список на фрагменты фиксированного размера, возвращая список списков.
chunklist(list("a","b","c","d","e","f"),3)
#возвращает [["a","b","c"],["d","e","f"]]
coalesce(strings\numbers): принимает любое количество аргументов и возвращает первый, который не является нулем или пустой строкой.
coalesce("",1,"a")
#возвращает 1
coalescelist(list1, list2,… listn): принимает любое количество аргументов списка и возвращает первый непустой аргумент.
coalescelist(list(),list("a","b","c"),list("d","e"))
#возвращает ["a","b","c",]
compact(list(string)): принимает список строк и возвращает новый список с удаленными пустыми строковыми элементами.
compact(list("a","","c","","d"))
#возвращает ["a","c","d"]
concat(list1, list2,… listn): берет два или более списка и объединяет их в один список.
concat(list("a","b"),list("c","d"),list("e","f"))
#возвращает ["a","b","c","d","e","f"]
contains(list, value): определяет, содержит ли данный список или набор заданное единственное значение в качестве одного из своих элементов.
contains(list("a","b","c"),"a")
#возвращает true
contains(list("a","b","c"),"d")
#возвращает false
distinct(list): принимает список и возвращает новый список с удаленными повторяющимися элементами.
distinct(list("a","b","b","c"))
#возвращает ["a","b","c",]
element(list, index): извлекает один элемент из списка.
element(list("a","b","c"),2)
#возвращает c #index start from 0
index(list, value): находит индекс элемента для данного значения в списке.
index(list("a","b","c"),"b")
#возвращает 1
flatten(list(list1,list2,..,listn)): принимает список и заменяет любые элементы, которые являются списками сглаженной последовательностью содержимого списка.
flatten(list(list("a","b"),list("c"),list(),list("d","e")))
#возвращает ["a","b","c","d","e",]
keys(map): берет карту и возвращает список, содержащий ключи из этой карты.
keys(map("name","debjeet","sex","male"))
#возвращает ["name","sex",]
length(list\map\string): определяет длину данного списка, карты или строки.
length(list("a","b"))
#возвращает 2
length("debjeet")
#возвращает 7
length(map("name","debjeet","sex","male"))
#возвращает 2
list(): принимает произвольное количество аргументов и возвращает список, содержащий эти значения в том же порядке.
list("a","b","c")
#возвращает ["a","b","c",]
lookup(map, key, default): извлекает значение одного элемента из карты, учитывая его ключ. Если данный ключ не существует, вместо него возвращается заданное значение по умолчанию.
lookup(map("name","debjeet","sex","male"),"sex","not found!")
#возвращает male
lookup(map("name","debjeet","","male"),"gender","not found!")
#возвращает not found!
map("key1","value1","key2","value2",...,"keyn","valuen"): принимает четное количество аргументов и возвращает карту, элементы которой
построены из последовательных пар аргументов.
map("name","debjeet","sex","male")
#возвращает {"name" = "debjeet" "sex" = "male"}
matchkeys(valueslist, keyslist, searchset): создает новый список, беря подмножество элементов из одного списка, индексы которого
сопоставляет соответствующие индексы значений в другом списке.
matchkeys(list("a","b","c"),list("one","two","three"),list("two"))
#возвращает b
matchkeys(list("a","b","c"),list("one","two","three"),list("one"))
#возвращает a
matchkeys(list("a","b","c"),list("one","two","three"),list("three"))
#возвращает c
merge(map1,map2,..,mapn): берет произвольное количество карт и возвращает одну карту
содержит объединенный набор элементов со всех карт.
merge(map("a","one"),map("b","two"),map("c","three"))
#возвращает {"a" = "one" "b" = "two" "c" = "three"}
reverse(list): берет последовательность и создает новую последовательность такой же длины со всеми.
те же элементы, что и заданная последовательность, но в обратном порядке.
reverse(list("a","b","c"))
#возвращает: ["c","b","a",]
(поддерживается только в terraform версии 0.12 или новее)
setintersection(sets...): принимает несколько наборов и создает один набор, содержащий только элементы, которые являются общими для всех данных наборов.
setintersection(list("a","b"),list("b","c"),list("b","d"))
#возвращает ["b",]
(поддерживается только в terraform версии 0.12 или новее)
setproduct(sets...): находит все возможные комбинации элементов из всех заданных наборов, вычисляя декартово произведение.
setproduct(list("a","b"),list("c","d"))
#возвращает [["a","c"],["a","d"],["b","c"],["b","d"],]
(поддерживается только в terraform версии 0.12 или новее)
setunion(sets...): берет несколько наборов и создает один набор, содержащий элементы из всех данных наборов.
Другими словами, он вычисляет объединение множеств.
setunion(list("a","b"),list("c","d"))
#возвращает ["a","b","c","d",]
(поддерживается только в terraform версии 0.12 или новее)
slice(list, startindex, endindex): извлекает несколько последовательных элементов из списка
slice(list("zero","one","two","three"),1,3)
#возвращает ["one","two"]
sort(list): принимает список строк и возвращает новый список с этими строками, отсортированными лексикографически.
sort(list("d","c","a","b"))
#возвращает ["a","b","c","d",]
transpose(): берет карту списков строк и меняет местами ключи и значения, чтобы создать новую карту списков строк.
transpose(map("a",list("one","two"),"b",list("three","four")))
#возвращает {"four"=["b",] "one"=["a",] "three"=["b",] "two"=["a",]}
values(map): берет карту и возвращает список, содержащий значения элементов в этой карте.
values(map("name","debjeet","sex","male"))
#возвращает ["debjeet","male",]
zipmap(keyslist, valueslist): создает карту из списка ключей и соответствующего списка значений.
zipmap(list("name","sex"),list("debjeet","male"))
#возвращает {"name" = "debjeet" "sex" = "male"}
Функции кодирования
base64encode(string): применяет кодировку Base64 к строке.
base64encode("cloudaffaire")
#возвращает Y2xvdWRhZmZhaXJl
base64gzip(string): сжимает строку с помощью gzip, а затем кодирует результат в кодировке Base64.
base64gzip("cloudaffaire")
#возвращает H4sIAAAAAAAA/0rOyS9NSUxLS8wsSgUAAAD//wEAAP//38z9sQwAAAA=
base64decode(string): принимает строку, содержащую последовательность символов Base64, и возвращает исходную строку.
base64decode("Y2xvdWRhZmZhaXJl")
#возвращает cloudaffaire
csvdecode(string): декодирует строку, содержащую данные в формате CSV, и создает список карт, представляющих эти данные.
csvdecode("a,b,c\n1,2,3\n")
#возвращает [{"a"="1" "b"="2" "c"="3"},]
(поддерживается только в terraform версии 0.12 или новее)
jsonencode(): кодирует заданное значение в строку, используя синтаксис JSON.
jsonencode(map("name","debjeet"))
#возвращает {"name":"debjeet"}
jsondecode(): интерпретирует заданную строку как JSON, возвращая представление результата декодирования этой строки.
jsondecode("{\"name\":\"debjeet\"}")
#возвращает {"name" = "debjeet"} (поддерживается только в terraform версии 0.12 или новее)
urlencode(): применяет кодировку URL к заданной строке.
urlencode("https://cloudaffaire.com/?s=terraform")
#возвращает https%3A%2F%2Fcloudaffaire.com%2F%3Fs%3Dterraform
Функции для работы с файловой системой
dirname(string): берет строку, содержащую путь к файловой системе, и удаляет из нее последнюю часть.
dirname("/home/ec2-user/terraform/main.tf")
#возвращает /home/ec2-user/terraform
pathexpand(): принимает путь к файловой системе, который может начинаться с сегмента ~,
и если это так, он заменяет этот сегмент на путь к домашнему каталогу текущего пользователя.
pathexpand("~/.ssh/id_rsa")
#возвращает /home/ec2-user/.ssh/id_rsa
basename(string): берет строку, содержащую путь к файловой системе, и удаляет из нее все, кроме последней части.
basename("/home/ec2-user/terraform/main.tf")
#возвращает main.tf
file(path): читает содержимое файла по заданному пути и возвращает его в виде строки
file("/home/ec2-user/terraform/main.tf")
#возвращает content of main.tf
fileexists(path): определяет, существует ли файл по заданному пути.
fileexists("/home/ec2-user/terraform/main.tf")
#возвращает true if main.tf exist
(поддерживается только в terraform версии 0.12 или новее)
filebase64(path): читает содержимое файла по заданному пути и возвращает его в виде строки в кодировке base64.
filebase64("/home/ec2-user/terraform/main.tf")
# возвращает содержимое main.tf как данные base64. (поддерживается только в terraform версии 0.12 или новее)
templatefile(path, vars): читает файл по заданному пути и отображает его содержимое как шаблон, используя предоставленный набор переменных шаблона.
Функции по работе с датой и временем
formatdate(spec, timestamp): преобразует метку времени в другой формат времени.
formatdate("MMM DD, YYYY", "2018-01-02T23:12:01Z")
#возвращает Jan 02, 2018
(поддерживается только в terraform версии 0.12 или новее). Спецификация.
timeadd(timestamp, duration): добавляет продолжительность к отметке времени, возвращая новую отметку времени.
Продолжительность — это строковое представление разницы во времени, состоящее из последовательностей пар чисел и единиц, например «1,5 часа» или «1 час 30 минут».
Принятые единицы: "ns", "us" (or "µs"), "ms", "s", "m", and "h".
Первое число может быть отрицательным, чтобы указать отрицательную продолжительность, например "-2h5m".
timeadd("2019-05-10T00:00:00Z", "10m")
#возвращает 2019-05-10T00:10:00Z
timestamp(): возвращает текущую дату и время
timestamp()
Функции по работе с IP сетями
cidrhost(prefix, hostnum): вычисляет полный IP-адрес хоста для данного номера хоста в пределах данного префикса IP-адреса сети.
cidrhost("10.0.0.0/16", 4)
#возвращает 10.0.0.4
cidrhost("10.0.0.0/16", -4)`` #возвращает
10.0.255.252`
cidrnetmask(prefix): преобразует префикс IPv4-адреса, указанный в нотации CIDR, в адрес маски подсети.
cidrnetmask("10.0.0.0/16")
#возвращает 255.255.0.0
cidrnetmask("10.0.0.0/24")
#возвращает 255.255.255.0
cidrsubnet(prefix, newbits, netnum): cidrsubnet вычисляет адрес подсети в пределах заданного префикса IP-адреса сети.
префикс должен быть указан в нотации CIDR
newbits
— это количество дополнительных битов, с помощью которых можно расширить префикс.
netnum
— это целое число, которое может быть представлено как двоичное целое число, состоящее не более чем из двоичных разрядов newbits
cidrsubnet("10.0.0.0/16",8,2)
#возвращает 10.0.2.0/24
cidrsubnet("10.0.0.0/24",8,1)
#возвращает 10.0.0.1/32
Выйти из консоли терраформа
exit
Полный список функций terraform смотрите ниже в документации terraform.