GitOps стал де-факто стандартом для управления инфраструктурой и приложениями через Git как источник истины. В рамках РФ-предприятий и государственных/квазигосударственных контуров особенно важно выстроить управляемый жизненный цикл изменений: от репозитория к среде, с предсказуемыми откатами, журналированием и разграничением доступа. Ниже рассмотрим, как выстроить GitOps-подход для инфраструктуры на Terraform и Ansible и связать его с Argo CD для доставки веб‑приложений.
Подход рассчитан на работу в Kubernetes/контейнерной среде (как целевой площадке для Argo CD), при этом инфраструктуру можно поднимать как in-cloud, так и в облаках/виртуализации, где Terraform и Ansible остаются уместными.
Целевой принцип GitOps и модель ответственности
GitOps подразумевает, что:
- Состояние (desired state) описывается в Git (репозитории).
- Деплой выполняется автоматически контроллерами (Argo CD и GitOps-операторы для Terraform/Ansible).
- Фактическое состояние наблюдается и сравнивается с ожидаемым.
- Все изменения проходят через контролируемый процесс (PR/approval), с возможностью аудита.
В практической архитектуре удобно разделить ответственность:
- Приложения: манифесты Helm/Kustomize, образы, настройки ingress, конфигурации — под Argo CD.
- Инфраструктура: модули Terraform (VPC/сети/БД/кластер/секреты/сертификаты на уровне инфраструктуры) — под GitOps-исполнением Terraform.
- Конфигурация хостов/переобвязка сервисов: Ansible playbooks для системы/агентов/сертификатов/параметров — под GitOps-исполнением Ansible.
Такое разделение снижает связность и упрощает поддержку соответствия требованиям по управляемости и прослеживаемости изменений.
Рекомендуемая архитектура (high-level)
Базовая схема:
- Репозитории Git: отдельно (или логически разделено) хранятся манифесты приложений, инфраструктурные модули, environment/overlays и policy-правила.
- Argo CD отслеживает манифесты приложений и применяет их в кластере.
- GitOps для Terraform: используется controller/operator, который запускает план/применение на основе изменений (часто: Terraform plan в виде артефакта + terraform apply с ручным подтверждением через policy-approval).
- GitOps для Ansible: применяет playbooks при изменениях inventory/vars, желательно с управлением через отдельный контроллер (или через job-оркестратор, интегрированный с Git и очередями).
- Секреты: управляются через безопасное хранилище (например, интеграция с секретами Kubernetes, Vault или облачными секретами) и не хранятся в открытом виде в Git.
- Ограничения и безопасность: RBAC в Argo CD, ограничение кто и что может применять изменения, обязательные проверки (policy-as-code).
Структура Git-репозиториев
Для масштабируемости обычно используют multi-repo подход либо монорепозиторий с четкой структурой. Пример логической структуры monorepo (упрощенно):
repo-root/
apps/
web-portal/
overlays/
dev/
kustomization.yaml
values.yaml
prod/
kustomization.yaml
values.yaml
base/
deployment.yaml
service.yaml
ingress.yaml
infra/
terraform/
modules/
vpc/
rds/
eks/
live/
dev/
main.tf
variables.tf
outputs.tf
prod/
main.tf
variables.tf
outputs.tf
ansible/
playbooks/
site.yml
inventories/
dev/
hosts.ini
group_vars/
all.yml
prod/
hosts.ini
group_vars/
all.yml
policies/
opa/
app.rego
terraform.rego
rules/
README.md
Рекомендации:
- В live-директориях Terraform хранятся окружение-специфичные значения и ссылочные зависимости (remote state, провайдеры, workspace).
- Для Ansible аналогично: inventory и group_vars на окружение, без секретов в открытом виде.
- Раздел policies — для policy-as-code (например, OPA) и правил верификации до применения.
Argo CD для веб‑приложений: как организовать поставку
Argo CD удобно использовать как единый интерфейс для доставки приложений: он выполняет:
- синхронизацию (sync) desired state из Git;
- слежение за дрейфом (drift) между Git и кластером;
- управление rollout и зависимостями через hooks (в рамках допустимого);
- журналирование и аудит действий (при корректной настройке).
Типовая схема для приложений на Helm/Kustomize:
# Пример Argo CD Application (упрощенно)
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: web-portal-dev
namespace: argocd
spec:
project: default
source:
repoURL: 'ssh://git.example.local/repo-root.git'
targetRevision: dev
path: apps/web-portal/overlays/dev
kustomize:
namePrefix: dev-
destination:
server: 'https://kubernetes.default.svc'
namespace: web-portal-dev
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
Важно: для инфраструктурных изменений лучше не включать «автоматический apply» без gate-проверок. Для приложений automated sync часто допустим, но с ограничениями через PR-approval и policy-checks.
GitOps для Terraform: планирование и применение по правилам
Ключевая задача — сделать применение Terraform воспроизводимым и контролируемым:
- terraform plan должен формироваться на основе Git и фиксироваться (как артефакт) для последующего контроля.
- terraform apply желательно выполнять только после прохождения approval (ручного или через правила).
- Используйте remote state с блокировками, чтобы исключить конкурентные apply.
- Сохраняйте соответствие принципам наименьших привилегий для учетных записей, исполняющих Terraform.
Пример конфигурации Terraform remote state (идея):
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "dev/infra/terraform.tfstate"
region = "ru-central"
dynamodb_table = "terraform-locks"
encrypt = true
}
}
Если используете workspaces:
terraform {
required_version = ">= 1.7.0"
}
# В контроллере GitOps задается workspace=dev|prod
На уровне GitOps-контроллера обычно внедряют цепочку:
- Событие в Git (push/merge) в ветку окружения.
- Запуск plan.
- Проверки policy-as-code (например, запрет открытых портов, обязательное включение шифрования, соблюдение именования).
- При успешных проверках — apply (или выдача manual approval для apply).
GitOps для Ansible: конфигурация как код и управление изменениями
Ansible в GitOps используется для конфигурации систем, донастройки агентов, установки зависимостей на виртуальные машины/бастионы/отдельные хосты. Чтобы удержать GitOps-идею, применяйте:
- строгое разделение playbooks и inventories;
- запрет на хранение секретов в репозитории;
- идемпотентность задач (ключевая для GitOps и дрейф-контроля);
- управление выполнениями через контроллер или orchestrator с журналированием.
Пример playbook-скелета (упрощенно):
- name: Configure web agents
hosts: all
become: true
tasks:
- name: Ensure packages installed
ansible.builtin.apt:
name:
- curl
- ca-certificates
state: present
update_cache: true
- name: Configure app config
ansible.builtin.template:
src: templates/app.conf.j2
dest: /etc/myapp/app.conf
mode: "0640"
notify: restart myapp
handlers:
- name: restart myapp
ansible.builtin.service:
name: myapp
state: restarted
Для GitOps запуска удобно привязать выполнение к изменениям в папках окружения: например, изменения в ansible/inventories/prod инициируют pipeline только для prod.
Связка Terraform/Ansible с Argo CD: как избежать гонок и зависимостей
Самая частая проблема в связке infra и apps — неправильная очередность: приложение может стартовать раньше, чем создан ресурс (сеть/БД/кластер). Для решения:
- Единый dependency layer: моделируйте зависимости через этапы pipeline.
- Факт создания инфры: Terraform должен подтверждать готовность (выходы outputs, проверка health).
- После apply Terraform запускается синхронизация Argo CD приложений.
- После Ansible (если он настраивает хосты/агенты или сертификаты) — повторная sync приложений или отдельный шаг.
Практически это реализуют в CI/CD как orchestration (даже если основная идея GitOps — контроллеры). Альтернатива — события/вебхуки между системами (Terraform apply → инициировать sync у Argo CD). Главное — добиться предсказуемого порядка и иметь аудит.
Безопасность: секреты, доступы и аудит
С точки зрения соответствия законодательным и организационным требованиям, критичны следующие аспекты:
- Секреты: не хранить пароли/ключи в Git. Использовать шифрование на стороне хранилища и интеграцию с runtime (Kubernetes Secrets/Vault/облачные secret managers).
- RBAC: в Argo CD настроить роли (Project-level), ограничить кто может синхронизировать/делать ручной rollback.
- Минимальные привилегии: сервисные аккаунты Terraform/Ansible и учетные записи CI должны иметь ровно необходимые права.
- Аудит: фиксировать, кто инициировал PR, кто одобрил, когда применили Terraform, когда выполнен sync Argo CD.
- Шифрование: включать шифрование at-rest и transit; следить за настройками TLS для ingress и внутренних соединений.
Отдельно стоит учесть, что в РФ на практике часто предъявляются требования к средствам криптографической защиты и их применению. Если ваша организация работает с ГОСТ-ориентированными требованиями или реестрами, закладывайте это на этапе выбора TLS-терминации, библиотек и конфигураций (и согласуйте с ИБ/комплаенсом).
Соответствие актуальному законодательству РФ (практический контур)
При разработке и внедрении GitOps-решения важно согласовать архитектуру с правовыми требованиями РФ и внутренними нормативами заказчика. Ниже — практический чеклист, который обычно помогает пройти комплаенс:
- Персональные данные: если в веб‑приложениях обрабатываются ПДн — обеспечьте законные основания, назначение операторов/обработчиков, политики хранения/удаления, меры защиты, а также разграничение доступа к логам и конфигурациям.
- Защита информации: включите контроль доступа, ведение журналов, шифрование каналов, ограничение сетевых маршрутов, безопасную обработку секретов.
- Критическая инфраструктура/сегментация: при необходимости — изоляция контуров CI/CD и GitOps-контроллеров, сегментация сетей, whitelisting исходящих соединений.
- Аудит изменений: Git (PR) + журнал применений (Terraform/Ansible runs) + журнал Argo CD sync/rollback.
- Резервное копирование: state Terraform, бэкапы конфигураций, возможность восстановления.
Рекомендуется: на стороне заказчика провести формализацию требований ИБ и юридического контура (в т.ч. по классификации информации), а затем закрепить их в policy-as-code и процедурах (approval, запреты, обязательные проверки).
Pipeline и процесс внедрения: от репозитория до продакшена
Типовой pipeline GitOps (с gates):
- Developer вносит изменения в Git (apps/ infra/ ansible/).
- PR проходит проверки линтера/тестов (например, yamllint, terraform validate, ansible-lint).
- Policy checks: OPA/Conftest/валидаторы проверяют запреты (например, публичные IP, отсутствие шифрования, несоблюдение стандартов).
- Terraform plan формируется и прикладывается к PR или сохраняется как артефакт.
- Approval (ручной или автоматический по правилам).
- Terraform apply выполняется строго для целевого окружения.
- Ansible run выполняется при изменениях конфигураций и при готовности целевых ресурсов.
- Argo CD sync для приложения и инфраструктурно-зависимых ресурсов.
- Post-checks: health checks, smoke tests, мониторинг и алертинг.
Практические артефакты: что именно должно быть в Git
Чтобы Git действительно был источником истины:
- манифесты приложений (Helm values/Kustomize overlays);
- Terraform модулей и окружений (live);
- Ansible inventories и параметры конфигураций (без секретов);
- наборы policy правил (OPA/Rego, Conftest, ограничения форматирования);
- документация окружений (минимально необходимая для запуска/поддержки).
Не стоит хранить в Git:
- секреты и приватные ключи;
- динамически генерируемые сертификаты без защищенного хранилища;
- объекты, зависящие от runtime и не предназначенные для воспроизводимости (например, большие бинарные артефакты — используйте artifact registry).
Наблюдаемость и контроль дрейфа
GitOps выигрывает, если вы можете видеть расхождения. Встроенные механизмы:
- Argo CD: self-heal и сравнение live-состояния с Git.
- Terraform: контроль через plan/apply и хранение state.
- Трассировка изменений: связка commit SHA → run ID (Terraform/Ansible) → sync ID (Argo CD).
Важно обеспечить мониторинг:
- метрики доступности приложения;
- метрики времени деплоя и частоты rollbacks;
- алерты на failed sync/failed apply.
Типовые ошибки и как их избежать
- Секреты в Git: приведет к утечкам и проблемам комплаенса. Используйте безопасные secret managers и шифрование.
- Отсутствие policy gates: вы не сможете гарантировать стандарт безопасности в масштабе.
- Одновременные apply: без remote state lock-контура Terraform возможны конфликты. Всегда используйте блокировки.
- Гонки зависимостей: приложение поднимается до готовности инфраструктуры — лечится зависимостями pipeline и health-checks.
- Неидемпотентные Ansible playbooks: GitOps ломается при “дрейфе” из-за неконтролируемых изменений. Проверьте idempotency.
Заключение
Внедрение GitOps для Terraform и Ansible в связке с Argo CD дает управляемость и предсказуемость: инфраструктура и приложения развиваются через pull request, изменения проходят проверки, а фактическое состояние стремится к желаемому. Для соответствия актуальному законодательству РФ и требованиям ИБ критично выстроить безопасное обращение с секретами, RBAC, аудит изменений и policy-as-code, а также согласовать классификацию данных и меры защиты.
Если нужна помощь в проектировании целевой архитектуры, настройке процессов PR/approval, разработке модулей Terraform/ролей Ansible, а также интеграции Argo CD и контроллеров GitOps — команда РыбинскЛАБ готова взять задачу «под ключ» по разработке.
Услуги РыбинскЛАБ по разработке помогут внедрить GitOps-подход для вашей инфраструктуры Terraform и Ansible в сочетании с Argo CD для веб‑приложений.