gpt4 book ai didi

ruby-on-rails - 如何访问 Capistrano 中的服务器特定选项?

转载 作者:数据小太阳 更新时间:2023-10-29 06:48:44 26 4
gpt4 key购买 nike

我正在尝试将 Capistrano 配置为在两台不同的服务器上执行相同的任务,每台服务器都有不同的凭据。我想做一些类似的事情:

namespace :deploy do
role :db, "192.168.1.1", :credentials => "db1.yml"
role :db, "192.168.1.1", :credentials => "db2.yml"

task :mytask, :roles => :db do
credentials = YAML.load_file(something)
...

这可能吗?为了访问当前服务器配置,我应该用什么替换 something

最佳答案

好的,我终于有时间解决这个问题了。希望其他人会发现这个答案有用。这是我最终解决问题的方法:

role :db, "db1" ,{ :credentials => 'db1-credentials'}                     
role :db, "db2" ,{ :credentials => 'db2-credentials'}
role :db, "db3"

namespace :stackoverflow do

# Don't run this task on host that don't have credentials defined
task :default, {:role => :db, :except => {:credentials => nil } } do
servers = find_servers_for_task(current_task)
servers.each do |server|
credentials = server.options[:credentials]

puts credentials # actual task

end
end
end

我现在明白我可能以一种令人困惑的方式陈述了这个问题 - 那是因为我不明白,那个任务是同时运行的。

这实际上将为每个服务器执行一次任务(此处 puts credentials),这正是我试图做的。

输出:

$ cap stackoverflow
* executing `stackoverflow'
db1-credentials
db2-credentials

向任务添加过滤器是个好主意,这样它就不会在服务器没有凭据的情况下运行。

话虽这么说,但事实证明,让团队中的每个人都维护所有服务器的当前(并且出于安全原因,非版本化)凭证太麻烦了(因此打败了使用 Capistrano 的想法)。现在,我不再将外部配置保留在用户的磁盘上,而是将数据保留在受影响的服务器上(主要以可运行脚本的形式,所有凭据都隐藏在里面)。像这样:

task :dump {:role => :db} do
run "/root/dump_db.sh | gzip > /tmp/dump.sql.gz"
download "/tmp/dump.sql.gz", "somewhere"
end

关于ruby-on-rails - 如何访问 Capistrano 中的服务器特定选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7556116/

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