0Pricing
DevOps Bootcamp · Урок

Условные выражения и 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 — локальная установка не требуется.

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

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