Условное включение системных файлов через пакет Debian

8

Я создал пакет deb , который устанавливает сервис.

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

Как я могу попросить пользователя принять решение во время apt-getшага? Это лучшее решение?

Обратите внимание, я создал пакет, используя dh_makeи, debhelperи включил его:

%:
    dh $@ --with=systemd

override_dh_systemd_enable:
    dh_systemd_enable --name=foo foo.service
Стюарт
источник

Ответы:

11

Вы можете использовать предварительные настройки systemd, чтобы указать, будет ли служба systemd по умолчанию включена или отключена во время установки.

По умолчанию предустановки Debian включают все службы по мере их установки, поэтому вам нужно только отправить предустановку на рабочие станции разработки (поведение по умолчанию соответствует тому, что вы хотите получить в рабочей среде), отправив файл, например, /etc/systemd/system-preset/80-foo.presetсодержащий строку, которая говорит

disable foo.service

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

Ваш пакет .deb должен использовать systemctl presetкоманду для включения службы, так как эта команда будет учитывать предварительно заданную конфигурацию.

Как указывают @JdeBP и @sourcejedi , макросы Debian в deb-помощниках (таких как dh_systemd_enable) уже делают это, они вызывают, deb-systemd-helperкоторый будет использовать systemctl presetпо умолчанию (с небольшим предупреждением, что если вы удалите (но не очистите) пакет, и затем снова установить его, он будет не включить службу, даже если вы удалите файл предустановленный) См. этот комментарий в deb-systemd-helper«s enableоперации :

    # We use 'systemctl preset' on the initial installation only.
    # On upgrade, we manually add the missing symlinks only if the
    # service already has some links installed. Using 'systemctl
    # preset' allows administrators and downstreams to alter the
    # enable policy using systemd-native tools.

Для получения дополнительной информации о функции пресетов systemd см. Справочную страницу пресетов systemd и команды, systemctl presetкоторая ее реализует.

filbranden
источник
1
Это именно то, что мне было нужно. Я развертываю среду разработки через метапакет и могу установить эти *.presetфайлы как часть этого пакета.
Стюарт
4
Важно знать, что к предварительным настройкам обращаются только при deb-systemd-helperпервой установке пакета. После этого к параллельной базе данных, поддерживаемой инструментами Debian, обращаются, пока пакет не будет очищен. news.ycombinator.com/item?id=18320131
JdeBP
1
Так что, deb-systemd-helperпохоже, использовать пресеты. И это должно работать без необходимости предварительно заданной команды systemctl внутри пакета .deb. Специфика Debian - это то, что происходит, если вы удаляете (но не удаляете) пакет. Если позже вы переустановите пакет, он не включит службу, даже если вы удалите предустановленный файл. salsa.debian.org/debian/init-system-helpers/blob/debian/1.56/…
sourcejedi
@sourcejedi Включил ваши комментарии и ссылку на комментарий deb-systemd-helper в ответ. Спасибо!
filbranden
5

Если вы хотите предложить пользователю во время установки, вы должны использоватьdebconf . Это имеет ряд преимуществ, даже если вы находитесь вне контекста, в котором важна политика Debian: она обеспечивает согласованное взаимодействие с конечным пользователем, с поддержкой множества внешних интерфейсов; поддерживает разные «уровни»; поддерживает предпосевную обработку. Предварительное заполнение означает, что пакет может быть предварительно настроен, и в этом случае он вообще не будет запрашивать. Различные уровни означают, что приглашение может быть настроено на показ только при определенных обстоятельствах; После этого вы можете установить пакет без запроса по умолчанию (для встроенных целей) и дать указание своим разработчикам соответствующим образом настроить свой внешний интерфейс при установке пакета, чтобы они увидели приглашение.

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

Если вашим разработчикам никогда не нужно запускать службу, они могут замаскировать ее перед установкой пакета, и служба никогда не будет включена:

sudo systemctl mask foo

Если вашим разработчикам иногда нужно запускать сервис, используя модуль systemd, они могут отключить его после первой установки пакета, и последующие установки запомнят это:

sudo apt install foo
sudo systemctl disable --now foo

Тогда по умолчанию будет включена служба.

Стивен Китт
источник
Хороший ответ. debconfпохоже, что я имел в виду, но я согласен, что лучше избегать подсказок, когда это возможно. Я знал об этом systemctl disable, но я пытался помочь пользователю избежать «пропуска шага» во время установки. *.presetsРешение было предложено Filippe решает эту проблему.
Стюарт
В самом деле, пресеты идеально соответствуют всем требованиям!
Стивен Китт