Terraform или Ansible: в чем разница и как использовать вместе
Основы4 минРедакция Innovialabs
Коротко
Terraform создает и меняет инфраструктуру (серверы, сети, базы, DNS) и хранит ее состояние, а Ansible настраивает то, что уже создано (пакеты, файлы, сервисы); на практике Terraform поднимает ресурсы, а Ansible доводит их до рабочего вида.
Короткий ответ
Terraform отвечает на вопрос «какая инфраструктура должна существовать»: виртуальные машины, сети, балансировщики, managed-базы, DNS-записи, бакеты. Ansible отвечает на вопрос «что должно быть внутри сервера»: установленные пакеты, конфиги nginx, пользователи, systemd-сервисы, выкладка приложения.
Первое называют provisioning (создание ресурсов), второе — configuration management (управление конфигурацией). Это не конкуренты, а два слоя одной задачи.
Provisioning и configuration: в чем разница
| Terraform | Ansible | |
|---|---|---|
| Основная задача | Создать, изменить, удалить ресурсы облака | Настроить ОС и приложения на хостах |
| Подход | Декларативный: описываете итоговое состояние | Процедурный по форме (задачи по порядку), идемпотентный по смыслу |
| Состояние | Хранит state-файл | Не хранит состояние, каждый раз проверяет хост |
| Как подключается | Через API провайдеров (AWS, GCP, Yandex Cloud и др.) | По SSH (или WinRM) к хостам |
| Язык | HCL | YAML-плейбуки |
| Агент на сервере | Не нужен | Не нужен |
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 сама документация советует использовать как крайнюю меру.
Типичная схема: оба вместе
- Terraform создает сеть, виртуальные машины, балансировщик, базу данных и DNS.
- Terraform выводит IP-адреса через
outputили генерирует inventory для Ansible. - Ansible подключается к новым машинам: ставит Docker или runtime, кладет конфиги, создает пользователей, включает мониторинг.
- Выкладку приложения делает 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 после.