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



[for in : ]

LIST — это список, который нужно перебрать, ITEM — имя локальной переменной, которое будет назначено каждому элементу списка, а OUTPUT — выражение, которое каким-то образом преобразует ITEM. Например, вот код Terraform для перевода списка имен в var.names в верхний регистр:

variable "names" {

  description = "A list of names"

  type        = list(string)

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

}

output "upper_names" {

  value = [for name in var.names : upper(name)]

}

Если выполнить для этого кода команду terraformapply, получится следующий вывод:

$ terraform apply

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

Outputs:

upper_names = [

  "NEO",

  "TRINITY",

  "MORPHEUS",

]

Как и с абстракциями списков в Python, вы можете задать выражение для фильтрации полученного результата:

variable "names" {

  description = "A list of names"

  type        = list(string)

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

}

output "short_upper_names" {

  value = [for name in var.names : upper(name) if length(name) < 5]

}

Выполнив terraformapply для этого кода, вы получите следующее:

short_upper_names = [

  "NEO",

]

Выражение for в Terraform также поддерживает циклический перебор ассоциативных массивов с использованием такого синтаксиса:

[for , in : ]

MAP — это ассоциативный массив, который нужно перебрать, KEY и VALUE — имена локальных переменных, которые назначаются каждой паре «ключ — значение» в MAP, а OUTPUT — выражение, которое каким-то образом преобразует KEY и VALUE. Например:

variable "hero_thousand_faces" {

  description = "map"

  type        = map(string)

  default     = {

    neo      = "hero"

    trinity  = "love interest"

    morpheus = "mentor"

  }

}

output "bios" {

  value = [for name, role in var.hero_thousand_faces : "${name} is the ${role}"]

}

Если выполнить terraformapply для этого кода, получится следующее:

map_example = [

  "morpheus is the mentor",

  "neo is the hero",

  "trinity is the love interest",

]

Выражение for может вернуть ассоциативный массив вместо списка, используя следующий синтаксис:

# Циклический перебор списков

[for in : => ]

# Циклический перебор ассоциативных массивов

{for , in : => }

Разница лишь в том, что: а) выражение помещается в фигурные скобки вместо прямоугольных; б) на каждой итерации выводится не только значение, но еще и ключ, отделенный от него стрелкой. Например, так можно перевести в верхний регистр все ключи и значения ассоциативного массива: