Публикации Весна IT Выравнивание по ширине и расстановка переносов

Конфигурационные пакеты

Andrey Orlov  2009-02-03 11:15

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

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

Поставка интегрированных решений

Поставка интегрированных решений

Основой современных дистрибутивов являются пакетные менеджеры, обеспечивающие корректную установку пакетов программного обеспечения. Пакетный менеджер, такой как RPM/APT, способен обеспечить установку пакетов таким образом, что будут удовлетворены зависимости и не будет конфликтов между пакетами, что обеспечивает возможность их совместной работы. Но чтобы реализовать эту возможность необходимо связать между собой пакеты, настроив их для совместной работы. Связывание кое-как обеспечиваются автоматической коррекцией конфигурационных файлов после установки и их специальной организацией. При этом сами пакетные менеджеры предоставляют лишь примитивные средста управления конфигурацией: максимум что есть - это возможность выбрать режим замещения конфигурационных файлов при обновлении.

Постановка задачи

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

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

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

Конфигурационный пакет

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

  1. Декларирует зависимость от всех пакетов, которые он настраивает, поэтому установка конфигурируемой системы инициируется установкой конфигурационого пакета: пакетный менеджер обеспечивает установку остальных;
  2. Предоставляет существенное количество конфигурационных и вспомогательных файлов, которые являются безусловно обновляемыми, благодаря этому можно выпускать и автоматически распространять новые версии конфигурации;
  1. Содержит несколько простых конфигурационных файлов, обеспечивающих настройку системы пакетов для индивидуальной установки (имена пользователей, адреса смежных хостов и т.п.).
  2. Не конфликтует с существующими пакетами по конфигурационным файлам (или же существует способ разрешения конфликта средствами пакетного менеджера).

Последний, четвертый, пункт в современных дистрибутивах решается хуже всего. Рассмотрим различные варианты организации такого пакета средствами APT/RPM.

Частичная установка пакета

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

  1. Конфигурируемые пакеты устанавливаются с исключением (или переносом) конфигурационных файлов;
  2. Устанавливается конфигурационный пакет, который размещает свои файлы в тех местах, где должны были быть ранее исключенные конфигурационные файлы пакетов;
  3. При выполнении операции обновления, пакетный менеджер обновляет файлы из тех пакетов, из которых они действительно происходят.

У такого подхода есть некоторые не очевидные недостатки, из которых самый главный - пакетный менеджер действительно должен обеспечивать выполнение п.3, что, как мы увидим ниже, под вопросом. Другие недостатки более очевидны:

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

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

RPM и опции

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

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

Тем не менее, в текущей версии RPM/APT данный подход принесет больше неудобств, чем помощи.

dpkg и dpkg-diversion

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

Принудительный вынос конфигов

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

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

Можно рассмотреть более сложный случай:

  • Пусть существуют пакеты somesoft1, somesoft2 и somesoft3 с соответствующими им конфигурационными пакетами;
  • Пусть существуют независимые конфигурации solution1, solution2, реализующие специальные решения на основе пакетов somesoft1, somesoft2 и somesoft3;
  • Тогда каждая из конфигураций solution1, solution2 должна предоставлять возможности somesoft1-cfg, somesoft2-cfg и somesoft3-cfg и требовать пакеты somesoft1, somesoft2 и somesoft3.

Таким образом, пользователь, желающий установить готовое решение solution1 или solution2 инициирует их установку, а пользователь, желающий самостоятельно настроить пакеты somesoft1, somesoft2 и somesoft3 инициирует установку пакетов somesoft1-cfg, somesoft2-cfg и somesoft3-cfg.

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

Костыли

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

RPM и символические линки

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

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

Домашние извращения в /usr/local

Проблем со стандартными пакетными менеджерами и политикой дистрибутива иной раз настолько много, что более предпочтительным является установка программного обеспечения в /usr/local. Один из случаев, когда приходится принять такое решение, описан для пакетов egg языковой среды python, но он также верен практически для любого развитого языка или программы, обладающей собственной версией менеджера пакетов или дополнений.

Я пользуюсь этим без особых проблем, получая выгоду от гибкости, скорости, независимости от дистрибутива и ориентированности на язык, но рекомендовать это к массовому применению не готов: это решение на ваш собственный риск.

SVN и конфиги в /usr/local

Я никогда не видел это решение в действии и не использовал его сам, а всего лишь рассказываю подход, который услышал от одного очень уважаемого мной (да и вами :) ) специалиста. Идея состоит в том, чтобы держать все конфигурационные файлы в репозитории subversion (или любом другом). Из репозитория конфигурация извлекается, например, в директорию /usr/local, затем запускается вышеупомянутый инструмент, заменяющий оригинальные конфигурационные файлы символическими линками на файлы из репозитория.

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

Несколько слов про LDAP, NIS+ и т.п.

Наверно, некоторые теоретически продвинутые, но далекие от реальной жизни пользователи попробуют возразить, что все проблемы конфигурации можно и нужно решать за счет LDAP, NIS+ и других систем, предоставляющих единый реестр конфигурационных настроек. Теоретически это верно. А вот практическая реализация упирается в то, что единого конфигурационного реестра для Linux не существует: очень много программ, причем таких как apache. postfix и других важнейших служб операционной системы не способны работать с каким-либо реестром без кучи специальных - и совсем нетривиальных - настроек. Совокупность которых, кстати, сама по себе могла бы являться конфигурационным пакетом.

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

Заключение

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

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

DreamBot Zope3 Учат тут Нейросети Репозиторий Слив! Статистика Редакторам Мобильный блог
Официальный сайт Zope3 Московская группа изучения реактивного движения The Dream Bot Site nooxml Сайт посуточной аренды квартир в москве