Небольшая инструкция по использованию Terraform, чтобы изучить и применить различные типы встроенных функций, в том числе Numeric, String, и Date, и Time в этом инструменте IaC.
ИТ-команды могут использовать Terraform от HashiCorp для развертывания облачных и локальных ресурсов и управления ими. Чтобы оптимизировать использование инструмента, изучите и установите функции Terraform.
Администраторы могут использовать встроенные функции Terraform для выполнения различных математических вычислений, связанных с развертыванием, и для выполнения операций, таких как кодирование и декодирование или захват и отображение временных меток. Язык Terraform поддерживает только встроенные в него функции; специальные или определяемые пользователем функции недоступны.
Используйте это руководство по Terraform, чтобы изучить основы функций, а также некоторые общие способы их использования в корпоративных развертываниях.
Начнем с синтаксиса
Синтакс функции Terraform начинается с имени
функции, за которым следуют круглые скобки, содержащие от нуля до
нескольких аргументов, разделенных запятыми:
name(arg-1, arg-2, arg-n)
Например, чтобы получить отметку времени, используйте функцию
timestamp()
, чтобы увидеть текущую дату и время:
> timestamp()2019-12-07T07:44:12Z
Чтобы прочитать содержимое из файла по заданному пути и вернуть
это содержимое в виде строки, используйте функцию
file()
и укажите путь к файлу в качестве
аргумента:
Поддержка интерполяции для функций Terraform
Язык конфигурации Terraform поддерживает интерполяцию, которая
позволяет администраторам передавать функции в виде строки для
выполнения различных операций. Эти интерполяции заключены в
специальный синтаксис $ {builtinfunction ()}
, как
показано в следующем примере:
resource "myinstance" "web" { tags = ["${var.env == "prod" ? var.prod_subnet : var.dev_subnet}"]}
Используйте консоль Terraform, чтобы наблюдать за интерполяцией и различными функциями в действии. Чтобы применить файл конфигурации в Terraform, используйте вышеупомянутый синтаксис интерполяции для ссылки на переменные и ресурсы и для вызова некоторых встроенных функций.
Давайте посмотрим на пример. В этом руководстве по Terraform у
нас есть переменные с именем environment
и мы
сопоставляем различные среды, такие как тестирование и production,
с зонами доступности AWS (AZs). Используйте другую переменную с именем
availzone
, чтобы сопоставить эти зоны с зонами
доступности, например, us-east-1a
,
us-east-1b
и us-east-1c
. Это значения,
разделенные запятыми, как вы можете видеть ниже:
variable "environment" {default = { "test" = "us-east-1" "prod" = "us-west-2" }}variable "availzone" { description = "Availability Zones Mapping" default = { "us-east-1" = "us-east-1a,us-east-1b,us-east-1c" "us-west-2" = "us-west-2a,us-west-2b,us-east-1c" }}
Чтобы захватить одну AZ, сначала используйте функцию
lookup()
, чтобы получить список значений, разделенных
запятыми, а затем разделите его запятой (,)
и функцией
split()
.
Наконец, используйте функцию element()
для захвата
определенного индекса выбора. Это вернет AZ в виде строки.
Поместите все эти функции внутри $ {}
, как показано
ниже, чтобы язык конфигурации Terraform понимал, что эти функции
должны быть интерполированы перед развертыванием.
output "availabiltyzones" { value = "${element(split(",", lookup(var.availzone,var.environment.prod)), 1)}"}
Взятые вместе, вышеуказанные шаги будут выглядеть следующим образом:
Список встроенных функций Terraform
Функции Terraform можно разделить на одну из следующих категорий в зависимости от сценария использования.
Числовые функции
Эти функции выполняют числовые операции, такие как вычисление максимума, минимума, степени / экспоненты и логарифма, как показано в следующем примере:
Строковые функции
Язык Terraform также предоставляет встроенные функции для
управления строками. Например, функции title()
,
lower()
и upper()
изменяют регистр
входных строк:
ИТ-специалисты также могут разделить строку, объединить две или более строк и заменить одну подстроку другой:
Функции даты и времени
Функции даты и времени полезны для захвата и отображения отметок
времени при применении конфигурации Terraform. Как мы видели в
предыдущем примере, встроенная функция timestamp()
возвращает дату и время:
Используйте встроенную функцию formatdate()
, чтобы
расположить дату и время в более удобном формате:
Функции кодирования
Terraform имеет несколько встроенных функций, которые выполняют
кодирование и декодирование строки. Например, функция
base64encode('string')
возвращает строку в кодировке Base64, которая полезна для
развертывания ресурсов Azure, которые принимают настраиваемые
сценарии в кодировке Base64 для настройки виртуальных машин. В
приведенном ниже примере функция file()
возвращает
содержимое сценария в виде обычного текста, который затем
кодируется функцией Base64encode()
и передается в
атрибут сценария ресурса:
resource "azurerm_virtual_machine_extension" "Example" { name = "MyVM" location = "${azurerm_resource_group.test.location}" resource_group_name = "${azurerm_resource_group.test.name}" virtual_machine_name = "${azurerm_virtual_machine.test.name}" publisher = "Microsoft.Azure.Extensions" type = "CustomScript" type_handler_version = "2.0" settings = <
Функции Сбора (Collections)
Некоторые встроенные функции Terraform выполняют несколько операций, таких как определение длины списка или строки, над коллекциями значений:
length([1,12,31,14,5,2])length("this is a string")
Вы также можете ограничить возврат, чтобы найти только отдельные элементы в списке, или выполнить поиск в списке для определенного элемента: