Capistrano 3 sudo任务

时间:2013-11-13 08:26:26

标签: ruby-on-rails capistrano capistrano3

我想用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运行任务?

5 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:15)

我通常这样写:

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

答案 2 :(得分:14)

要解决此问题,我需要将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内有一个命令。

答案 3 :(得分:3)

你想"当用户结束",如

as "root" do
  execute :something
end

答案 4 :(得分:0)

如果您确实需要使用sudo,则可以始终映射SSHKit.config.command_map[:rm] = 'sudo rm'这样的命令,这将使execute :rm成为使用rm调用的正确sudo命令。如果您的部署用户处于sudoers状态,则可以按预期工作。