我有一个在端点 Linux 机器(Centos 6.6)上触发的 sensu 处理程序。这是我正在使用的脚本:
#!/bin/bash --login
sudo -n -u deploy bash --login -c "cd /var/www/vhosts/sc/current; pwd; BUNDLE_GEMFILE=/var/www/vhosts/sc/current/Gemfile RAILS_ENV=production bundle exec pumactl -F /var/www/vhosts/sc/shared/config/puma.rb stop "
sudo -n -u deploy bash --login -c "cd /var/www/vhosts/sc/current; pwd; BUNDLE_GEMFILE=/var/www/vhosts/sc/current/Gemfile RAILS_ENV=production bundle exec pumactl -F /var/www/vhosts/sc/shared/config/puma.rb start "
以其他用户身份在本地运行此脚本非常顺利,我可以让 puma 正常重启。即使我为 sensu 提供 shell 并在端点上执行脚本时也是如此。
当它从 sensu 服务器触发时,我得到以下输出:
{"timestamp":"2016-04-18T16:45:17.581962-0500","level":"info","message":"handler output","handler":{"type":"pipe","command":"/bin/sh /etc/sensu/handlers/puma_restart.sh","name":"puma_restart"},"output":["sudo: a password is required\n","sudo: a password is required\n"]}
我认为这可能是 sudoers 的问题,所以这是我的设置:
Defaults:sensu !requiretty
Defaults:sensu secure_path = /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
sensu ALL = NOPASSWD: /etc/sensu/handlers/puma_restart.sh
我还尝试为所有命令设置 sudo NOPASSWORD,例如:
sensu ALL=(ALL) NOPASSWD: ALL
但是脚本启动时仍然会出现错误。
有人知道我哪里设置错了吗?如果您需要更多详细信息或上下文,请告诉我。
答案1
第一个 sudoers 配置sensu ALL = NOPASSWD: /etc/sensu/handlers/puma_restart.sh
不会满足您的要求。它为用户sensu
分配使用 sudo 调用包装器puma_restart.sh
脚本的权限。但是 sudo 命令位于该脚本中,并调用 bash 来执行命令。您需要允许 sensu 用户通过 sudo 调用 bash。
第二个 sudoers 配置sensu ALL=(ALL) NOPASSWD: ALL
应该可以工作。这听起来可能是 sudoers 配置的问题。
以下几件事可能有助于您取得进一步的进步:
- 这些检查是在 sensu 服务器还是客户端上执行?请确保将 sudoers 配置放在执行检查的位置。
- 将 sudo 调用移出脚本。从脚本内部删除 sudo 调用,并将 sudo 添加到 sensu check 命令:
sudo puma_restart.sh
第一个 sudoers 配置应该使用此方法。 - 调试 sudoers 配置。
- 在 sensu 客户端主机上运行
sudo -l -U sensu
以查看 sudoers 配置提供哪些权限。启用所有命令的无密码功能后,您应该会得到一些结果,包括以下内容。如果没有,则说明 sudoers 配置存在问题。User sensu may run the following commands on this host: (root) NOPASSWD: ALL
- 在 sensu 客户端主机上运行