所以我希望能够限制:部署而无需输入任何密码。我已经设置了所有私钥,所以我可以很好地到达远程服务器,现在我在ssh上使用svn,所以没有密码。
我有最后一个问题,我需要能够重启nginx。现在我有sudo /etc/init.d/nginx reload。这是一个问题b / c它使用capistrano密码,我刚刚删除的那个b / c我正在使用密钥。有关如何重新启动nginx的任何想法吗?
答案 0 :(得分:42)
我花了一个小时看着sudoer通配符等试图解决这个确切的问题。事实上,你真正需要的是一个重启nginx的root可执行脚本。
将其添加到/ etc / sudoers文件
username hostname ALL=NOPASSWD: /path/to/script
以root身份编写脚本
#! /bin/bash
/bin/kill -HUP `cat /var/run/nginx.pid`
使脚本可执行
测试。
sudo /path/to/script
答案 1 :(得分:10)
有better answer on Stack Overflow不涉及编写自定义脚本:
最佳做法是使用
/etc/sudoers.d/myuser
/etc/sudoers.d/
文件夹可以包含多个允许用户使用的文件 使用sudo调用东西而不是root。该文件通常包含用户和用户的命令列表 无需指定密码即可运行。
<强>说明:强>
在所有命令中,将 myuser 替换为您要用于在没有sudo的情况下重新启动nginx的用户名。
为您的用户打开sudoers文件:
$ sudo visudo -f /etc/sudoers.d/myuser
编辑器将打开。在那里粘贴以下行。这将允许该用户运行nginx启动,重启和停止:
myusername ALL=(ALL) NOPASSWD: /usr/sbin/service nginx start,/usr/sbin/service nginx stop,/usr/sbin/service nginx restart
通过点击 ctrl + o 进行保存。它将询问您要保存的位置,只需按输入即可确认默认值。然后使用 ctrl + x 退出编辑器。
现在您可以在没有密码的情况下重启(并启动和停止)nginx。我们来试试吧。
打开新会话(否则,您可能根本没有被要求提供sudo密码,因为它没有超时):
$ ssh myusername@myserver
停止nginx
$ sudo /usr/sbin/service nginx stop
通过查看您的网站或运行ps aux | grep nginx
启动nginx
$ sudo /usr/sbin/service nginx start
通过查看您的网站或运行ps aux | grep nginx
PS:请务必使用sudo /usr/sbin/service nginx start|restart|stop
,而不是sudo service nginx start|restart|stop
。
答案 2 :(得分:0)
在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