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

6

Eu sei que o systemd fornece um mecanismo excelente 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 instanciá-lo para criar unidades específicas da instância no tempo de execução. Isso requer nomear o arquivo de modelo como

<servicename>@.service

e, em seguida, instanciar 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. Eu quero evitar criar meu próprio arquivo de unidade de modelo, então 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 / sistema.

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. Eu quero executar duas instâncias de grafana na minha máquina - uma para cada DEV e STG. Eu consegui fazer isso:

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

    sudo systemctl start grafana-server@dev
    

    e

    sudo systemctl start grafana-server@stg
    

No entanto, isso quebra o link do arquivo de unidade de serviço fornecido pela grafana e, se eles melhorarem o arquivo de serviço quando eu fizer o upgrade, precisarei refazer essa atividade novamente. Meu objetivo é evitar essa dependência direta e, em vez disso, convertê-la em uma dependência de substituição.

Alguma opinião?

    
por sujitv 12.04.2017 / 21:58

1 resposta

4

Para ambas as opções abaixo, primeiro substitua o servidor-grafana.service (sem o @) em /etc/systemd/system e suprima o ExecStart (supondo que ele use isso) para fazer com que ele não inicie nada. Em /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

Estes devem ligar / desligar / reiniciar o servidor-grafana para todas as suas instâncias juntas. A mágica não está muito bem documentada, mas se você colocar <instance_name>.conf no seu /path/to/your/confdir , todas essas instâncias serão ligadas automaticamente!

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

Se você quiser manter todos os goodness do arquivo do serviço de pacote, mas aceitar as opções mainaining personalizadas, crie um link simbólico para cada nome de instância a partir de genérico

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

para

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

e, em seguida, substituir 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 a [Unit] e [Service] a 99-my-options.conf :

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

Isso assumirá para cada instância todas as opções grafana-server.service e as substituirá com todas as opções no arquivo 99-my-options.conf e também vinculará as ações de início / parada / reinicialização ao servidor grafana-server.service.

Em ambas as opções, se você executar

systemctl start grafana-server.service

todas as suas instâncias que tiverem um arquivo /path/to/confdir/<instance>.conf serão iniciadas. O mesmo se aplica a stop e restart AND você sempre pode gerenciá-los individualmente usando o nome do serviço grafana-server@<instance> .

    
por 22.10.2017 / 16:20

Tags