Условные выражения и splat-выражения
Реализуйте условную логику в конфигурациях с помощью тернарных операторов и разберитесь со splat-выражениями для преобразования списков объектов.
«Условные выражения и splat-выражения» — бесплатный урок DevOps Bootcamp на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения DevOps Bootcamp, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс DevOps Bootcamp содержит 4 уроков всего.
Динамическая логика в Terraform
Terraform предназначен не только для статических деклараций! Чтобы сделать конфигурации инфраструктуры более интеллектуальными и адаптируемыми, мы используем динамическую логику.
В этом уроке рассматриваются два мощных инструмента: условные выражения и выражения splat. Они помогают инфраструктуре адаптироваться к разным ситуациям и эффективно преобразовывать данные.
Условные выражения: основы
Условные выражения, которые часто называют тернарными операторами, позволяют выбрать одно из двух значений в зависимости от того, истинно условие или ложно. Это простой оператор «если—иначе» для значений.
- Синтаксис:
condition ? value_if_true : value_if_false - Они отлично подходят для создания гибких и повторно используемых конфигураций, адаптирующихся к разным окружениям и настройкам.
Условие: пример с простым значением
Посмотрим, как условное выражение может динамически задавать значение локальной переменной на основе входной переменной. Попробуйте заменить default = "dev" на default = "prod" и запустить конфигурацию снова.
variable "env" {
description = "Deployment environment (dev or prod)"
type = string
default = "dev"
}
locals {
instance_type = var.env == "prod" ? "t3.medium" : "t3.micro"
}
output "chosen_instance_type" {
value = local.instance_type
description = "The instance type selected based on environment."
}Условие: пример с атрибутом ресурса
Условные выражения также можно использовать для управления атрибутами ресурса, в том числе для определения того, будет ли ресурс создан вообще! Здесь мы условно создаём корзину S3 с помощью метааргумента count.
variable "create_bucket" {
description = "Whether to create an S3 bucket"
type = bool
default = true
}
resource "aws_s3_bucket" "my_bucket" {
# If create_bucket is true, count is 1 (create one bucket).
# If create_bucket is false, count is 0 (create no buckets).
count = var.create_bucket ? 1 : 0
bucket = "coddykit-unique-bucket-12345" # IMPORTANT: Replace with a globally unique name!
acl = "private"
}
output "bucket_id" {
value = var.create_bucket ? aws_s3_bucket.my_bucket[0].id : "No bucket created"
description = "The ID of the created S3 bucket, or a message if not created."
}Разбираемся в выражениях splat
Выражения splat ([*]) используются для преобразования списка объектов в список определённых атрибутов этих объектов. Это мощный способ одновременно извлекать данные из нескольких элементов.
- Синтаксис:
LIST_OF_OBJECTS[*].ATTRIBUTE - Они упрощают работу с коллекциями, например с несколькими ресурсами, созданными с помощью
count, или со сложными списочными переменными.
Splat: пример с выходными значениями ресурсов
Представьте, что Вы создаёте несколько экземпляров EC2. Как быстро получить список всех их общедоступных IP-адресов? Для этого отлично подходят выражения splat! Примечание: Вам понадобится корректный AMI для Вашего региона AWS.
resource "aws_instance" "web" {
count = 2 # Creates two instances
ami = "ami-0abcdef1234567890" # Replace with a valid AMI ID for your region
instance_type = "t2.micro"
tags = {
Name = "web-instance-${count.index}"
}
}
output "web_instance_public_ips" {
value = aws_instance.web[*].public_ip
description = "A list of public IP addresses for all web instances."
}Splat: пример со списками переменных
Выражения splat предназначены не только для ресурсов — они также отлично работают со сложными переменными. Здесь у нас есть список объектов пользователей, из которого нужно извлечь только их адреса электронной почты.
variable "users" {
description = "List of user objects, each with name, email, and role."
type = list(object({
name = string
email = string
role = string
}))
default = [
{ name = "Alice", email = "alice@example.com", role = "admin" },
{ name = "Bob", email = "bob@example.com", role = "viewer" },
{ name = "Charlie", email = "charlie@example.com", role = "editor" }
]
}
output "user_emails" {
value = var.users[*].email
description = "A list containing only the email addresses of the users."
}Объединение условных выражений и splat
Условные выражения и выражения splat можно объединять, создавая ещё более сложную и компактную логику. Например, можно условно выбрать список ресурсов, а затем применить к выбранному списку выражение splat.
- Это позволяет создавать конфигурации, которые гибко реагируют на сложные сценарии.
- Пример:
(var.env == "prod" ? aws_instance.prod : aws_instance.dev)[*].idможет получить идентификаторы из разных наборов экземпляров в зависимости от окружения.
Рекомендации по динамической логике
Несмотря на свою мощь, динамическая логика иногда усложняет понимание конфигураций, если использовать её неосторожно. Вот несколько рекомендаций:
- Сохраняйте читаемость: разбивайте сложные выражения на более мелкие и удобные для работы части.
- Используйте локальные значения: сохраняйте сложные условные выражения и выражения splat в блоках
locals, чтобы улучшить читаемость и избежать повторений. - Тщательно проверяйте: динамическая логика может привести к неожиданному поведению. Всегда запускайте
terraform planи внимательно проверяйте предложенные изменения. - Документируйте: добавляйте комментарии, объясняющие сложную логику, особенно при объединении условных выражений и выражений splat.
Быстрая проверка
Рассмотрим следующую конфигурацию Terraform:
variable "server_names" {
type = list(string)
default = ["web-01", "db-01", "cache-01"]
}
output "filtered_names" {
value = var.server_names[*]
}Итоги и дальнейшие шаги
Отличная работа! Вы научились делать конфигурации Terraform более динамичными и гибкими:
- Мы изучили условные выражения (тернарный оператор), позволяющие динамически задавать значения на основе определённых условий.
- Мы освоили выражения splat (
[*]) для эффективного извлечения списков атрибутов из коллекций объектов или ресурсов.
Эти инструменты играют фундаментальную роль в создании масштабируемой, повторно используемой и адаптивной инфраструктуры как кода. Продолжайте практиковаться, чтобы включить их в повседневную работу с Terraform!
Часто задаваемые вопросы
Урок «Условные выражения и splat-выражения» бесплатный?
Да — полный текст урока «Условные выражения и splat-выражения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс DevOps Bootcamp, подпишись на CoddyKit PRO. Курс DevOps Bootcamp содержит 4 уроков всего.
Чему я научусь в уроке «Условные выражения и splat-выражения»?
Реализуйте условную логику в конфигурациях с помощью тернарных операторов и разберитесь со splat-выражениями для преобразования списков объектов. Ты практикуешь DevOps Bootcamp с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать DevOps Bootcamp?
Предыдущий опыт не требуется. DevOps Bootcamp на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Условные выражения и splat-выражения»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке DevOps Bootcamp?
Да. Каждый урок DevOps Bootcamp включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Циклы с `for_each` и `count`
- Встроенные функции Terraform
- Условные выражения и splat-выражения
- Динамические блоки для вложенной конфигурации