We detected you are likely not from a Russian-speaking region. Would you like to switch to the international version of the site?

К списку статей

Внедрение GitOps подхода для инфраструктуры Terraform и Ansible в сочетании с Argo CD для веб‑приложений

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)

Базовая схема:

  1. Репозитории Git: отдельно (или логически разделено) хранятся манифесты приложений, инфраструктурные модули, environment/overlays и policy-правила.
  2. Argo CD отслеживает манифесты приложений и применяет их в кластере.
  3. GitOps для Terraform: используется controller/operator, который запускает план/применение на основе изменений (часто: Terraform plan в виде артефакта + terraform apply с ручным подтверждением через policy-approval).
  4. GitOps для Ansible: применяет playbooks при изменениях inventory/vars, желательно с управлением через отдельный контроллер (или через job-оркестратор, интегрированный с Git и очередями).
  5. Секреты: управляются через безопасное хранилище (например, интеграция с секретами Kubernetes, Vault или облачными секретами) и не хранятся в открытом виде в Git.
  6. Ограничения и безопасность: 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-контроллера обычно внедряют цепочку:

  1. Событие в Git (push/merge) в ветку окружения.
  2. Запуск plan.
  3. Проверки policy-as-code (например, запрет открытых портов, обязательное включение шифрования, соблюдение именования).
  4. При успешных проверках — 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 — неправильная очередность: приложение может стартовать раньше, чем создан ресурс (сеть/БД/кластер). Для решения:

  1. Единый dependency layer: моделируйте зависимости через этапы pipeline.
  2. Факт создания инфры: Terraform должен подтверждать готовность (выходы outputs, проверка health).
  3. После apply Terraform запускается синхронизация Argo CD приложений.
  4. После 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):

  1. Developer вносит изменения в Git (apps/ infra/ ansible/).
  2. PR проходит проверки линтера/тестов (например, yamllint, terraform validate, ansible-lint).
  3. Policy checks: OPA/Conftest/валидаторы проверяют запреты (например, публичные IP, отсутствие шифрования, несоблюдение стандартов).
  4. Terraform plan формируется и прикладывается к PR или сохраняется как артефакт.
  5. Approval (ручной или автоматический по правилам).
  6. Terraform apply выполняется строго для целевого окружения.
  7. Ansible run выполняется при изменениях конфигураций и при готовности целевых ресурсов.
  8. Argo CD sync для приложения и инфраструктурно-зависимых ресурсов.
  9. 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 для веб‑приложений.

Материал подготовлен и отредактирован для практического применения. Перед внедрением в продакшен проверьте код и команды на своём окружении.

Поделиться материалом

Нужна сложная backend-разработка?

Проектирование архитектуры, PHP/Python backend, интеграции API, боты, автоматизация и оптимизация существующих систем.

Обсудить проект
Поддержать проект