2010-11-05 3 views
16

J'utilise Capistrano pour gérer une application Web Java qui s'exécute sur plusieurs serveurs à charge équilibrée. Certaines tâches (telles que les modifications de configuration) nécessitent un redémarrage du serveur ou un redéploiement de l'application, au cours de laquelle le serveur devient non réactif. Si Capistrano pouvait effectuer ces tâches sur les serveurs de manière consécutive ou concurrente, une seule machine de la batterie descendrait à la fois, et l'équilibreur de charge garantirait qu'aucune requête n'est perdue. Cependant, d'après ce que je peux dire, Capistrano effectue uniquement des opérations sur des serveurs simultanément.Capistrano peut-il exécuter les tâches sur les hôtes de manière consécutive?

Pour être clair, je n'essaie pas d'exécuter différentes tâches de manière consécutive. J'essaie d'exécuter la même tâche sur différents serveurs consécutivement.

Je peux penser à quelques façons de pirater ceci dans ma configuration, mais il semble qu'il devrait y avoir un drapeau que je peux placer quelque part.

Quelqu'un sait-il comment faire?

Répondre

19

J'utilise ceci pour redémarrer les serveurs en série, au lieu de parallèle:

task :my_task, :roles => :web do 
    find_servers_for_task(current_task).each do |server| 
    run "[task command here]", :hosts => server.host 
    end 
end 
+0

Cela a fonctionné parfaitement. Je vous remercie. – devinfoley

+0

Merci beaucoup! Cela fonctionne parfaitement. – raskhadafi

+2

incroyable! btw, peut-être que le cap devrait ajouter une stratégie pour exécuter la tâche en séquence. – DiveInto

-1

Salut, il n'est pas possible de couture facilement dans Capistrano, bien sûr, certaines approches peuvent être prises.

1) vous pouvez spécifier chaque serveur dans un rôle différent et ajouter une tâche distincte responsable de la rotation des rôles et de l'appel de la tâche qui nécessite réellement la tâche.

2) vous pouvez écrire script séparé faisant la rotation comme ci-dessus, mais en utilisant différents noms d'hôtes au lieu des rôles

3), il est également possible de filtrer les noms d'hôtes/serveurs à Capistrano en utilisant la variable d'environnement, vous pourriez peut-être utiliser dans dans l'algorithme de rotation.

Malheureusement il n'y a pas de bonne documentation pour capistrano pour moi lire capistrano sources a très bien fonctionné mais cela prend aussi beaucoup de temps.

+0

Merci pour l'info.Pas la réponse que j'espérais, mais la vérité fait mal. Je pourrais essayer de fourchette et ajouter cette fonctionnalité. – devinfoley

16

Vous pouvez définir :max_hosts pour la tâche de limiter son parallélisme:

:max_hosts - spécifie le nombre maximal des hôtes qui devraient être sélectionnés à la fois. Si cette valeur est inférieure au nombre d'hôtes sélectionnés, les hôtes seront exécutés dans des groupes de max_hosts. La valeur par défaut est zéro, ce qui indique qu'il n'y a pas de limite d'hôte maximale. Veuillez noter que ceci ne limite pas le nombre de canaux SSH qui peuvent être ouverts, mais uniquement le nombre d'hôtes sur lesquels cela sera appelé.

Exemple:

desc "Say hello, one at a time" 
task :hello, :roles => :app, :max_hosts => 1 do 
    run "echo serial hello ; sleep 0 ; echo serial hello DONE" 
    # Note that task parameters do NOT get automatically passed on to 
    # other tasks, i.e. a call to "deploy:restart" would be 
    # unaffected by :max_hosts set here. Example: 
    self.send(:normal_hello) 
end 

desc "Say hello, everybody" 
task :normal_hello, :roles => :app do 
    run "echo 'normal (parallel) hello' ; sleep 10 ; echo normal hello DONE" 
end 
4

Capistrano 3 utilise SSHKit qui prévoit l'envoi séquentiel de commandes à plusieurs serveurs. Il y a un exemple sur la SSHKit me lire:

https://github.com/capistrano/sshkit

Note, Capistrano 3 est tout à fait un changement de Capistrano 2.x.

Questions connexes