2009-01-09 10 views
53

J'ai un système en production qui a plusieurs serveurs dans plusieurs rôles. Je souhaite tester un nouveau serveur d'applications en le déployant sur ce serveur spécifique, sans devoir le redéployer sur tous les serveurs en production. Existe-t-il un moyen de demander à Capistrano de se déployer sur un serveur spécifique? Idéalement, je voudrais être en mesure d'exécuter quelque chose commeComment déployer sur un seul serveur spécifique en utilisant Capistrano

cap SERVER=app2.example.com ROLE=app production deploy 

si je voulais juste déployer à app2.example.com.

Merci!

[mise à jour] J'ai essayé la solution proposée par Wulong en exécutant:

cap HOSTS=app2.server.hostname ROLE=app qa deploy 

mais Capistrano semblait essayer d'exécuter des tâches pour d'autres rôles sur ce serveur en plus des tâches de l'application. Peut-être que j'ai besoin de mettre à jour ma version de cap (je cours v2.2.0)?

Répondre

122

J'ai fini par poster une question sur les utilisateurs Capistrano liste here, et a obtenu la réponse suivante Jamis (édité un peu par moi pour plus de clarté):


Essayez HOSTS variable d'environnement:

cap HOSTS=app2.example.com production deploy 

Notez que faire cela traitera App2 comme dans tous les rôles , non seulement selon le rôle (s) il arrive à déclarer dans.

Si ce que vous voulez est de faire une Déployez régulière, mais seulement agir sur App2 et seulement comme App2 est déclaré dans votre fichier de recette, vous peut utiliser le HOSTFILTER variable au lieu:

cap HOSTFILTER=app2.example.com production deploy 

[...]

Considérons cet exemple concret. Supposons que votre script définit trois serveurs, A, B et C. Et il définit une tâche, « toto », que (par défaut) veut courir sur A et B, mais pas C. Comme ceci:

role :app, "A", "B" 
role :web, "C" 

task :foo, :roles => :app do 
    run "echo hello" 
end 

maintenant, si vous le faites cap foo, il exécutera la commande d'écho sur A et B.

Si vous cap HOSTS=C foo, il exécutera la commande d'écho sur C, quel que soit le: paramètre rôles à la tâche .

Si vous faites cap HOSTFILTER=C foo, la commande echo ne sera pas exécutée à , car l'intersection de (A B) et (C) est un ensemble vide.(Il n'y a pas hôtes dans la liste d'hôtes foo qui correspondent à C.)

Si vous cap HOSTFILTER=A foo, il exécutera la commande echo uniquement A, parce que (A B) a recoupé avec (A) est (A).

Enfin, si vous le faites cap HOSTFILTER=A,B,C foo, il exécutera commande l'écho sur A et B (mais pas C), parce que (A B) a recoupé avec (A B C) est (A B). Pour résumer: HOSTS remplace complètement la déclaration des hôtes ou des rôles de la tâche et force tout à s'exécuter sur les hôtes spécifiés. L'HOSTFILTER, en revanche, filtre simplement les hôtes existants par rapport à la liste donnée, en ne sélectionnant que les serveurs qui figurent déjà dans la liste des serveurs de tâches .

+0

On dirait que cela ne marche plus avec Capistrano 3.4 – collimarco

+0

Dans Capistrano 3, vous utiliserez la variable d'environnement HOSTS pour ce que HOSTFILTER est dans Capistrano 2. http://capistranorb.com/documentation/advanced-features/host-filtering / – codener

1

Vous devriez être en mesure de faire quelque chose comme ça dans deploy.rb:

task :production do 
    if ENV['SERVER'] && ENV['ROLE'] 
    role ENV['ROLE'], ENV['SERVER'] 
    else 
    # your full config 
    end 
end 
3

Ce qui suit devrait fonctionner hors de la boîte:

cap HOSTS=app2.example.com ROLE=app deploy 

Si vous souhaitez déployer sur> 1 serveur avec le même rôle:

cap HOSTS=app2.example.com,app3.example.com,app4.example.com ROLE=app deploy 
+1

J'ai essayé le premier cas (déploiement sur un seul serveur d'applications) en exécutant cap HOSTS = app2.server .hostname ROLE = app qa deploy mais Capistrano semblait essayer d'exécuter des tâches pour d'autres rôles sur ce serveur en plus des tâches de l'application. Peut-être que j'ai besoin de mettre à jour ma version de cap (je cours 2.2.0). –

+0

HOSTFILTER est la réponse, ce n'est pas ce que vous voulez. –

1

J'ai un problème similaire et j'ai essayé ce qui suit. Il fonctionne:

cap production ROLES=web HOSTS=machine1 stats 
0

Vous pouvez également spécifier des hôtes niveau des tâches des paramètres de cette façon:

task :ship_artifacts, :hosts => ENV['DEST_HOST'] do 

end