我想用 Capistrano 3 编写一个配方,使用 sudo 在远程服务器上执行任务。
使用 Capistrano 2,例如可以这样做:
default_run_options[:pty] = true
task :hello do
run "#{sudo} cp ~/something /something"
end
使用 Capistrano 3,我发现:
set :pty, true
但我无法执行使用 sudo 运行的任务。
如何使用 sudo 运行任务?
我想用 Capistrano 3 编写一个配方,使用 sudo 在远程服务器上执行任务。
使用 Capistrano 2,例如可以这样做:
default_run_options[:pty] = true
task :hello do
run "#{sudo} cp ~/something /something"
end
使用 Capistrano 3,我发现:
set :pty, true
但我无法执行使用 sudo 运行的任务。
如何使用 sudo 运行任务?
Capistrano 3 指南建议使用无密码 sudo。这允许您的权限较低的用户执行 sudo 命令,而无需通过 PTY 输入密码。
您可以使用上面 Kentaro 编写的任务,并将以下内容添加到您的 /etc/sudoers 文件中:
deploy ALL=NOPASSWD:/bin/cp ~/something /something
http://www.capistranorb.com/documentation/getting-started/authentication-and-authorisation/#toc_8
我通常这样写:
task :hello do
on roles(:all) do |host|
execute :sudo, :cp, '~/something', '/something'
end
end
编辑
Capistrano 3 不支持带密码的 sudo。
但是,我创建了一个小gem,它使您可以在 Capistrano 3 任务中使用 sudo 和密码。
将sshkit-sudo添加到应用程序的 Gemfile:
# Gemfile
gem 'sshkit-sudo'
并且在 Capfile 中需要 'sshkit/sudo':
# Capfile
require 'sshkit/sudo'
现在,您可以使用 sudo 执行命令,如下所示:
task :hello do
on roles(:all) do
sudo :cp, '~/something', '/something'
end
end
为了解决这个问题,我需要添加set :pty, true
到我的deploy.rb
文件中。
我现在可以运行以下命令:
# config valid only for Capistrano 3.1
lock '3.1.0'
set :application, 'APP_NAME'
set :pty, true
set :ssh_options, {:forward_agent => true}
namespace :deploy do
desc 'Restart NGINX'
task :restart do
on roles(:app), in: :sequence, wait: 1 do
execute :sudo, "./restart.sh"
end
end
end
此任务基本上运行一个名为的 shell 脚本restart.sh
,其中包含一个命令sudo service nginx restart
。
你想要“作为用户结束”,比如
as "root" do
execute :something
end
如果您真的需要使用sudo
,您可以随时将类似于SSHKit.config.command_map[:rm] = 'sudo rm'
make的命令映射execute :rm
到rm
使用sudo
. 如果您的部署用户在 sudoers 中,事情将按预期工作。