Habilitando condicionalmente arquivos systemd através do empacotamento Debian

8

Eu criei um pacote deb que instala um serviço.

Nos nossos dispositivos incorporados, desejo que este pacote ative automaticamente o serviço. Em nossas estações de trabalho para desenvolvedores, quero que os desenvolvedores systemctl start foomanualmente (é um serviço pesado e, portanto, consome recursos apenas se executado o tempo todo em um ambiente de desktop).

Como posso solicitar ao usuário sua decisão durante a apt-getetapa? Essa é a melhor solução?

Note, eu criei o pacote usando dh_makee debhelpere permitiu-lo com:

%:
    dh $@ --with=systemd

override_dh_systemd_enable:
    dh_systemd_enable --name=foo foo.service
Stewart
fonte

Respostas:

11

Você pode usar as predefinições do systemd para afetar se um serviço do systemd será ativado ou desativado no momento da instalação.

As predefinições Debian usam como padrão habilitar todos os serviços à medida que são instaladas; portanto, você só precisa enviar uma predefinição para as estações de trabalho de desenvolvimento (o comportamento padrão corresponde ao que você deseja que ocorra na produção), enviando um arquivo como /etc/systemd/system-preset/80-foo.presetuma linha que contenha diz

disable foo.service

Se você gerenciar suas estações de trabalho de desenvolvedor usando um sistema como Puppet, Chef, Ansible etc., poderá usá-las para enviar essa configuração predefinida do sistema, o que facilitará a aplicação da política somente às estações de trabalho de desenvolvedor e não à produção. máquinas

Seu pacote .deb deve usar o systemctl presetcomando para habilitar o serviço, pois esse comando respeitará a configuração predefinida.

Como o @JdeBP e o @sourcejedi apontam, as macros Debian nos deb-helpers (como dh_systemd_enable) já fazem isso, invocam o deb-systemd-helperque usará systemctl presetpor padrão (com uma pequena ressalva que se você remover (mas não limpar) o pacote, e mais tarde re-instalá-lo, então ele não vai permitir que o serviço, mesmo se você remover o arquivo de predefinição) Veja. este comentário em deb-systemd-helper's enableoperação :

    # 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.

Para obter mais informações sobre o recurso systemd de presets, consulte a página de manual do systemd presets e do comando systemctl presetque o implementa.

filbranden
fonte
1
Isso é exatamente o que eu precisava. Implantei o ambiente de desenvolvimento por meio de um meta-pacote e, portanto, posso instalar esses *.presetarquivos como parte desse pacote.
Stewart
4
Uma peculiaridade importante a saber é que as predefinições são consultadas apenas deb-systemd-helperna primeira vez que um pacote é instalado. Depois disso, o banco de dados paralelo mantido pelas ferramentas Debian é consultado, até que o pacote seja eliminado. news.ycombinator.com/item?id=18320131
JdeBP 12/11/18
1
Então deb-systemd-helperparece usar predefinições. E isso deve funcionar sem a necessidade de um comando manual systemctl preset dentro do pacote .deb. A peculiaridade específica do Debian é o que acontece se você remover (mas não limpar) o pacote. Se você reinstalar o pacote posteriormente, ele não ativará o serviço, mesmo que você remova o arquivo predefinido. salsa.debian.org/debian/init-system-helpers/blob/debian/1.56/…
sourcejedi
@sourcejedi Incorporou seus comentários e link para o comentário deb-systemd-helper na resposta. Obrigado!
filbranden
5

Se você deseja solicitar ao usuário durante a instalação, usedebconf . Isso tem várias vantagens, mesmo que você não esteja em um contexto em que a política Debian seja relevante: fornece uma experiência consistente para o usuário final, com suporte para uma variedade de frontends; suporta diferentes "níveis"; suporta pré-semeadura. Pré-propagação significa que o pacote pode ser pré-configurado, caso em que não será solicitado. Os diferentes níveis significam que um prompt pode ser configurado para mostrar apenas em determinadas circunstâncias; você pode instalar o pacote sem avisar por padrão (para seus destinos incorporados) e instruir seus desenvolvedores a configurar seu front-end adequadamente ao instalar o pacote para que eles vejam o prompt.

No entanto, acho que é melhor evitar solicitações quando possível. Isso é especialmente verdadeiro para serviços que têm outras maneiras de lidar com as preferências do usuário final e, onde lidar com as preferências do usuário complica os scripts do mantenedor (consulte os scripts gerados no seu pacote, eles já lidam com vários problemas sutis, usando deb-systemd-helper- você teria que replicar tudo isso, com sua preferência no topo).

Se seus desenvolvedores nunca precisarem executar o serviço, eles poderão mascará-lo antes de instalar o pacote, e o serviço nunca será ativado:

sudo systemctl mask foo

Se os desenvolvedores às vezes precisarem executar o serviço, usando a unidade systemd, eles poderão desativá-lo após a instalação do pacote pela primeira vez, e as instalações subsequentes lembrarão disso:

sudo apt install foo
sudo systemctl disable --now foo

O padrão seria ativar o serviço.

Stephen Kitt
fonte
Boa resposta. debconfparece com o que eu tinha em mente, mas concordo que é melhor evitar avisar quando possível. Eu sabia sobre o systemctl disable, mas estava tentando ajudar o usuário a evitar "pular uma etapa" durante a instalação. A *.presetssolução sugerida por Filippe resolve isso.
Stewart
De fato, as predefinições se encaixam perfeitamente!
Stephen Kitt