57 votes

Comment déployer sur un seul serveur spécifique en utilisant Capistrano

J'ai un système en production, ce qui a plusieurs serveurs dans plusieurs rôles. Je voudrais tester un nouveau serveur d'application par le déploiement de serveur, sans avoir à redéployer pour chaque serveur de production. Est-il un moyen de demander à Capistrano pour le déployer sur un serveur spécifique? Idéalement, je voudrais être en mesure d'exécuter quelque chose comme

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

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

Merci!

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

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

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

125voto

Pete Hodgson Points 5147

J'ai fini de poster une question sur le capistrano de la liste des utilisateurs ici, et a obtenu la réponse suivante à partir Jamis (modifié un peu par moi ici, pour plus de clarté):


Essayez les HÔTES de la variable d'environnement:

cap HOSTS=app2.example.com production deploy

Notez que cette opération permettra de traiter app2 comme dans tous les rôles, et pas seulement peu importe le rôle(s), il arrive à être déclarée.

Si ce que vous voulez est de faire régulièrement déployer, mais seulement agir sur app2, et seulement comme app2 est déclarée dans votre recette de fichier, vous pouvez utiliser le HOSTFILTER variable à la place:

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, "foo", 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 ne cap foo, il va exécuter la commande echo à la fois A et B.

Si vous n' cap HOSTS=C foo, il va exécuter la commande echo sur C, indépendamment de l' :rôles paramètre de la tâche.

Si vous n' cap HOSTFILTER=C foo, il ne sera pas exécuté la commande echo à tout, parce que l'intersection de (A B) et (C) est un ensemble vide. (Il n'y sont pas des hôtes dans foo liste des hôtes qui correspondent C.)

Si vous n' cap HOSTFILTER=A foo, il va exécuter la commande echo sur seulement Un, parce que (A B) a recoupé avec (Un) (Un).

Enfin, si vous n' cap HOSTFILTER=A,B,C foo, il va exécuter l'echo commande sur A et B (mais pas de C), parce que (A B) a recoupé avec (A B C) (B).

Pour résumer: les HÔTES se substitue complètement les hôtes ou les rôles de la déclaration de de la tâche, et les forces de tout à l'encontre de l'hôte spécifié(s). Le HOSTFILTER, sur l'autre main, il suffit de filtres existants hôtes contre la liste donnée, en ne choisissant que les serveurs qui sont déjà en les tâches de la liste des serveurs.

3voto

wulong Points 1360

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
 

2voto

Xian Xu Points 131

J'ai le même problème et j'ai essayé ce qui suit. Ça marche:

 cap production ROLES=web HOSTS=machine1 stats
 

1voto

Dave Pirotte Points 2895

Vous devriez pouvoir 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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X