【问题标题】:Capistrano 3 multiple server lazy variables overridingCapistrano 3 多个服务器延迟变量覆盖
【发布时间】:2015-01-21 17:46:25
【问题描述】:

我在 Capistrano v3 中在一个阶段将配置实施到多台服务器时遇到问题。或者我想要一些不可能的东西。

我在 deploy.rb 中创建了一个测试任务,如下所示:

namespace :test do
  task :run do
    on roles(:all) do
      print "\nenvcode:\n"
      p fetch(:envcode)
      print "\nglobal_var:\n"
      p fetch(:global_var)
      print "\nssh_options:\n"
      p fetch(:ssh_options)
      print "\nmain_domain_name:\n"
      p fetch(:main_domain_name)
    end
  end
end

这是一个定义到同一阶段的模拟服务器的配置:

role :app, %w{ip1 ip2}
role :web, %w{ip1 ip2}
role :db,  %w{ip1 ip2}

set :main_domain_name, "#{fetch(:envcode)}.mytestdomain.com"
set :global_var, 'foobar'

set :ssh_options, -> do
  { 
    user: 'userip0'
  }
end

server 'ip1',
  roles: %w{web db app},
  ssh_options: { user: 'userip1' },
  user: 'userip1',
  envcode: "envip1",
  dbname: 'userip1',
  dbuser: 'userip1',
  dbpass: 'password',
  dbhost: 'localhost'

server 'ip2',
  roles: %w{web db app},
  ssh_options: { user: 'userip2' },
  user: 'userip2',
  envcode: "envip2",
  dbname: 'userip2',
  dbuser: 'userip2',
  dbpass: 'password',
  dbhost: 'localhost'

当我运行 cap staging test:run 我得到这个输出意味着 capistrano 完全忽略了我的服务器覆盖:

envcode:
nil

global_var:
"foobar"

ssh_options:
{:user=>"userip0"}
envcode:
nil

main_domain_name:
".mytestdomain.com"

global_var:
"foobar"

ssh_options:
{:user=>"userip0"}

main_domain_name:
".mytestdomain.com"

我希望得到:

envcode:
envip1

global_var:
"foobar"

ssh_options:
{:user=>"userip1"}
envcode:
envip2

main_domain_name:
"envip1.mytestdomain.com"

global_var:
"foobar"

ssh_options:
{:user=>"userip2"}

main_domain_name:
"envip2.mytestdomain.com"

是我做错了什么,还是我对如何处理这些服务器配置数组的理解有误?

【问题讨论】:

    标签: deployment capistrano capistrano3 multistage


    【解决方案1】:

    envcode是服务器的一个属性,不能只使用fetch方法来获取值。

    namespace :test do
      task :run do
        on roles(:all) do |server|
          puts "envcode: #{server.properties.fetch(:envcode)}\n"
          puts "global_var: #{fetch(:global_var)}\n"
          puts "ssh_options: #{server.properties.fetch(:ssh_options)}\n"
          puts "main_domain_name: #{server.properties.fetch(:envcode)}.mytestdomain.com\n"
        end
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      • 2021-07-06
      相关资源
      最近更新 更多