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 идемпотентен — запускайте плейбук хоть каждый час, он применит только то, что не соответствует желаемому состоянию.
Как использовать вместе
Самый правильный паттерн — использовать оба инструмента, каждый на своём уровне.
- Terraform создаёт инфраструктуру: VM, сети, security groups, IP-адреса
- 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. Это даст интуицию за пару часов.
Хорошее сравнение, но я бы добавила про Pulumi отдельную статью. Мы перешли на него с Terraform и для питонистов это реально удобнее, особенно когда логика инфраструктуры сложная.