Серверное оборудование для бизнеса — надёжные решения для любых задач Подробнее →
Статья

Ansible vs Terraform: когда что использовать

Один из самых частых вопросов от людей, которые начинают разбираться в DevOps: «А зачем мне Terraform, если есть Ansible? Или наоборот?». Эти инструменты постоянно ставят рядом и сравнивают, хотя они решают разные задачи. Разберём на конкретных примерах.

Разные уровни абстракции

Главное, что нужно понять: Terraform и Ansible работают на разных уровнях.

Terraform — это инструмент управления инфраструктурой (Infrastructure as Code). Он создаёт и управляет ресурсами: виртуальными машинами, сетями, балансировщиками, DNS-записями, базами данных в облаке. Terraform говорит провайдеру «создай мне вот это», провайдер создаёт, Terraform запоминает состояние в state-файле.

Ansible — это инструмент управления конфигурацией (Configuration Management). Он работает с уже существующими машинами: устанавливает пакеты, правит конфиги, запускает сервисы, копирует файлы. Ansible заходит по SSH и выполняет задачи.

Terraform: декларативная модель

Вы описываете желаемое состояние, Terraform сам разбирается как его достичь.

resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t3.medium"
  subnet_id     = aws_subnet.main.id

  tags = {
    Name = "web-server"
    Env  = "production"
  }
}

Запускаем terraform apply — Terraform сравнивает желаемое состояние с реальным (через state) и делает минимум изменений. Изменили instance_type — он пересоздаст инстанс. Удалили ресурс из конфига — он его удалит.

State-файл (terraform.tfstate) — это память Terraform. Без него он не знает, что уже создано. Важно хранить его в надёжном месте, лучше в S3 или Terraform Cloud.

Ansible: push-модель, agentless

Ansible не требует агента на целевых машинах — только SSH и Python. Вы запускаете плейбук с control node, Ansible сам заходит на хосты и выполняет задачи.

- name: Настройка веб-сервера
  hosts: webservers
  become: yes
  tasks:
    - name: Установить Nginx
      apt:
        name: nginx
        state: present

    - name: Скопировать конфиг
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      notify: restart nginx

  handlers:
    - name: restart nginx
      service:
        name: nginx
        state: restarted

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

Как использовать вместе

Самый правильный паттерн — использовать оба инструмента, каждый на своём уровне.

  1. Terraform создаёт инфраструктуру: VM, сети, security groups, IP-адреса
  2. Ansible настраивает эти машины: устанавливает ПО, разворачивает приложения, правит конфиги
# Шаг 1: поднимаем инфраструктуру
terraform apply

# Шаг 2: получаем IP новых машин и передаём в Ansible
terraform output -json instance_ips | python3 gen_inventory.py > inventory.ini

# Шаг 3: настраиваем машины
ansible-playbook -i inventory.ini site.yml

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

Ansible-коллекции

Отдельно стоит упомянуть Ansible Collections — это способ распространять роли, модули и плагины как единый пакет. Устанавливаются через ansible-galaxy:

ansible-galaxy collection install community.general
ansible-galaxy collection install community.docker

Коллекция community.docker позволяет управлять контейнерами прямо из плейбука, не пиша shell-команды. Коллекция community.postgresql — базами данных. Это сильно сокращает количество велосипедов в плейбуках.

Анти-паттерны

Не надо делать так:

Создавать VM через Ansible (community.general.terraform или azure_rm_virtualmachine модули) — это возможно, но вы теряете state и идемпотентность на уровне инфраструктуры.

# Плохо: создание инфраструктуры через Ansible
- name: Создать VM (так делать не стоит)
  azure_rm_virtualmachine:
    resource_group: myRG
    name: myVM
    ...

И обратное: настраивать конфиги приложений через local-exec в Terraform. Terraform для этого не предназначен, это превращается в нечитаемый ужас.

Pulumi и CDK: стоит знать

Terraform и Ansible — не единственные игроки. Pulumi позволяет писать инфраструктуру на обычных языках программирования (Python, TypeScript, Go). AWS CDK делает то же самое, но только для AWS. Если в вашей команде сильные разработчики и слабые ops — Pulumi может быть удобнее HCL.

Но для большинства задач Terraform + Ansible — проверенная классика, с огромным сообществом и документацией.

Итог

  • Создаёте облачные ресурсы → Terraform
  • Настраиваете ОС и приложения → Ansible
  • Полный цикл развёртывания → Terraform + Ansible вместе

Попробуйте начать с небольшого проекта: Terraform создаёт одну VM, Ansible ставит на неё Nginx. Это даст интуицию за пару часов.

4 Ответа

  1. Хорошее сравнение, но я бы добавила про Pulumi отдельную статью. Мы перешли на него с Terraform и для питонистов это реально удобнее, особенно когда логика инфраструктуры сложная.

  1. AWS CDK кстати тоже заслуживает внимания, если работаете только с амазоном. Конструкты высокого уровня сильно сокращают количество кода по сравнению с голым CloudFormation.

  1. Про коллекции спасибо что упомянул, многие вообще не знают что community.postgresql существует и пишут кучу shell-задач руками там где можно использовать готовый модуль.

  1. А если я только начинаю, с чего лучше начать — с Ansible или Terraform? Хочу в DevOps, но не знаю что учить первым.