Сегодня многие говорят о DevOps как о методологии, которая помогает разрушить «железный занавес» между IT отделном, QA и программистами и создать некий общий механизм, помогающий делать продукты быстрее и качественнее. Основная задача, которая встает перед DevOps разработчиком — это добиться максимальной автоматизации развертывания development. testing, production сред и переходов между ними. Соответственно одна из основных проблем в данном случае — это соблюсти полную идентичность сред разработки, тестирования и эксплуатации. Под катом приведу пример практического решения данной задачи, которое я использовал в нескольких компаниях в ходе интеграции DevOps методологии.
Так как речь идет о рабочем примере, сразу опишу те ограничения, которые задаются при решении данной задачи:
- Стабильная версия популярный rpm-based дистрибутиа с большим сообществом, где помогут решить типовые проблемы связанные с ОС. Был выбран CentOS, так как на текущий момент это самое популярный rpm-based дистрибутив.
- Возможность версионирования среды. Программисты занимались разработкой сразу нескольких форков продукта на CentOS 5 и CentOS 6
- Обязательный набор софта для корректной работы и разворачивания продукта (это пример, в реальности список был значильно больше):
Для CentOS 5:
- python => 2.4
- python-IPy
- python-simplejson
- mysql-server >= 5.0
Для CentOS 6:
- python => 2.6
- python-IPy
- python-simplejson
- mysql-server >= 5.1
На момент когда я впервые задался этой проблемой, готовых решений небыло, да и сейчас это довольно специфический момент и общих решений я пока не нашел. Как правило это какие-то внутренние скрипты, которые затачиваются под конкретные продукты.
Чтобы унифицировать это решение я разработал утилиту build-tools https://github.com/scopenco/build-tools, которая позволяет создавать RHEL, CentOS, Fedora, Scientific yum репозитарии с метапакетом (пакет проекта) на базе XML спецификаций(aka ролей). Роли описывают набор обязательных пакетов и репозитариев, откуда эти пакеты вместе с зависимостями скачиваются в локальный yum репозитарий (aka билд). Данный репозитарий используется в качестве пакетной базы для продукта.
Итак, установка build-tools очень простая и описана в README.
Перейдем к спецификациям проектов.
Пример спецификации для СentOS 5:
<?xml version="1.0" encoding="UTF-8"?> <project name="myproject" summary="My First Project" repository="http://repo.domain.com/pub/repo/" version="0.1" > <!-- role with minimal set of packages --> <role path="roles/centos-5-minimal.xml" /> <!-- python packages --> <package name="python" version="2.4.3" /> <package name="python-IPy" /> <package name="python-simplejson" /> <!-- mysql packages --> <package name="mysql-server" version="5.0.95" /> <!-- yum repos --> <role path="repos/centos-5-base.xml" /> <role path="repos/centos-5-updates.xml" /> <role path="repos/centos-5-epel.xml" /> </project>
Пример спецификации для СentOS 6:
<?xml version="1.0" encoding="UTF-8"?> <project name="myproject" summary="My First Project" repository="http://repo.domain.com/pub/repo/" version="0.2" > <!-- role with minimal set of packages --> <role path="roles/centos-6-minimal.xml" /> <!-- python packages --> <package name="python" version="2.6.6" /> <package name="python-IPy" /> <package name="python-simplejson" /> <!-- mysql packages --> <package name="mysql-server" version="5.1.71" /> <!-- yum repos --> <role path="repos/centos-6-base.xml" /> <role path="repos/centos-6-updates.xml" /> <role path="repos/centos-6-epel.xml" /> </project>
Разница по сути только в подключаемых yum репозитариях и ролях с минимальным набором пакетов.
Для сборки yum репозитария и мета пакетов можно воспользоваться готовыми скриптами, а можно и написать свои с более глубокой автоматизацией и интеграцией в процесс разработки.
cd src cp ../repository . ./build-el5.sh ./build-el6.sh
Сборка репозитариев выполняется обязательно на CentOS 5. Причиной этому является тот факт, что yum обратно не совместим и репозитарии, собранные через yum API CentOS 6 не будут ставиться на CentOS 5 машины, тогда как репозитарии, собранные на CentOS 5 ставятся на CentOS 6, Fedora 13 и выше, Scientific 5 и выше.
После запуска сбоки на выходе получается 2-а репозитария, с которых можно заливать физические и виртуальные сервера по kickstart. Таким образом фиксируется набор софта, который можно хранить в корпоративном репозитарии и использовать для разворачивания продукта.
Можно создавать новые роли с публичными yum репозитариями и пакетами для кастомизации сред.
Рассмотрим несколько популярных вариантов:
- Допустим для testing среды нужно добавить какие-то дополнительные rpm пакеты, которых не должно быть в production. В этом случае создается отдельная роль со списком этих пакетов и отдельный проект для testing среды, куда эта роль добавляется на ряду с ролями для остальных сред. Сборку билдов для всех сред нужно сделать в тот же день чтобы версии пакетов в билдах для development и production не отличались от testing а только их кол-во.
- Допустим есть регламентированный список софта, который должен присутствовать на всех серверах проекта. В таком случае создается отдельная роль с этим списком, которая добавляться во все спецификации проектов. Таком образом гарантируется что софт будет установлен на всех серверах.
Подробное описание атрибутов можно найти в wiki build-tools.
Если говорить об обновлении, которое рано или поздно случается, то в данном случае достаточно будет инкриментировать версию в спецификации проекта и пересобрать билд. Получится новый билд с новой версией, который можно разворачивать либо обновлять в средах разработки, тестирования и эксплуатации.
Итоги:
Таким образом, используя build-tools мне удалось:
- решить проблему идентичности development, testing, production сред
- предоставить разработчикам широкие возможности по версионированию среды и совместимости софта в рамках всего проекта
ссылка на оригинал статьи http://habrahabr.ru/post/208558/
Добавить комментарий