我尝试使用不同的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
将以下方法放在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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。