web-dev-qa-db-fra.com

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

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 avoir à 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, j'aimerais pouvoir exécuter quelque chose comme

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

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

Merci!

[update] J'ai essayé la solution suggéré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 d'application. Peut-être dois-je mettre à jour ma version de cap (j'utilise v2.2.0)?

55
Pete Hodgson

J'ai fini par poster une question sur la liste des utilisateurs de capistrano ici et j'ai reçu la réponse suivante de Jamis (édité un peu par moi ici pour plus de clarté):


Essayez la variable d’environnement HOSTS:

cap HOSTS=app2.example.com production deploy

Notez que cela traitera app2 comme étant dans tous les rôles, pas seulement Quel que soit le ou les rôles pour lesquels il a été déclaré.

Si vous souhaitez effectuer un déploiement régulier, mais agir uniquement sur app2, et que Uniquement lorsque app2 est déclaré dans votre fichier de recette, vous pouvez utiliser la variable HOSTFILTER À la place:

cap HOSTFILTER=app2.example.com production deploy 

[...]

Considérez cet exemple concret. Supposons que votre script .__ définisse trois serveurs, A, B et C. Il définit également une tâche, "foo", Qui (par défaut) veut s'exécuter sur A et B, mais pas sur C. Comme ceci:

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

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

Maintenant, si vous faites cap foo, il exécutera la commande echo sur A et B.

Si vous faites cap HOSTS=C foo, la commande echo sera exécutée sur C, , Quel que soit le paramètre: roles de la tâche.

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

Si vous utilisez cap HOSTFILTER=A foo, la commande echo sera exécutée uniquement sur A, car (A B) intersecté avec (A) est (A).

Enfin, si vous faites cap HOSTFILTER=A,B,C foo, il exécutera la commande echo Sur A et B (mais pas C), car (A B) intersecté avec (A B C) Est (A B).

Pour résumer: HOSTS annule complètement la déclaration des hôtes ou des rôles De la tâche et force tout à s'exécuter sur le ou les hôtes spécifiés . HOSTFILTER filtre par contre les hôtes existants. par rapport à la liste donnée, en choisissant uniquement les serveurs qui figurent déjà dans la liste des serveurs de tâches.

124
Pete Hodgson

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
3
wulong

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

cap production ROLES=web HOSTS=machine1 stats
2
Xian Xu

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
1
Dave Pirotte

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

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

end 
0
jeffreyveon