Перейти к содержанию
Innovialabs

Terraform или Ansible: в чем разница и как использовать вместе

Основы4 мин

Коротко

Terraform создает и меняет инфраструктуру (серверы, сети, базы, DNS) и хранит ее состояние, а Ansible настраивает то, что уже создано (пакеты, файлы, сервисы); на практике Terraform поднимает ресурсы, а Ansible доводит их до рабочего вида.

Короткий ответ

Terraform отвечает на вопрос «какая инфраструктура должна существовать»: виртуальные машины, сети, балансировщики, managed-базы, DNS-записи, бакеты. Ansible отвечает на вопрос «что должно быть внутри сервера»: установленные пакеты, конфиги nginx, пользователи, systemd-сервисы, выкладка приложения.

Первое называют provisioning (создание ресурсов), второе — configuration management (управление конфигурацией). Это не конкуренты, а два слоя одной задачи.

Provisioning и configuration: в чем разница

TerraformAnsible
Основная задачаСоздать, изменить, удалить ресурсы облакаНастроить ОС и приложения на хостах
ПодходДекларативный: описываете итоговое состояниеПроцедурный по форме (задачи по порядку), идемпотентный по смыслу
СостояниеХранит state-файлНе хранит состояние, каждый раз проверяет хост
Как подключаетсяЧерез API провайдеров (AWS, GCP, Yandex Cloud и др.)По SSH (или WinRM) к хостам
ЯзыкHCLYAML-плейбуки
Агент на сервереНе нуженНе нужен

State против stateless

Terraform хранит state — файл, в котором записано, какие реальные ресурсы соответствуют вашему коду. Благодаря этому terraform plan показывает точную разницу: что будет создано, изменено и удалено. Удалили ресурс из кода — Terraform удалит его и в облаке.

Цена этого подхода:

  • state нужно хранить в удаленном бэкенде (S3-совместимое хранилище, Terraform Cloud и т. п.) с блокировкой, а не в репозитории;
  • в state могут попадать секреты, поэтому доступ к нему ограничивают;
  • ручные изменения в консоли облака приводят к drift — расхождению кода и реальности.

Ansible не хранит состояние. Каждый запуск подключается к хосту и проверяет: пакет уже установлен? файл совпадает? Если да — ничего не делает. Это и есть идемпотентность. Минус: Ansible не знает, что вы убрали из плейбука. Если удалить задачу установки пакета, пакет останется на сервере — удалять нужно явно (state: absent).

Где инструменты пересекаются

Границы размыты:

  • у Ansible есть модули для облаков — им можно создавать виртуальные машины;
  • у Terraform есть user_data/cloud-init и provisioners — им можно выполнить скрипты на сервере.

Технически можно обойтись одним инструментом, но обычно это неудобно. Ansible без state плохо управляет жизненным циклом облачных ресурсов (особенно удалением), а provisioners в Terraform сама документация советует использовать как крайнюю меру.

Типичная схема: оба вместе

  1. Terraform создает сеть, виртуальные машины, балансировщик, базу данных и DNS.
  2. Terraform выводит IP-адреса через output или генерирует inventory для Ansible.
  3. Ansible подключается к новым машинам: ставит Docker или runtime, кладет конфиги, создает пользователей, включает мониторинг.
  4. Выкладку приложения делает CI/CD — тем же Ansible или отдельным пайплайном.

Простой пример связки:

output "web_ips" {
  value = aws_instance.web[*].public_ip
}
terraform apply
terraform output -json web_ips | jq -r '.[]' > hosts.txt
ansible-playbook -i hosts.txt site.yml

Для контейнерной инфраструктуры роль Ansible часто сужается: образы собираются в CI, а серверы почти не настраиваются вручную. Но базовую подготовку хостов (обновления, SSH, агенты мониторинга) Ansible по-прежнему закрывает удобно.

Частые ошибки

  • Хранить state локально или коммитить его в git — потеря файла или конфликт при работе вдвоем.
  • Править ресурсы руками в консоли, а потом удивляться плану Terraform.
  • Делать всю настройку серверов через provisioners — трудно отлаживать и повторять.
  • Писать Ansible-задачи через shell и command там, где есть готовый модуль — теряется идемпотентность.
  • Хранить секреты открытым текстом в переменных; используйте Ansible Vault или менеджер секретов.

Как выбрать

  • Нужно создавать и удалять облачные ресурсы, видеть план изменений — Terraform (или его открытый форк OpenTofu).
  • Есть парк серверов, которые надо одинаково настроить и поддерживать — Ansible.
  • Есть и то и другое — используйте оба, разделив зоны ответственности: Terraform до момента «машина существует», Ansible после.

Частые вопросы

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

Поможем с этим

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

Обсудить проект

Читайте также

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.