Реализация платформы IaC с использованием Terraform, Ansible и GitLab

В связи с тем, что необходимо создавать инфраструктуру в нескольких средах, сохраняя при этом стандартизацию и эффективное мониторинг, важно обеспечить безопасное размещение этих средств. Для достижения этого важно принять подход к неизменяемой инфраструктуре, где среды обеспечиваются как код.

Целью этой статьи является демонстрация возможного подхода для достижения этого, используя структуры GitLab для обеспечения шаблонов и стандартов, Terraform для применения и поддержания стандартов на серверах, и Ansible для программного обеспечения и настройки, используя общий модель ролей в репозиториях. Чтобы управлять состоянием машин с Terraform, мы используем MinIO, поскольку он позволяет реализовать этот подход на локальной основе.

Дизайн архитектуры

Шаг 1

Процесс всегда начинается с подачи стандартизированного вопроса, где указывается используемая модель коммутатора, необходимость разрешений для брандмауэра и whether it’s a new setup or just a resource upgrade.

Шаг 2

Operator reviews the issue and begins the process. All conversations and time spent are logged within the issue.

Шаг 3

В GitLab начато новое проектирование, основанное на модели инфраструктуры, которая будет создана. Этот проект размещен в соответствующей группе в GitLab, где он наследует необходимые средовые переменные для стандартизированного создания инфраструктуры.

Шаг 4

при создании проекта вам достаточно указать IP-адреса для инфраструктуры, которая будет создана в указанной среде в задаче (KVM, VMware). После планирования с помощью Terraform создаются необходимые ресурсы, включая добавление метки, если она требуется, для Veeam, чтобы она осуществляла резервное копирование на основе политик метки. По завершении сохраняется состояние созданной инфраструктуры в контейнере.

Шаг 5

Следующим шагом является выполнение стандартных задач для всех серверов, таких как идентификация, обновление пакетов, установка необходимых утилит и регистрация узла в Zabbix для базового мониторинга операционной системы и стека. В зависимости от группы ресурсов назначаются соответствующие ключи доступа оперативному персоналу. Например, DBAs получают ключи доступа для серверов баз данных.

Шаг 6

На основе выбранной модели осуществляется процесс установки и настройки всего стека. Аналогично, создаются пользователи и, при необходимости, регистрируются ключи учетных данных в Vault.

Шаг 7

Приложение теперь работает в новой среде, и можно выполнять специфическое мониторинг для каждой стек, регистрируя новый сервер в Consul. В свою очередь Prometheus определяет, где он должен собирать информацию. Каждая стек имеет свой уже настроенный мониторинговый dashboard, различающийся только именем проекта, который был создан.

Шаг 8

Новая инфраструктура доставляется запрашивающему. В случае с базами данных данные доступа предоставляются непосредственно в Vault.

Структура проекта

Структура папок в GitLab организована следующим образом:

  • /infrastructure/: Основной каталог, где должны храниться глобальные environment variables и default values
  • /infrastructure/gitlab-models: Модели потоков, где есть два основных проекта
    • ansible-pipelines: Проект, посвященный обслуживанию стеков и составлению ролей.

На рисунке выше мы видим пример общих задач. В структуре он располагается по пути:
/infrastructure/gitlab-models/ansible-pipelines/common-task/provision.yml

  • terraform-pipelines: Потоки инфраструктуры для доступных моделей, таких как vSphere, KVM, AWS и т. д.

В изображении выше показано пример потока, который находится в группе terraform-pipelines, например, kvm-terraform-pipeline.yml. Как我们可以 see, это модель GitLab CI, которая должна быть расширена в потоке стека.

  • /infrastructure/templates: В этом наборе мы имеем проекты для бутоstrap, которые будут использоваться для создания моделей стека.

  • /infrastructure/provision/ansible/roles: В этом проекте только имеются роли Ansible, которые позволяют централизовать и обновлять роли в изолированном порядке.
  • /infrastructure/dependencies-iac: Это хранение содержимого репозитория содержит зависимости платформы, такие как Dockerfile для Terraform и Ansible, которые обеспечивают неизменяемость версий необходимых инструментов и библиотек.
  • /infrastructure/modules/: Здесь сохраняются модули для Terraform, и каждый проект имеет свой соответствующий каталог.
  • /infrastructure/on-premise/: Эта группа является местом содержания созданных инфраструктур, и разделена по средам, центрам данных, потокам и проектам. На изображении我们可以 see иерархию групп и подгрупп до концального проекта. В каждом из этих уровней мы можем изменить значения переменных, связанных с группами.

Как Использовать Platform

Чтобы упростить использование платформы, мы создали репозиторий под названием issues-ops, где мы предоставляем шаблон запроса, который может быть выбран на основе специфических потребностей. Таким образом, запрос инфраструктуры записывается сразу.

После создания вопроса, команда DevSecOps может начать установку среды. Для этого им просто нужно перейти к соответствующей группе, в данном случае infrastructure/on-premise/staging/dc1/loadbalancer/nginx, и создать новый проект на основе шаблона. Затем им следует указать имя проекта, который будет создан, и назначить необходимые переменные.

В каждом шаблоне уже настроен файл .gitlab-ci.yml, необходимый для создания среды. В случае с NGINX он настроен в следующем формате.

В этом настройке включены как инфраструктурные шаблоны, так и шаблоны Ansible, что обеспечивает, чтобы默认角色 уже были интегрированы в эти проекты. Кроме того, мы предоставляем шаги для расширения модели. Если требуется установить дополнительные роли, вы можете просто добавить соответствующий блок, внедряя модульный, строительный подход к конфигурации.

На рисунке ниже мы видим поток, который выполнил запрошенное создание среды. Вы заметите, что authorized_keys и common были выполнены, даже though их не было явно объявлено в .gitlab-ci.yml. Это потому, что у нас есть стандартные роли, импортируемые из шаблона Ansible, которые обеспечивают применение default ролей во всех проектах.

Заключение

Инфраструктурная платформа значительно внесла вклад в поддержание и обеспечение стандартов, поскольку она требует, чтобы для планирования, тестирования, внедрения и сделания доступным как шаблона был предопределен модель до тех пор, пока не может быть создан новый инфраструктурный объект. Этот процесс делает внедрение ресурсов в среду стандартизированным, контролирует версицирование этих средних условий и обеспечивает их надежное восстановление при необходимости.

Одна из основных проблем состоит в том, чтобы поддерживать и проверять модели в свежем состоянии, особенно когда приложения развиваются и версии операционных систем меняются. Очень важно помнить, что при использовании инфраструктуры как кода все изменения должны происходить через нее, чтобы обеспечить версицирование правильного конфигурационного состояния и неизменчивость среды. Отсутствие такого подхода может привести к тому, что платформа откатит среду к ее определенному состоянию, тем самым могучим переопределить ручные изменения.

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

Source:
https://dzone.com/articles/implement-an-iac-platform-with-terraform-ansible-gitlab