Capistrano 3 须藤任务

Posted

技术标签:

【中文标题】Capistrano 3 须藤任务【英文标题】:Capistrano 3 sudo task 【发布时间】:2013-11-25 18:15:34 【问题描述】:

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

【问题讨论】:

@Rubyman :use_sudo 不是 Capistrano 3 的有效设置。请参阅此related ticket 【参考方案1】:

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

【讨论】:

是的,只有设置set :pty, true后才能用capistrano 3执行sudo命令,否则会报sudo stderr: sudo: no tty present and no askpass program specified错误。 当我这样做时,它会询问我的密码,但我无法“输入”它,它只会给我换行符.. @TimBaas 你能解决你的问题吗?我也遇到了同样的问题 @aelor 你解决了那个问题,我被困在同一个地方 @ArianFaurtosh @aelor - 确保您已添加 set :ssh_options, :forward_agent => true【参考方案2】:

我通常是这样写的:

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

【讨论】:

我已经试过了。控制台显示: INFO [5d8e920e] Running /usr/bin/env sudo cp ~/something /something on example.local DEBUG [5d8e920e] 命令:/usr/bin/env sudo cp ~/something /something DEBUG [5d8e920e] [sudo] main 的密码:我也可以插入我的密码,顺便显示,但是返回时任务不继续。 如果你真的想用带密码的sudo,你应该使用capistrano 2。 这行得通。谢谢。如果有人想用 sshkit-sudo 做 apt-ge,试试sudo :'apt-get', '-y install curl'【参考方案3】:

你想要“作为用户结束”,比如

as "root" do
  execute :something
end

【讨论】:

我认为这是 Capistrano 2.x 的语法? AFAIK as-user-do 是一个新的 cap 3 结构。我可能是错的,但我从婴儿期开始就一直在使用 cap,并且不记得在更新版本之前见过这个构造。但是——我的记忆肯定是错误的。【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

如果您的政策规定您必须使用密码?

以上是关于Capistrano 3 须藤任务的主要内容,如果未能解决你的问题,请参考以下文章

Capistrano mkdir 权限被拒绝

Capistrano、防火墙和隧道

用capistrano+Nginx+Passenger+MYSQL部署rails到VPS。

apache_conf 配置。 Capistrano 3的文件上传器任务

Capistrano 3 在目录中执行

使用 Rails 为 capistrano 3.8.0 运行“cap production deploy”时不知道如何构建任务“start”