ruby – Capistrano 3改变任务中的ssh_options

我尝试使用不同的ssh_options在同一阶段运行capistrano v.3任务.

我的production.rb说:

set :stage,:production

set :user,'deploy'
set :ssh_options,{ user: 'deploy' }

通过这种配置,capistrano与用户部署连接,这对于其余的用户来说是正确的.但是我需要将一个特定任务与一个在服务器中配置良好的an_other_user连接起来.
然后我的食谱说:

...
tasks with original user
...

task :my_task_with_an_other_user do
  set :user,'an_other_user'
  set :ssh_options,{ user: 'an_other_user' }

  on roles(:all) do |host|
    execute :mkdir,'-p','mydir'
  end
end

...
other tasks with original user
...

执行时:

cap production namespace:my_task_with_an_other_user

capistrano使ssh conexion与original:user“deploy”(在production.rb中声明的用户).

如何在任务中更改用户和/或ssh_options?

解决方法

卡皮斯特拉诺3

我很难找到解决方案.但是解决方案比版本2好得多.Cap团队做得很好.确保你已将Capistrano更新为3.2.x这就是诀窍:

# in config/deploy/production.rb,or config/deploy/staging.rb
# These roles are used for deployment that works with Cap hooks
role :app,%w{deploy@myserver.com}
role :web,%w{deploy@myserver.com}
role :db,%w{deploy@myserver.com}

# Use additional roles to run side job out side Capistrano hooks
# 'foo' is another ssh user for none-release purpose tasks (mostly root tasks).
# e.g. user 'deploy' does not have root permission,but 'foo' has root permission.
# 'no_release' flag is important to flag this user will skip some standard hooks
# (e.g. scm/git/svn checkout )
role :foo_role,%w{foo@myserver.com},no_release: true

确保’部署’和’ ‘foo’用户可以进入框中.在您的任务中,使用on关键字:

task :restart do
  on roles(:foo_role) do
    sudo "service Nginx restart"
  end
end

task :other_standard_deployment_tasks do
  on release_roles(:all) do
     # ...
  end
end

其他陷阱:

确保某些Capistrano任务跳过您添加的其他无释放角色.否则,它可能会在部署期间导致文件权限问题.例如. capistrano / bundler扩展需要覆盖认的bundler_roles

set :bundler_roles,%w(web app db)  # excludes the no release role.

>阅读更多关于no_release标志:related Github issue.

卡皮斯特拉诺2

我曾经有一个自定义函数关闭和重新连接ssh会话.

>参考Paul Gross’s Blog

将以下方法放在deploy.rb中.调用with_user来切换ssh会话.稍微简化的版本:

def with_user(new_user,&block)
  old_user = user
  set :user,new_user
  close_sessions
  yield
  set :user,old_user
  close_sessions
end

def close_sessions
  sessions.values.each { |session| session.close }
  sessions.clear
end

用法

task :update_Nginx_config,:roles => :app do
  with_user "root" do
    sudo "Nginx -s reload"
  end
end

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...