Ответ
Я применяю подход Infrastructure as Code (IaC) и практики GitOps для полной управляемости, повторяемости и контроля версий инфраструктуры.
Стек и рабочий процесс:
- Terraform — для provisioning облачных ресурсов (AWS VPC, S3, IAM). Код модульный, reusable.
- Ansible — для конфигурации виртуальных машин (патчинг, настройка ОС).
- Kubernetes Manifests / Helm — для оркестрации контейнеров. Использую Kustomize для управления окружениями.
- Git — единый источник истины. Вся инфраструктура описана в коде в одном репозитории (монорепо) или в нескольких с четкими зависимостями.
CI/CD для инфраструктуры:
- Разработчик создает Merge Request с изменениями в Terraform-коде.
- План (Plan): CI-пайплайн (GitLab CI/Jenkins) запускает
terraform planи выводит diff изменений в MR. - Верификация: Запускаются линтеры (tflint, checkov), модульные тесты.
- Применение (Apply): После апрува MR и мержа в основную ветку, пайплайн запускает
terraform applyдля соответствующего окружения (сначала staging, затем prod). - GitOps для K8s: Изменения в манифестах Kubernetes автоматически применяются в кластере операторами (ArgoCD, Flux). Кластер всегда стремится к состоянию, описанному в Git.
Пример структуры репозитория и модуля Terraform:
infra/
├── modules/
│ └── vpc/
│ ├── main.tf
│ ├── variables.tf
│ └── outputs.tf
└── environments/
├── staging/
│ └── main.tf # вызывает module "vpc"
└── production/
└── main.tf
Ключевые принципы: идемпотентность, минимальные привилегии (Terraform работает под отдельной IAM-ролью), обязательный review кода, и полное уничтожение тестовых сред по расписанию для экономии.