31 votes

Une tâche Python Fabric peut-elle invoquer d'autres tâches et respecter leurs listes d'hôtes?

J'ai un fabfile comme suit:

@hosts('host1')
def host1_deploy():
    """Some logic that is specific to deploying to host1"""

@hosts('host2')
def host2_deploy():
    """Some logic that is specific to deploying to host2"""

def deploy():
    """"Deploy to both hosts, each using its own logic"""
    host1_deploy()
    host2_deploy()

Je voudrais faire

fab deploy

et ont-il équivalent à

fab host1_deploy host2_deploy

En d'autres termes, exécutez chacune des sous-tâches et pour chacun d'utiliser la liste des hôtes qu'il spécifie. Toutefois, cela ne fonctionne pas. Au lieu de cela, le déploiement (des) tâche veut son propre liste des hôtes qu'il va propager à l'ensemble de ses sous-tâches.

Est-il un moyen de mettre à jour le déployer (des) tâche ici, donc il va faire ce que je veux, tout en laissant les sous-tâches seul, de sorte qu'ils peuvent être exécutés individuellement?

31voto

Mitchell Points 6646

Depuis Tissu 1.3, l' execute d'aide est maintenant disponible pour faire juste cela. La documentation est disponible ici: Intelligemment de l'exécution des tâches à exécuter.

Voici l'exemple qu'ils utilisent:

from fabric.api import run, roles

env.roledefs = {
    'db': ['db1', 'db2'],
    'web': ['web1', 'web2', 'web3'],
}

@roles('db')
def migrate():
    # Database stuff here.
    pass

@roles('web')
def update():
    # Code updates here.
   pass

Et puis d'exécuter à la fois migrate et web d'une autre tâche deploy:

def deploy():
    execute(migrate)
    execute(update)

Et cela permettra de respecter les rôles et les hôtes listes de ces tâches.

3voto

Evan R. Points 349

C'est boiteux mais cela fonctionne à partir de Fabric 1.1.2

 def host1_deploy():
    """Some logic that is specific to deploying to host1"""
    if env.host in ["host1"]:
        pass #this is only on host2

def host2_deploy():
    """Some logic that is specific to deploying to host2"""
    if env.host in ["host2"]:
        pass #this is only on host2

def deploy():
    """"Deploy to both hosts, each using its own logic"""
    host1_deploy()
    host2_deploy()
 

voici mon code de test:

 @task
@roles(["prod_web","prod_workers"])
def test_multi():
    test_multi_a()
    test_multi_b()

def test_multi_a():
    if env.host in env.roledefs["prod_web"]:
        run('uname -a')

def test_multi_b():
    if env.host in env.roledefs["prod_workers"]:
        run('uname -a')
 

1voto

pwan Points 2038

Il y a probablement une meilleure façon de le gérer, mais vous pouvez passer les deux hôtes à deploy (), puis dans host1_deploy () et host2_deploy (), vérifiez env.host:

 def host1_deploy():
    if env.host in ['host1']:
         run(whatever1)

def host2_deploy():
    if env.host in ['host2']:
         run(whatever2)

@hosts('host1','host2')
def deploy():
    host1_deploy()
    host2_deploy()
 

1voto

Charles Hooper Points 1311

Essaye celui-là. Évidemment, vous voulez remplacer local par run ou sudo . La clé est vide @hosts décorateur pour deploy

 from fabric.api import local
from fabric.decorators import hosts

@hosts('host1')
def host1_deploy():
    """Some logic that is specific to deploying to host1"""
    local('echo foo')

@hosts('host2')
def host2_deploy():
    """Some logic that is specific to deploying to host2"""
    local('echo bar')

@hosts('')
def deploy():
    """"Deploy to both hosts, each using its own logic"""
    host1_deploy()
    host2_deploy()
 

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