Capistrano 3 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 

此任务基本上运行一个名为restart.sh的shell脚本,该脚本在sudo service nginx restart中有一个命令。

你想要“像用户一样结束”,比如

 as "root" do execute :something end 

如果你真的需要使用sudo你总是可以映射命令,如SSHKit.config.command_map[:rm] = 'sudo rm' ,这将使execute :rm成为用sudo调用的正确rm命令。 如果您的部署用户在sudoers中,事情将按预期工作。