Что такое инфраструктура как код (IaC)?

«Что такое инфраструктура как код (IaC)?» — вопрос из категории Архитектура и DevOps-практики, который задают на 28% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Инфраструктура как код (IaC) — это подход к управлению и provisioning инфраструктуры (серверы, сети, балансировщики, БД) с помощью машинно-читаемых файлов конфигурации, а не ручных настроек. Эти файлы хранятся в системе контроля версий (например, Git) и обрабатываются специализированными инструментами.

Ключевые принципы и преимущества:

  • Идемпотентность: Применение конфигурации несколько раз даёт один и тот же результат, что делает процесс предсказуемым.
  • Версионность и отслеживаемость: Все изменения инфраструктуры фиксируются в коммитах Git, что позволяет видеть историю, откатываться и проводить code review.
  • Повторяемость и консистентность: Исключаются дрейф конфигураций и проблемы "работает на моей машине". Среды (dev, staging, prod) создаются идентично.
  • Автоматизация и скорость: Развертывание сложной инфраструктуры занимает минуты, а не дни.

Два основных подхода:

  1. Декларативный (Terraform, CloudFormation): Описывается желаемое конечное состояние инфраструктуры. Инструмент сам определяет, как его достичь.
  2. Императивный (Ansible, Chef, Puppet): Описывается последовательность команд или шагов для достижения состояния.

Пример декларативного описания инфраструктуры в Terraform (HCL) для AWS:

# main.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "eu-west-1"
}

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
  tags = {
    Name = "Production-VPC"
    ManagedBy = "Terraform"
  }
}

resource "aws_instance" "app_server" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t3.micro"
  subnet_id     = aws_subnet.main.id
  vpc_security_group_ids = [aws_security_group.allow_http.id]

  user_data = <<-EOF
              #!/bin/bash
              sudo yum update -y
              sudo yum install -y nginx
              sudo systemctl start nginx
              EOF

  tags = {
    Name = "Application-Server"
  }
}

Типичный рабочий процесс: Пишем код -> terraform plan (просмотр изменений) -> terraform apply (применение) -> terraform destroy (удаление).