重新启动 systemd 守护进程,以实现持续集成,无需 root?

重新启动 systemd 守护进程,以实现持续集成,无需 root?

我们有一个基于 Nodejs 的服务器,配置为由 systemd 启动,并且在我们的开发服务器上通过持续集成部署新版本。我们遇到的问题是非root用户无法使用systemctl命令重新启动应用程序,所以我们很好奇应该如何解决这个问题?

我们尝试过的命令:

sudo systemctl start my-nodejs-server

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

我还按照建议尝试了以下命令:

systemctl --user start my-nodejs-server

但我得到以下信息:

Failed to connect to bus: No such file or directory

有任何想法吗?

我们正在 Ubuntu 16 上运行。

答案1

根据我的需要,需要“系统单元文件”,而不是“用户单元文件”(请参阅这里),因为后者位于用户的主目录中,并且仅适用于在登录会话期间运行的程序。

我最终采用的解决方案在以下答案中描述:

我们如何允许非 root 用户控制 system.d 服务?

本质上,您授予用户 sudo 运行特定命令的权限。这里是:

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

请注意,如果您想将此权限应用于组,请在标识符前面使用百分比符号,如下所示:

%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

另外,根据引用的答案,我可能会将部署用户更改为deployment或类似的用户,以避免部署用户与运行应用程序的用户相同。

相关内容