OK, ho finalmente avuto un po 'di tempo per risolvere questo. Speriamo che qualcun altro trovi utile questa risposta. Ecco come ho finalmente risolto il problema:
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
Vedo ora che io possa aver dichiarato la questione in un modo confuso - è perché non avevo capito, questo compito vengono eseguiti contemporaneamente.
Questo infatti eseguirà l'attività (qui puts credentials
) una volta per ciascun server, che era quello che stavo cercando di fare.
uscita:
$ cap stackoverflow
* executing `stackoverflow'
db1-credentials
db2-credentials
E 'una buona idea quella di aggiungere un filtro a un'attività in modo che non verrà eseguito se il server non dispone di credenziali.
Detto questo, far sì che tutti i membri del team mantengano le credenziali attuali (e per ragioni di sicurezza non in versione) su tutti i server si è rivelato troppo complicato (vanificando così l'idea di utilizzare Capistrano). Ora invece di mantenere la configurazione esterna sui dischi degli utenti, manterrò i dati sui server interessati (principalmente sotto forma di script eseguibili con tutte le credenziali nascoste all'interno).Come questo:
task :dump {:role => :db} do
run "/root/dump_db.sh | gzip > /tmp/dump.sql.gz"
download "/tmp/dump.sql.gz", "somewhere"
end
Ho cercato come fare 'find_servers_for_task (current_task)' per ore. Grazie mille. – aceofspades