0Pricing
Terraform Infrastructure as Code · Урок

Условные выражения и splat-выражения

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

«Условные выражения и splat-выражения» — бесплатный урок Terraform Infrastructure as Code на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Terraform Infrastructure as Code, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Terraform Infrastructure as Code содержит 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) и разблокировать остальной курс Terraform Infrastructure as Code, подпишись на CoddyKit PRO. Курс Terraform Infrastructure as Code содержит 4 уроков всего.

Чему я научусь в уроке «Условные выражения и splat-выражения»?

Реализуйте условную логику в конфигурациях с помощью тернарных операторов и разберитесь со splat-выражениями для преобразования списков объектов. Ты практикуешь Terraform Infrastructure as Code с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Terraform Infrastructure as Code?

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

Сколько времени занимает урок «Условные выражения и splat-выражения»?

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

Можно ли писать и запускать код в этом уроке Terraform Infrastructure as Code?

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

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

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