gpt4 book ai didi

ruby - Capistrano 3 在任务中更改 ssh_options

转载 作者:数据小太阳 更新时间:2023-10-29 07:13:36 25 4
gpt4 key购买 nike

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

我的 production.rb 说:

set :stage, :production

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

通过此配置,capistrano 与用户 deploy 连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的 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 与原来的 :user "deploy"(在 production.rb 中声明的用户)进行 ssh 连接。

如何在任务中更改用户和/或 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

确保“deploy”和“foo”用户都可以通过 ssh 进入该框。在您的任务中,使用 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.

卡皮斯特拉诺 2

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

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

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

关于ruby - Capistrano 3 在任务中更改 ssh_options,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22054076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com