![我们如何允许非 root 用户控制 systemd 服务?](https://linux22.com/image/6027/%E6%88%91%E4%BB%AC%E5%A6%82%E4%BD%95%E5%85%81%E8%AE%B8%E9%9D%9E%20root%20%E7%94%A8%E6%88%B7%E6%8E%A7%E5%88%B6%20systemd%20%E6%9C%8D%E5%8A%A1%EF%BC%9F.png)
对于sysvinit
,sudoers
这样的条目就足够了:
%webteam cms051=/sbin/service httpd *
这将允许使用以下命令:
sudo service httpd status
sudo service httpd restart
现在,对于systemd
,服务名称是最后一个参数。即,服务重启将通过以下方式完成:
systemctl restart httpd.service
当然,我认为将命令定义为systemctl * httpd.service
可以工作,但这会导致类似的结果systemctl restart puppet.service httpd.service
达不到预期的效果。
考虑到这一点,那么允许非 root 用户控制systemd
服务的最佳方式是什么?这不需要是sudoers
;也许更改文件权限就足够了?
答案1
只需将所有需要的命令sudoers
分别添加到:
%webteam cms051=/usr/bin/systemctl restart httpd.service
%webteam cms051=/usr/bin/systemctl stop httpd.service
%webteam cms051=/usr/bin/systemctl start httpd.service
答案2
@jofel 的答案正是我获得工作设置所需要的。将此发布给其他遇到此问题的人。我需要一种方法capistrano
在从本地计算机部署后重新启动 Ruby 应用程序。这意味着我需要无密码访问来重新启动systemd
服务。这就是我所拥有的,效果非常好!
笔记:我的用户和组称为deployer
将代码放入自定义文件中:/etc/sudoers.d/deployer
代码:
%deployer ALL= NOPASSWD: /bin/systemctl start my_app
%deployer ALL= NOPASSWD: /bin/systemctl stop my_app
%deployer ALL= NOPASSWD: /bin/systemctl restart my_app
答案3
使用您希望他们有权访问的命令创建命令别名。然后将该组分配给该命令别名:
Cmnd_Alias APACHE-SVC = /usr/bin/systemctl stop httpd, /usr/bin/systemctl start httpd, /usr/bin/systemctl restart httpd
%webteam ALL=APACHE-SVC
将任何编辑内容放在 /etc/sudoers.d/filename 中而不是直接编辑 sudoers 文件也是一种很好的做法。确保在 sudoers 中指向您的 .d/文件名,无论如何,大多数新发行版都会这样做。将这两行放入您的 sudoers 中应该可以解决问题:
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d
注意:includedir 前面的 # 不是注释。它必须保留。
答案4
在 RHEL8 中:
httpd.service
另一种选择是在 webteam 主目录下 有一个文件~/.config/systemd/user
,他们可以自己启动/停止/启用等:
systemctl --user enable httpd.service
systemctl --user start httpd.service
验证只要用户有权启动该服务,上述操作就有效。这在开发系统上似乎很有用,允许开发人员使用 devops/ops 手中可用的所有配置有效地执行计时器和管道。
似乎也有利于将其转移到生产环境,并使用构建的 httpd 操作在实际服务器环境中测试整个启动序列,并且开发人员不会说“但它在我的笔记本电脑上工作,当我推送到开发人员时崩溃了” 。但我只是在这里思考和写作。
最好的在线参考,因为 systemd 用户文档并不丰富: