В чем разница между Terraform и Ansible?

«В чем разница между Terraform и Ansible?» — вопрос из категории Архитектура и DevOps-практики, который задают на 29% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Terraform и Ansible — ключевые, но принципиально разные инструменты в стеке DevOps, решающие задачи на разных уровнях.

Terraform — Infrastructure as Code (IaC) — "Строитель"

  • Основная цель: Создание и управление инфраструктурой (серверы, сети, базы данных, bucket-ы) в облачных провайдерах (AWS, Azure, GCP) или платформах (Kubernetes, VMware).
  • Парадигма: Декларативная. Вы описываете желаемое конечное состояние инфраструктуры ("что"), а Terraform вычисляет и выполняет план для его достижения.
  • Состояние: Хранит состояние развернутой инфраструктуры в файле (terraform.tfstate), что позволяет понимать, какие ресурсы уже созданы, и вносить инкрементальные изменения.
  • Идемпотентность: Достигается за счет сравнения кода с состоянием. Повторный apply приведет инфраструктуру к виду, описанному в коде.

Ansible — Configuration Management & Orchestration — "Настройщик"

  • Основная цель: Настройка и управление конфигурацией уже существующих серверов (установка ПО, настройка сервисов, управление файлами, оркестрация развертывания приложений).
  • Парадигма: Императивная, но идемпотентная. Вы описываете последовательность шагов (tasks) ("как"), которые необходимо выполнить. Ansible гарантирует, что конечное состояние системы будет соответствовать описанию, даже если задача запускается多次.
  • Состояние: Не хранит состояние системы явно. Каждый запуск плейбука проверяет текущее состояние системы и вносит необходимые изменения для соответствия описанию.
  • Архитектура: Работает по модели push через SSH/WinRM, не требует установки агентов на целевых хостах.
Сравнительная таблица: Аспект Terraform Ansible
Основная задача Provisioning инфраструктуры Configuration Management серверов
Парадигма Декларативная (желаемое состояние) Императивная (последовательность задач)
Управление состоянием Да, через state-файл Нет, идемпотентность на уровне задач
Модель работы Pull (обращается к API провайдера) Push (подключается к хостам по SSH)
Типичный use case Создать VPC, subnet, EC2 instance Установить Docker, настроить nginx, развернуть jar-файл

Пример совместного использования (Typical Flow):

  1. Terraform создает "сырую" инфраструктуру.
    # main.tf
    resource "aws_instance" "web" {
      ami           = "ami-0c55b159cbfafe1f0"
      instance_type = "t2.micro"
      key_name      = aws_key_pair.deployer.key_name
      tags = {
        Name = "WebServer"
        AnsibleGroup = "webservers"
      }
    }
  2. Ansible настраивает созданные серверы.
    # site.yml
    - hosts: webservers
      become: yes
      tasks:
        - name: Update apt cache
          apt:
            update_cache: yes
            cache_valid_time: 3600
        - name: Install Nginx
          apt:
            name: nginx
            state: latest
        - name: Copy website files
          copy:
            src: ../web/index.html
            dest: /var/www/html/

В реальных проектах я использую эти инструменты вместе: Terraform — для воспроизводимого создания всей облачной обвязки, а Ansible — для приведения созданных виртуальных машин или контейнеров в рабочее состояние с установленным и настроенным приложением.