Динамические блоки для вложенной конфигурации
Программно создавайте повторяющиеся вложенные блоки конфигурации с помощью динамических блоков, избавляясь от копирования и вставки, например при настройке правил групп безопасности.
«Динамические блоки для вложенной конфигурации» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Циклы с `for_each` и `count`
- Встроенные функции Terraform
- Условные выражения и splat-выражения
- Динамические блоки для вложенной конфигурации