DevOps Bootcamp · Урок

Динамические блоки для вложенной конфигурации

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

Урок 4 из 413 шагов

«Динамические блоки для вложенной конфигурации» — бесплатный урок DevOps Bootcamp на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения DevOps Bootcamp, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс DevOps Bootcamp содержит 4 уроков всего.

Проблема повторения

Некоторые ресурсы содержат повторяющиеся вложенные блоки, например несколько правил ingress в группе безопасности. Записывать каждое правило вручную многословно и сложно поддерживать принцип DRY. Динамические блоки создают их из коллекции.

Сначала статические блоки

Вот ручной вариант: три почти одинаковых блока ingress. Представьте, что Вам нужно поддерживать дюжину таких блоков.

resource "aws_security_group" "web" {
  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

Структура динамического блока

Блок dynamic содержит метку, совпадающую с именем вложенного блока, коллекцию for_each и блок content, описывающий каждый создаваемый экземпляр.

dynamic "ingress" {
  for_each = var.rules
  content {
    from_port   = ingress.value.port
    to_port     = ingress.value.port
    protocol    = "tcp"
    cidr_blocks = ingress.value.cidrs
  }
}

Объект итератора

Внутри content обращайтесь к текущему элементу через объект, названный так же, как метка блока. Он предоставляет .value (элемент) и .key (ключ карты или индекс списка).

Определение входной переменной

Управляйте динамическим блоком с помощью типизированной переменной. Список объектов позволяет документировать каждое правило непосредственно в его структуре.

variable "rules" {
  type = list(object({
    port  = number
    cidrs = list(string)
  }))
}

Собираем всё вместе

Теперь ресурс остаётся компактным независимо от количества переданных правил.

resource "aws_security_group" "web" {
  name = "web-sg"
  dynamic "ingress" {
    for_each = var.rules
    content {
      from_port   = ingress.value.port
      to_port     = ingress.value.port
      protocol    = "tcp"
      cidr_blocks = ingress.value.cidrs
    }
  }
}

Переименование итератора

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

dynamic "ingress" {
  for_each = var.rules
  iterator = rule
  content {
    from_port = rule.value.port
    to_port   = rule.value.port
  }
}

Условный пропуск блоков

Передайте пустую коллекцию, чтобы создать ноль блоков. Тернарное выражение для for_each делает блок необязательным.

dynamic "logging" {
  for_each = var.enable_logging ? [1] : []
  content {
    target_bucket = var.log_bucket
  }
}

Вложенные динамические блоки

Динамические блоки можно вкладывать друг в друга. Используйте разные итераторы, чтобы внутренний блок мог обращаться к обоим уровням без неоднозначности.

dynamic "setting" {
  for_each = var.settings
  iterator = s
  content {
    namespace = s.value.namespace
    name      = s.value.name
    value     = s.value.value
  }
}

Когда не следует использовать динамические блоки

Динамические блоки добавляют косвенность и могут ухудшить читаемость. Если у Вас всего один или два статических блока, оставьте их в явном виде. Используйте динамические блоки, когда их количество определяется данными.

Проверка результата

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

terraform plan

Быстрая проверка

Проверьте свои знания о динамических блоках.

Итоги: конфигурация вложенных блоков по принципу DRY

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

  • for_each управляет итерацией, а content определяет каждый блок.
  • Итератор предоставляет .value и .key.
  • Пустые коллекции делают блоки необязательными.
  • Используйте их умеренно, чтобы конфигурации оставались читаемыми.
Можно начать бесплатно

Изучай DevOps Bootcamp с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
142
Уроки
568

Часто задаваемые вопросы

Урок «Динамические блоки для вложенной конфигурации» бесплатный?

Да — полный текст урока «Динамические блоки для вложенной конфигурации» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс DevOps Bootcamp, подпишись на CoddyKit PRO. Курс DevOps Bootcamp содержит 4 уроков всего.

Чему я научусь в уроке «Динамические блоки для вложенной конфигурации»?

Программно создавайте повторяющиеся вложенные блоки конфигурации с помощью динамических блоков, избавляясь от копирования и вставки, например при настройке правил групп безопасности. Ты практикуешь DevOps Bootcamp с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать DevOps Bootcamp?

Предыдущий опыт не требуется. DevOps Bootcamp на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Динамические блоки для вложенной конфигурации»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке DevOps Bootcamp?

Да. Каждый урок DevOps Bootcamp включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Циклы с `for_each` и `count`
  2. Встроенные функции Terraform
  3. Условные выражения и splat-выражения
  4. Динамические блоки для вложенной конфигурации
← Назад к DevOps Bootcamp