如何在Capistrano的deploy.rb中定义默认SSH用户而非stages文件?
在Capistrano中统一设置默认SSH用户(简化stages配置)
为什么你之前的方法部分任务不生效
你之前在:composer:install前覆盖host用户的方式,只对该任务及之后的任务生效——Capistrano在部署初期就已经初始化了大部分服务器连接配置,早期的任务(比如代码拉取、目录准备)会先于你的override_ssh_user任务执行,所以这些任务还是用默认的capistrano用户。
可行实现方案
方案1:用Capistrano内置:user变量 + 环境变量(推荐)
这种方式最简洁,利用Capistrano的内置全局变量,不需要修改stages文件:
在deploy.sh中传入环境变量
# deploy.sh 内容 # 直接在命令前指定环境变量,或者提前export CAP_SSH_USER="my_user" cap production deploy在config/deploy.rb中全局设置默认用户
# 全局设置SSH用户:优先用环境变量的值,没有的话用自定义默认值 set :user, ENV['CAP_SSH_USER'] || 'my_default_user'这样你的stages文件(比如
config/deploy/production.rb)只需要保留域名和角色:# config/deploy/production.rb server 'prod.example.com', roles: [:web, :app] server 'db.example.com', roles: [:db]Capistrano会自动把
:user变量应用到所有服务器的SSH连接中,个别需要特殊用户的服务器,还可以在stages里单独指定(会覆盖全局设置):server 'special-server.example.com', roles: [:web], user: 'special_user'
方案2:加载配置后统一覆盖所有host用户
如果需要更灵活的控制,可以在Capistrano加载配置后,遍历所有host设置用户:
deploy.sh中设置环境变量
# deploy.sh 内容 export CAP_SSH_USER="my_user" cap production deploy在config/deploy.rb中添加钩子
# 加载完配置后,给所有host设置默认SSH用户 after :load_config, :set_global_ssh_user do on roles(:all) do |host| # 优先用环境变量, fallback到自定义默认值 host.user = ENV['CAP_SSH_USER'] || 'fallback_user' end end同样,stages文件只需要保留域名和角色即可。
内容的提问来源于stack exchange,提问作者Asenar
相关产品推荐
相关产品推荐

