Интеграция CI/CD для доставки инфраструктуры

Для замыкания цикла GitOps используются конвейеры непрерывной интеграции и непрерывного развертывания (CI/CD), которые обеспечивают автоматическое применение изменений инфраструктуры.

Этапы конвейера CI/CD для OpenStack IaC

  1. Проверка синтаксиса и валидация
  2. Планирование и тестирование
  3. Проверка и утверждение
  4. Применение изменений
  5. Проверки после развертывания

Детальное описание этапов

1. Проверка синтаксиса и валидация

Используйте инструменты для выявления синтаксических ошибок на ранних стадиях.

# Для Ansible
ansible-lint playbooks/site.yml
yamllint playbooks/site.yml

# Для Terraform
terraform fmt -check
terraform validate

# Для Heat
openstack stack validate -t template.yaml

2. Планирование и тестирование

Просмотр изменений, которые будут применены.

# Для Terraform
terraform plan -out=plan.tfplan

# Для Ansible (режим проверки)
ansible-playbook --check --diff playbooks/site.yml

# Для Heat (тестовый запуск)
openstack stack create --dry-run -t template.yaml test-stack

Конвейеры также могут запускать временную тестовую среду в проекте-песочнице для проверки изменений.

3. Проверка и утверждение

Проверка результатов работы конвейера и предлагаемых изменений. Многие организации настраивают процедуру утверждения в системах CI, требующую разрешения человека для выполнения шагов применения.

approve:
  stage: approve
  script:
    - echo "Approving changes for production"
  when: manual
  only:
    - production

4. Применение изменений

Автоматическое выполнение изменений в зависимости от используемого инструмента.

# Для Terraform
terraform apply plan.tfplan

# Для Ansible
ansible-playbook playbooks/site.yml

# Для Heat (обновление существующего стека)
openstack stack update --wait -t template.yaml production-stack

# Для Heat (создание нового стека)
openstack stack create --wait -t template.yaml new-stack

5. Проверки после развертывания

Запуск дымовых тестов или проверок конфигурации для убеждения в работоспособности новой инфраструктуры.

# Проверка доступности сервисов
curl -f http://new-server.example.com/health

# Проверка через Ansible
ansible-playbook playbooks/post-deploy-checks.yml

# Проверка через OpenStack
openstack server list --name web-server

Инструменты CI/CD

Различные системы CI/CD могут управлять этими этапами:

Примеры конвейеров

GitLab CI/CD для Terraform

stages:
  - validate
  - plan
  - approve
  - apply

variables:
  TF_ROOT: ${CI_PROJECT_DIR}
  TF_ADDRESS: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/terraform/state/${CI_COMMIT_REF_NAME}

cache:
  key: "${CI_COMMIT_REF_SLUG}"
  paths:
    - ${TF_ROOT}/.terraform

before_script:
  - cd ${TF_ROOT}
  - terraform init -backend-config=address=${TF_ADDRESS}

validate:
  stage: validate
  script:
    - terraform fmt -check
    - terraform validate
    - tflint

plan:
  stage: plan
  script:
    - terraform plan -out=plan.tfplan
  artifacts:
    paths:
      - ${TF_ROOT}/plan.tfplan

approve:
  stage: approve
  script:
    - echo "Approving changes for ${CI_COMMIT_REF_NAME}"
  only:
    - production
  when: manual

apply:
  stage: apply
  script:
    - terraform apply plan.tfplan
  dependencies:
    - plan
  only:
    - main
    - production
  when: manual
  environment:
    name: production/${CI_COMMIT_REF_NAME}

GitLab CI/CD для Ansible

stages:
  - syntax-check
  - dry-run
  - deploy
  - verify

syntax-check:
  stage: syntax-check
  script:
    - ansible-lint playbooks/site.yml
    - ansible-playbook --syntax-check playbooks/site.yml

dry-run:
  stage: dry-run
  script:
    - ansible-playbook --check --diff playbooks/site.yml
  environment:
    name: staging

deploy:
  stage: deploy
  script:
    - ansible-playbook playbooks/site.yml
  only:
    - main
  when: manual
  environment:
    name: production

verify:
  stage: verify
  script:
    - ansible-playbook playbooks/verify.yml
  only:
    - main

GitLab CI/CD для OpenStack Heat

stages:
  - validate
  - deploy
  - verify

variables:
  STACK_NAME: "production-stack"
  TEMPLATE_FILE: "templates/production.yaml"
  ENVIRONMENT_FILE: "environments/production.yaml"

validate:
  stage: validate
  script:
    - openstack stack validate -t ${TEMPLATE_FILE} -e ${ENVIRONMENT_FILE}

deploy:
  stage: deploy
  script:
    - openstack stack create --wait -t ${TEMPLATE_FILE} -e ${ENVIRONMENT_FILE} ${STACK_NAME} ||
      openstack stack update --wait -t ${TEMPLATE_FILE} -e ${ENVIRONMENT_FILE} ${STACK_NAME}
  only:
    - main
  environment:
    name: production

verify:
  stage: verify
  script:
    - openstack stack show ${STACK_NAME}
    - openstack server list --stack ${STACK_NAME}
  only:
    - main

Маппинг веток на среды

Каждая ветка может соответствовать определенной среде:

├── dev/           # ветка dev → среда разработки
├── staging/       # ветка staging → предпроизводственная среда
└── main/          # основная ветка → производственная среда

Пример конфигурации:

.base-job: &base-job
  before_script:
    - cd environments/${CI_COMMIT_REF_NAME}

dev:deploy:
  <<: *base-job
  stage: deploy
  script:
    - terraform apply -auto-approve
  only:
    - dev
  environment:
    name: dev

staging:deploy:
  <<: *base-job
  stage: deploy
  script:
    - terraform apply -auto-approve
  only:
    - staging
  when: manual
  environment:
    name: staging

production:deploy:
  <<: *base-job
  stage: deploy
  script:
    - terraform apply -auto-approve
  only:
    - main
  when: manual
  environment:
    name: production

Безопасность и соответствие требованиям

Внедрение механизмов безопасности и проверок соответствия:

Open Policy Agent (OPA) с Terraform

opa-check:
  stage: validate
  script:
    - terraform plan -out=plan.tfplan -no-color > plan.txt
    - opa eval --data policies --input plan.txt "data.terraform.deny"
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'

Пример политики OPA (policies/terraform.rego):

package terraform

deny[msg] {
    resource := input.resource_changes[_]
    resource.type == "openstack_compute_instance_v2"
    resource.change.after.flavor == "m1.xlarge"
    msg = sprintf("禁止使用大规格实例 m1.xlarge: %v", [resource.address])
}

Проверка секретов

secret-detection:
  stage: validate
  script:
    - trufflehog filesystem --directory .
  allow_failure: false

Преимущества интеграции CI/CD для инфраструктуры

  1. Автоматизация: Устранение ручных ошибок и ускорение развертывания
  2. Прозрачность: Полная видимость изменений через пайплайны
  3. Воспроизводимость: Гарантия одинакового развертывания в разных средах
  4. Безопасность: Проверки до применения изменений
  5. Аудит: Полный контрольный след всех изменений
  6. Скорость: Быстрое развертывание и откат при необходимости
  7. Соответствие требованиям: Автоматические проверки политик