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



$ terraform apply

Terraform will perform the following actions:

  # aws_autoscaling_group.example will be updated in-place

  ~ resource "aws_autoscaling_group" "example" {

        (...)

        tag {

            key                 = "Name"

            propagate_at_launch = true

            value               = "webservers-prod"

        }

      + tag {

          + key                 = "Owner"

          + propagate_at_launch = true

          + value               = "team-foo"

        }

      + tag {

          + key                 = "DeployedBy"

          + propagate_at_launch = true

          + value               = "terraform"

        }

    }

Plan: 0 to add, 1 to change, 0 to destroy.

Do you want to perform these actions?

  Terraform will perform the actions described above.

  Only 'yes' will be accepted to approve.

  Enter a value:

Введите yes, чтобы развернуть изменения. В веб-консоли EC2 должны появиться новые теги, как показано на рис. 5.1.

Рис. 5.1. Динамические теги группы автомасштабирования


Циклы на основе выражений for

Вы уже знаете, как циклически перебирать ресурсы и вложенные блоки. Но если с помощью цикла нужно сгенерировать лишь одно значение? Немного отвлечемся и рассмотрим некоторые примеры, не связанные с кластером веб-серверов. Представьте, что вы написали код Terraform, который принимает на вход список имен:

variable "names" {

  description = "A list of names"

  type        = list(string)

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

}

Как бы вы перевели все эти имена в верхний регистр? В языке программирования общего назначения, таком как Python, можно было бы написать следующий цикл:

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

upper_case_names = []

for name in names:

    upper_case_names.append(name.upper())

print upper_case_names

# Выводит: ['NEO', 'TRINITY', 'MORPHEUS']

Python позволяет выразить точно такой же код одной строчкой, используя синта­ксис под названием «абстракция списков» (list comprehension):

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

upper_case_names = [name.upper() for name in names]

print upper_case_names

# Выводит: ['NEO', 'TRINITY', 'MORPHEUS']

Python также позволяет отфильтровать итоговый список по заданному выражению:

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

short_upper_case_names = [name.upper() for name in names if len(name) < 5]

print short_upper_case_names

# Выводит: ['NEO']

Terraform предлагает похожие возможности в виде выражения for (не путать с выражением for_each из предыдущего раздела). У него следующий базовый синтаксис: