Что такое IaC (Infrastructure as Code)?

«Что такое IaC (Infrastructure as Code)?» — вопрос из категории Terraform, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

IaC (Infrastructure as Code) — это практика DevOps, при которой инфраструктура (серверы, сети, базы данных, балансировщики) описывается и управляется с помощью файлов конфигурации, а не через ручные действия в GUI. Эти файлы являются кодом, который можно версионировать, ревьюить, тестировать и развертывать.

Основные принципы и преимущества:

  • Идемпотентность: Применение конфигурации несколько раз даёт один и тот же результат. Инфраструктура приводится в желаемое состояние независимо от её начального состояния.
  • Версионность и контроль изменений: Код инфраструктуры хранится в Git. Любое изменение проходит через pull request, code review и историю коммитов.
  • Повторяемость и консистентность: Идентичные среды (dev, staging, prod) создаются из одного и того же кода, устраняя дрейф конфигураций (configuration drift).
  • Автоматизация и скорость: Развертывание сложной инфраструктуры становится быстрым и предсказуемым, что критично для CI/CD.

Подходы и инструменты:

  • Декларативный (Terraform, AWS CloudFormation, Pulumi): Вы описываете желаемое конечное состояние инфраструктуры, а инструмент сам определяет, как его достичь.
    # Пример Terraform для создания виртуальной машины в Yandex Cloud
    resource "yandex_compute_instance" "app" {
      name        = "my-app-server"
      platform_id = "standard-v3"
      resources {
        cores  = 2
        memory = 4
      }
      boot_disk {
        initialize_params {
          image_id = "fd8vmcue7aajpmeo39kk" # Ubuntu 22.04
        }
      }
      network_interface {
        subnet_id = yandex_vpc_subnet.my-subnet.id
        nat       = true
      }
    }
  • Императивный (Ansible, Chef, Puppet): Вы пишете последовательность команд или шагов ("плейбуки", "рецепты"), которые изменяют систему, чтобы привести её к нужному состоянию. Часто используется для конфигурации уже существующих серверов (Configuration Management).

В DevOps-практике Terraform стал стандартом для оркестрации облачной инфраструктуры, а Ansible — для её последующей конфигурации. Их совместное использование обеспечивает полный цикл управления инфраструктурой как кодом.