É possível substituir um arquivo de unidade systemd para criar um arquivo de unidade modelo?

8

Eu sei que o systemd fornece um excelente mecanismo para substituir um arquivo de unidade fornecido pelo pacote para influenciar a configuração / comportamento do serviço. Isso geralmente é feito usando o comando abaixo

sudo systemctl edit <unitfile>

para criar um arquivo conf de substituição em

/etc/systemd/system/<unitfile.d>/

O Systemd também fornece um mecanismo separado para definir um arquivo de unidade de modelo e instancia-o para criar unidades específicas da instância em tempo de execução. Isso requer nomear o arquivo de modelo como

<servicename>@.service

e instanciando-o como

systemctl start <servicename>@<instancename>

Agora, tenho uma situação em que gostaria de executar um serviço fornecido por pacote como várias instâncias de unidade. Quero evitar criar meu próprio arquivo de unidade de modelo, portanto, estou tentando ver se o arquivo de unidade fornecido pelo pacote pode ser substituído para criar o arquivo de unidade de modelo.

Como, pelo que entendi, o arquivo de unidade de modelo tem uma convenção de nomenclatura diferente do arquivo de unidade normal, acho que não posso substituir o arquivo de unidade fornecido pelo pacote por um arquivo de modelo, colocando-o em / etc / systemd / system.

Existe alguma maneira definida de alcançar o que estou tentando fazer?

Cenário específico: O pacote grafana instala um arquivo de unidade grafana-server.service. Quero executar duas instâncias de grafana na minha máquina - uma para DEV e STG. Consegui fazer isso:

  • modifique o arquivo grafana-server.service (usando% I para definir os locais das pastas e os caminhos dos arquivos)
  • renomeie o grafana-server.service modificado para grafana-server @ .service
  • inicie instâncias do grafana usando:

    sudo systemctl start grafana-server@dev
    

    e

    sudo systemctl start grafana-server@stg
    

No entanto, isso interrompe o link do arquivo da unidade de serviço fornecida pela grafana e, se eles melhorarem o arquivo de serviço ao fazer o upgrade, precisarei refazer essa atividade novamente. Meu objetivo é evitar essa dependência direta e convertê-la em uma dependência de substituição.

Alguma ideia?

sujitv
fonte

Respostas:

6

Para as duas opções abaixo, primeiro substitua o grafana-server.service (sem o @) /etc/systemd/systeme suprima ExecStart(supondo que ele use isso) para que ele não inicie nada. Ativado /etc/systemd/system/grafana-server.service.d/10-disable-execstart.conf:

[Service]
ExecStart=
WorkingDirectory=/path/to/your/confdir

Opção 1 - Substituindo por Instâncias Genéricas

Crie um [email protected]que corresponda às suas configurações com a seguinte configuração para [Unit]e [Service]:

[Unit]
PartOf=grafana-server.service
ReloadPropagatedFrom=grafana-server.service

Eles devem ligar o grafana-server start / stop / restart a todas as suas instâncias juntas. A mágica não está muito bem documentada, mas se você colocar <instance_name>.confarquivos no seu /path/to/your/confdir, todas essas instâncias serão vinculadas automaticamente!

Opção 2 - Substituindo instâncias específicas para manter a configuração do pacote

Se você deseja manter todas as novidades de atualização do arquivo de serviço de pacote, mas aceitar as opções de instâncias personalizadas principais, crie um link simbólico para cada nome de instância

/lib/systemd/system/grafana-server.service

para

/etc/systemd/system/grafana-service@<instance>.service

e substitua apenas as opções específicas dessa instância usando

/etc/systemd/system/grafana-server@<instance>.service.d/99-my-options.conf

Certifique-se de adicionar a seguinte configuração em [Unit]e [Service]para 99-my-options.conf:

[Unit]
PartOf=grafana-server.service
ReloadPropagatedFrom=grafana-server.service

Isso assumirá para cada instância todas as grafana-server.serviceopções e as substituirá por todas as opções no 99-my-options.confarquivo e também vinculará as ações start / stop / restart ao grafana-server.service.

Nas duas opções, se você executar

systemctl start grafana-server.service

todas as suas instâncias que possuem um /path/to/confdir/<instance>.confarquivo serão iniciadas. O mesmo se aplica a stope restarte você sempre pode gerenciá-los individualmente usando seu grafana-server@<instance>nome do serviço.

RDP
fonte