Ответ
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):
- 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" } } - 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 — для приведения созданных виртуальных машин или контейнеров в рабочее состояние с установленным и настроенным приложением.