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). # eg 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 # (eg scm/git/svn checkout ) role :foo_role, %w{foo@myserver.com}, no_release: true 

确保’deploy’和’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标志: 相关的Github问题 。

卡皮斯特拉诺2

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

  • 参考Paul Gross的博客

将以下方法放在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 

@activars的答案对我不起作用。 因为当我为一个环境定义了几个角色时 – 只部署了一个:(

所以我的解决方案是创建几个环境,例如production.rbproductionroot.rb

productionroot的内容带有no_release = true标志 – 就像你指定的那样:

 server '146.120.89.81', user: 'root', roles: %w{foo_role}, no_release: true 

之后我创建了运行的sh脚本

 #/usr/bin/env bash bundle exec cap production deploy bundle exec cap productionroot deploy