Как структурировать связанный с DevOps код и конфиги в хранилище кода?

10

Мы растем как компания, наши продукты расширяются, а также расширяются наши действия и усилия, связанные с DevOps - мы перешли с Bamboo на более гибкий и настраиваемый Jenkins, используя конвейеры развертывания и другие плагины; переключился на Ansible и начал использовать Docker тут и там внутри.

Все эти вещи требуют некоторого уровня кодирования или конфигурации - скрипты Ansible и конфиги, скрипты Jenkins groovy, конфиги Dockerfiles и YAML.

В настоящее время, мы создали отдельные «опа» репозиторий с каталогами высокого уровня для jenkins, ansible, dockerи other(что это страшное название, но сейчас все автоматизации «другие» DevOps есть).

Наш подход не выглядит правильным и может не масштабироваться, но каковы наилучшие практики и рекомендации для сохранения кода, связанного с DevOps, в репозитории или репозиториях кода?

alecxe
источник
6
Я использую метод «каждая часть - приложение, одно репо на приложение», что означает «1 репо на кулинарную книгу».
Тенсибай
@ Тензибай, верно, я боялся, что одно репо "ops" быстро станет непрактичным. Спасибо.
alecxe
1
Это была традиционная форма управления кулинарной книгой от шеф-повара, 1 репо со всей кулинарной книгой, и в большинстве случаев она доказала, что в ней произошла перемена, но мне не очень удобно говорить, что она подойдет и для конвейеров Jenkins (если v2) и Файлы докеров должны соответствовать проекту, который они обрабатывают IMO, и я не представляю, что вы помещаете под другие, поэтому я не могу дать здесь никаких советов
Tensibai
@ Тенсибай понял! Другое состоит в основном из утилит bash и python или периодически выполняемых сценариев для нескольких внутренних инструментов. Они никуда не годятся, и мы не можем придумать лучшего места, чем «другие». Я посмотрю, смогу ли я опубликовать содержимое из каталогов в вопрос, а также. Спасибо.
Алексей
1
Я бы разделил их по нескольким репо по «аффинности» работы, скрипты работали над приложением X вместе, у вас может быть скрипт, используемый в двух приложениях, но если приложение A меняет способ, которым скрипт должен обрабатывать приложение, с которым он общается лучше иметь две отдельные версии, поэтому ATEOTD я бы сохранял их вместе с приложением, к которому они относятся, или если они охватывают несколько приложений в определенном репозитории для каждой задачи, поэтому у вас всегда есть версия в соответствии с развернутыми приложениями, и вы не не нужно помечать несвязанный скрипт одновременно.
Тенсибай

Ответы:

4

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

Причина этого заключается в том, что мы хотим рассматривать артефакты ( например, образ докера или программный пакет) как объекты следующих глаголов:

  • строить
  • тестовое задание
  • развернуть

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

Например, репозиторий, содержащий код для веб-сайта и микросервис «а», может иметь следующие подкаталоги, предназначенные для операций:

./ops/website
./ops/micro-service-a

каждый из которых имеет три сценария называется build, testи deploy. Теперь, когда организация элементов автоматизации как-то прояснена, давайте обратим наше внимание на конфигурацию.

Основные условия и требования к организации конфигурации устанавливаются deployглаголом при применении к сервисоподобному артефакту. deployГлагол должен иметь следующие параметры:

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

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

Михаэль Ле Барбье Грюневальд
источник
5

Я могу ответить на вопрос о docker, одна из лучших практик использования docker - хранить файл docker и файлы compose в одном и том же хранилище проекта, поэтому, где бы вы ни клонировали проект, вы можете создать образ docker, и это хорошо для например, сохраните несколько версий файлов составления Docker (prod, staging, dev), чтобы вы могли создать образ и запустить контейнер с определенной опцией для каждого env, например, для машины dev вы можете использовать определенную сеть и запускать контейнер дополнительных зависимостей или любой другой.

Виссам Ружула
источник
4

Код каждого инструмента идет в свой репо. например

  1. Дженкинс Groovy шаблон в репо Дженкинс
  2. Ansible YAML playbooks в собственном репо (с ролями, задачами, подкаталогами инвентаря)
  3. Шаблоны Cloudformation / Terrform в своем репо
  4. Docker файлы в своем собственном 5 .. И так далее

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

Это даст вам более детальный контроль и перегрузит все ваши издержки управления версиями в системы контроля версий. Также создайте отдельные ветви для каждой среды и пометьте код для каждого производственного выпуска (как мы делаем для базы кода приложения). Думайте Инфра и обрабатывайте в терминах кода. (Любое изменение в процессе должно быть кодифицировано и отправлено в QA, SIT, UAT, а затем в PROD) аналогично приложению.

Например, у вас может быть V2.1 Ansible, работающий в Production (основная ветка), но V2.0 Docker-контейнеров, работающий в Prod (главная ветка)

Точно так же храните ваши скрипты БД / скрипты bash в своих собственных репозиториях, и, возможно, вы можете настроить файл проверки работоспособности (JSON / YAML) для отображения версий всех инструментов / частей в каждом развернутом URL-адресе для целей отслеживания и автоматизации. (Так что ваши webhooks читает URL и автоматизирует развертывания)

Амин Ибрагим Рафик - «ВОЗДУХ»
источник
2
Подводный камень этого подхода в том, что v2.1 находится в qa и не проверен, и вам необходимо срочно исправлять выпуск, вы не можете изменить v2.0, и если вы делаете v2.2 для этого патча, существует высокий риск его появления. потерян или перезаписан, когда v2.1 поступит в производство, умножьте на количество отдельного кода в репо, и у вас скоро будет кошмар бэкпортов (это работает, но я должен был добавить этот отказ от ответственности :))
Tensibai
3
Использование веток для отслеживания информации, относящейся к среде / развертыванию, для меня выглядит как шаблон муравья: если у нас есть 20 сред, это означает, что у нас есть 20 ветвей для синхронизации ... вероятный источник ошибок и путаницы. Не могли бы вы объяснить, почему вы не используете файлы конфигурации для отслеживания информации, относящейся к среде / развертыванию, и каков ваш рабочий процесс, работающий с этими ветвями? Это не тривиальные проблемы!
Михаэль Ле Барбье Грюневальд
3

Различение между Ops, Dev и DevOps способствует изоляции и формирует мышление «брось через стену». Для расширения сотрудничества между командами необходимо поместить в репозиторий все необходимое для сборки и развертывания проекта.

Сказав это, ответ на вопрос:

Как структурировать связанный с DevOps код и конфиги в хранилище кода?

в том, что если для запуска проекта требуется config, его следует поместить в тот же каталог.

030
источник