我试图配置Capistrano在两个不同的服务器上执行相同的任务,每个服务器都有不同的凭据.我想做一些类似的事情:
namespace :deploy do role :db,"192.168.1.1",:credentials => "db1.yml" role :db,:credentials => "db2.yml" task :mytask,:roles => :db do credentials = YAML.load_file(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
我现在看到,我可能以混乱的方式提出了这个问题 – 那是因为我没有理解,那个任务是同时运行的.
这实际上将为每个服务器执行一次任务(这里放置凭证),这是我正在尝试的.
输出:
$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