Reinicia um daemon do systemd, para integração contínua, sem root?

0

Temos um servidor baseado em nodejs que é configurado para ser lançado pelo systemd e em nosso servidor dev novas versões são implementadas via integração contínua. O problema que temos é que um usuário não-root não pode reiniciar o aplicativo usando o comando systemctl, então estamos curiosos sobre como devemos abordar o problema?

O comando que tentamos:

sudo systemctl start my-nodejs-server

E o conteúdo do script systemd:

[Unit]
Description=NodeJS Based Server

[Install]
WantedBy=multi-user.target

[Service]
User=myserver-user
Group=myserver-userh
Environment=ENV=production NODE_ENV=production
WorkingDirectory=/home/myserver-user/my-nodejs-server/
#ExecStart=/home/myserver-user/my-nodejs-server/scripts/appctl.sh restart
ExecStart=/usr/bin/node lib
Restart=on-failure

Eu também tentei o seguinte comando, como sugerido:

systemctl --user start my-nodejs-server

mas recebo o seguinte:

Failed to connect to bus: No such file or directory

Alguma idéia?

Estamos rodando no Ubuntu 16.

    
por Andre M 09.02.2018 / 00:09

1 resposta

2

Para as minhas necessidades, é necessário um 'arquivo de unidade de sistema', em vez de um 'arquivo de unidade do usuário' (veja aqui ), uma vez que o último reside no diretório home do usuário e é apenas para programas que devem ser executados durante a duração de uma sessão de login.

A solução que acabei de usar é descrita na seguinte resposta:

How could we allow non-root users to control a system.d service?

Essencialmente, você dá ao usuário sudo privilégios para executar comandos específicos. Aqui está:

myserver-user ALL= NOPASSWD: /bin/systemctl start my-nodejs-server
myserver-user ALL= NOPASSWD: /bin/systemctl stop my-nodejs-server
myserver-user ALL= NOPASSWD: /bin/systemctl restart my-nodejs-server

Observe que, se você quiser aplicar esse privilégio a um grupo, use um símbolo de porcentagem na frente do identificador para que:

%myserver-group ALL= NOPASSWD: /bin/systemctl start my-nodejs-server
%myserver-group ALL= NOPASSWD: /bin/systemctl stop my-nodejs-server
%myserver-group ALL= NOPASSWD: /bin/systemctl restart my-nodejs-server

Além disso, com base na resposta referenciada, provavelmente alterarei o usuário da implantação para deployment , ou algo semelhante, para evitar que o usuário da implantação seja o mesmo que está executando o aplicativo.

    
por 09.02.2018 / 06:33

Tags