Ответ
Мой выбор строится на нескольких ключевых критериях, которые я оцениваю для каждого проекта.
1. Целевая инфраструктура:
- Облако (AWS/Azure/GCP): Использую нативные инструменты (CloudFormation, ARM, Deployment Manager) для глубокой интеграции, но предпочитаю Terraform для мульти-облачных сценариев и из-за его декларативного подхода.
- Kubernetes: Для упаковки приложений — Helm. Для управления самим кластером в облаке — Terraform с провайдером Kubernetes.
- Виртуальные машины/серверы: Ansible для конфигурации, Packer для создания образов.
2. Сложность и состояние (State):
- Для инфраструктуры, где важно отслеживать состояние (созданные VPC, подсети, балансировщики), Terraform с удалённым бэкендом (например, S3) — обязательное условие. Он предотвращает дрифт конфигурации.
- Для конфигурации внутри уже созданных ресурсов (установка пакетов, настройка сервисов) лучше подходит идемпотентный Ansible.
3. Интеграция в CI/CD: Инструмент должен легко встраиваться в пайплайн (GitLab CI, GitHub Actions). Например, для Terraform этапы выглядят так:
# Пример этапа в GitLab CI
plan:
script:
- terraform init
- terraform plan -out=plan.tfplan
apply:
script:
- terraform apply plan.tfplan
when: manual # Ручное подтверждение для продакшена
4. Сообщество и поддержка: Приоритет у инструментов с активным сообществом, качественной документацией и большим количеством модулей/ролей (например, официальные Terraform Modules от AWS или Ansible Galaxy roles). Это ускоряет разработку и снижает риски.
Итоговый стек для типичного облачного проекта: Terraform (инфраструктура) + Helm (приложения в K8s) + Ansible (бэст-практисы на уровне ОС), связанные единым пайплайном.