Question

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 sur app2.example.com.

Merci!

[mise à jour] 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 la version 2.2.0)?

Était-ce utile?

La solution

J'ai fini par poser une question sur la liste d'utilisateurs de Capistrano ici . , et a obtenu 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 est déclaré.

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

cap HOSTFILTER=app2.example.com production deploy 

[...]

Considérez cet exemple concret. Supposons que votre Le script définit trois serveurs, A, B et C. Et définit 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 , la commande echo sera exécutée à la fois sur A et B.

Si vous faites cap HOSTS = C foo , il lancera la commande echo sur C, quel que soit le paramètre: roles de la tâche.

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

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

Enfin, si vous plafonnez HOSTFILTER = A, B, C foo , il lancera l'écho commande sur A et B (mais pas C), car (A B) a croisé avec (A B C) est (AB).

En résumé: HOSTS écrase 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, d’autre part, ne fait que filtrer les hôtes existants contre la liste donnée, en choisissant uniquement les serveurs qui sont déjà en la liste du serveur de tâches.

Autres conseils

Ce qui suit devrait fonctionner immédiatement:

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

J'ai un problème similaire et j'ai essayé ce qui suit. Ça marche:

cap production ROLES=web HOSTS=machine1 stats

Vous devriez pouvoir faire quelque chose comme ceci dans deploy.rb:

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

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 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top