Terraform: инфраструктура на уровне кода | страница 109



variable "hero_thousand_faces" {

  description = "map"

  type        = map(string)

  default     = {

    neo      = "hero"

    trinity  = "love interest"

    morpheus = "mentor"

  }

}

output "upper_roles" {

  value = {for name, role in var.hero_thousand_faces : upper(name) => upper(role)}

}

При выполнении этот код возвращает такой вывод:

upper_roles = {

  "MORPHEUS" = "MENTOR"

  "NEO" = "HERO"

  "TRINITY" = "LOVE INTEREST"

}


Циклы с использованием строковой директивы for

Ранее в этой книге вы узнали о строковой интерполяции, которая позволяет ссылаться на код Terraform внутри строки:

"Hello, ${var.name}"

С помощью строковых директив подобный синтаксис можно использовать и для управляющих конструкций (вроде циклов for и выражения if), но вместо знака доллара (${…}) перед фигурными скобками указывается знак процента (%{…}).

Строковая директива for имеет следующий синтаксис:

%{ for in }%{ endfor }

COLLECTION — список или ассоциативный массив, который нужно перебрать, ITEM — имя локальной переменной, которое назначается каждому элементу COLLECTION, а BODY — это то, что выводится на каждой итерации (здесь можно ссылаться на ITEM). Например:

variable "names" {

  description = "Names to render"

  type        = list(string)

  default     = ["neo", "trinity", "morpheus"]

}

output "for_directive" {

  value = <

%{ for name in var.names }

  ${name}

%{ endfor }

EOF

}

Выполнив terraformapply, вы получите следующий вывод:

$ terraform apply

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

for_directive =

  neo

  trinity

  morpheus

Обратите внимание на дополнительные символы перехода на новую строку. В строковой директиве можно указать маркер ~, чтобы удалить все пробельные символы (пробелы и перенос строки) перед ней (если маркер находится в начале директивы) или после нее (если маркер находится в конце директивы):

output "for_directive_strip_marker" {

  value = <

%{~ for name in var.names }

  ${name}

%{~ endfor }

EOF

}

Эта обновленная версия дает такой вывод:

for_directive_strip_marker =

  neo

  trinity

  morpheus


Условные выражения

Как и циклы, условные выражения в Terraform бывают нескольких видов, каждый из которых рассчитан немного на другой сценарий использования.

Параметр count для условных ресурсов.

• Выраженияfor_eachиfor для условных ресурсов и их вложенных блоков.

• Строковая директива if для условных выражений внутри строк.

Рассмотрим их все по очереди.


Условные выражения с использованием параметра count