108 votes

Comment définir les hôtes de cible dans le fichier de tissu

Je veux utiliser le Tissu pour déployer mon code d'application web pour le développement, la mise en scène et les serveurs de production. Mon fabfile:

def deploy_2_dev():
  deploy('dev')

def deploy_2_staging():
  deploy('staging')

def deploy_2_prod():
  deploy('prod')

def deploy(server):
  print 'env.hosts:', env.hosts
  env.hosts = [server]
  print 'env.hosts:', env.hosts

Exemple de sortie:

host:folder user$ fab deploy_2_dev
env.hosts: []
env.hosts: ['dev']
No hosts found. Please specify (single) host string for connection:

Quand je crée un set_hosts() de la tâche, comme indiqué dans le Tissu docs, env.hôtes est correctement réglé. Cependant, ce n'est pas une option viable, ni un décorateur. En passant hôtes sur la ligne de commande, cela aboutirait à une sorte de script shell qui appelle la fabfile, je préfère avoir un seul outil faire le travail correctement.

Il est dit dans le Tissu docs que " env.hôtes est simplement une liste Python objet". À partir de mes observations, ce n'est tout simplement pas vrai.

Quelqu'un peut-il expliquer ce qui se passe ici ? Comment puis-je régler l'hôte à se déployer ?

129voto

Zac Points 1032

Je fais cela par la déclaration d'une fonction réelle pour chaque environnement. Par exemple:

def test():
    env.user = 'testuser'
    env.hosts = ['test.server.com']

def prod():
    env.user = 'produser'
    env.hosts = ['prod.server.com']

def deploy():
    ...

En utilisant les fonctions ci-dessus, je voudrais tapez la commande suivante pour déployer à mon environnement de test:

fab test deploy

...et les suivantes pour déployer à la production:

fab prod deploy

La bonne chose à propos de cette façon de faire est que l' test et prod fonctions peuvent être utilisées avant tout fab fonction, non seulement de déployer. Il est incroyablement utile.

77voto

thomie Points 580

Utiliser roledefs

Choisir le rôle avec - r :

49voto

Toby Champion Points 1453

Voici une version simplifiée de la réponse du serveur horreur :

21voto

GoldenBoy Points 683

A été collé sur moi-même, mais enfin compris. Vous simplement ne pouvez pas définir l'env.configuration des hôtes à partir de l'intérieur d' une tâche. Chaque tâche est exécutée N fois, une fois pour chaque Hôte, de sorte que le réglage est fondamentalement à l'extérieur du périmètre de la tâche.

En regardant ton code ci-dessus, vous pouvez simplement faire ceci:

@hosts('dev')
def deploy_dev():
    deploy()

@hosts('staging')
def deploy_staging():
    deploy()

def deploy():
    # do stuff...

Qui semble que ce serait faire ce que vous avez l'intention.

Ou vous pouvez écrire du code personnalisé dans la portée globale qui analyse les paramètres manuellement, et définit env.les hôtes avant votre tâche la fonction est définie. Pour quelques raisons, c'est en fait la façon dont j'ai mis le mien.

18voto

j-a Points 476

Depuis fab 1.5 c'est documentée de façon à définir de façon dynamique des hôtes.

http://docs.fabfile.org/en/1.7/usage/execution.html#dynamic-hosts

Quoute de la doc ci-dessous.

À l'aide d'exécuter de façon dynamique-définir des listes d'hôtes

D'un commun intermédiaire à avancé cas d'utilisation de Tissu est de paramétrer recherche d'une cible de la liste d'hôtes au moment de l'exécution (lors de l'utilisation de Les rôles ne suffit pas). exécuter pouvez faire cela très simple, comme donc:

from fabric.api import run, execute, task

# For example, code talking to an HTTP API, or a database, or ...
from mylib import external_datastore

# This is the actual algorithm involved. It does not care about host
# lists at all.
def do_work():
    run("something interesting on a host")

# This is the user-facing task invoked on the command line.
@task
def deploy(lookup_param):
    # This is the magic you don't get with @hosts or @roles.
    # Even lazy-loading roles require you to declare available roles
    # beforehand. Here, the sky is the limit.
    host_list = external_datastore.query(lookup_param)
    # Put this dynamically generated host list together with the work to be
    # done.
    execute(do_work, hosts=host_list)

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