所以我希望能够限制:部署而无需输入任何密码。我已经设置了所有私钥,所以我可以很好地到达远程服务器,现在我在ssh上使用svn,所以没有密码。
我有最后一个问题,我需要能够重启nginx。现在我有sudo /etc/init.d/nginx reload。这是一个问题b / c它使用capistrano密码,我刚刚删除的那个b / c我正在使用密钥。有关如何重新启动nginx的任何想法吗?
我花了一个小时看着sudoer通配符等试图解决这个确切的问题。实际上,您真正需要的是一个重新启动nginx的根可执行脚本。
将其添加到/ etc / sudoers文件中
username hostname ALL=NOPASSWD: /path/to/script
以root身份编写脚本
#! /bin/bash
/bin/kill -HUP `cat /var/run/nginx.pid`
使脚本可执行
测试。
sudo /path/to/script
有一个better answer on Stack Overflow不涉及编写自定义脚本:
最佳做法是使用
/etc/sudoers.d/myuser
/etc/sudoers.d/
文件夹可以包含多个文件,允许用户使用sudo调用内容而不是root。该文件通常包含用户和用户无需指定密码即可运行的命令列表。
说明:
在所有命令中,将myuser替换为您要用于在没有sudo的情况下重新启动nginx的用户名。
$ sudo visudo -f /etc/sudoers.d/myuser
myusername ALL=(ALL) NOPASSWD: /usr/sbin/service nginx start,/usr/sbin/service nginx stop,/usr/sbin/service nginx restart
现在你可以在没有密码的情况下重启(并启动和停止)nginx。我们来试试吧。
$ ssh myusername@myserver
$ sudo /usr/sbin/service nginx stop
ps aux | grep nginx
确认nginx已停止$ sudo /usr/sbin/service nginx start
ps aux | grep nginx
确认nginx已启动PS:确保使用sudo /usr/sbin/service nginx start|restart|stop
,而不是sudo service nginx start|restart|stop
。
在Rails_App/lib/capistrano/tasks/nginx.rake
中创建一个rake任务并粘贴到代码下面。
namespace :nginx do
%w(start stop restart reload).each do |command|
desc "#{command.capitalize} Nginx"
task command do
on roles(:app) do
execute :sudo, "service nginx #{command}"
end
end
end
end
然后ssh到您的远程服务器并打开文件
sudo vi /etc/sudoers
并粘贴此行(行%sudo ALL=(ALL:ALL) ALL
后)
deploy ALL=(ALL:ALL) NOPASSWD: /usr/sbin/service nginx *
或者,就像你的情况一样,
deploy ALL=(ALL:ALL) NOPASSWD: /etc/init.d/nginx *
在这里,我假设您的部署用户是deploy
。
您也可以在此处添加其他命令,您无需输入密码。例如
deploy ALL=(ALL:ALL) NOPASSWD: /usr/sbin/service nginx *, /etc/init.d/mysqld, /etc/init.d/apache2