Python Fabric任务是否可以调用其他任务并尊重其主机列表?

fab*_*ion 31 python deployment ssh fabric

我有一个如下的fabfile:

@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()
Run Code Online (Sandbox Code Playgroud)

我想要做

fab deploy
Run Code Online (Sandbox Code Playgroud)

并且它等同于

fab host1_deploy host2_deploy
Run Code Online (Sandbox Code Playgroud)

换句话说,运行每个子任务,并为每个子任务使用它指定的主机列表.但是,这不起作用.相反,deploy()任务需要它自己的主机列表,它将传播到它的所有子任务.

有没有办法在这里更新deploy()任务,这样它可以做我想要的,同时单独留下子任务,以便它们可以单独运行?

Mit*_*ell 30

从Fabric 1.3开始,execute帮助器现在就可以做到这一点.这里提供了文档:使用execute智能执行任务.

以下是他们使用的示例:

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
Run Code Online (Sandbox Code Playgroud)

然后同时运行migrate,并web从另一个任务deploy:

def deploy():
    execute(migrate)
    execute(update)
Run Code Online (Sandbox Code Playgroud)

这将尊重这些任务所具有的角色和主机列表.


pwa*_*wan 1

可能有更好的方法来处理它,但是您可以将两个主机传递给deploy(),然后在host1_deploy()和host2_deploy()中检查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()
Run Code Online (Sandbox Code Playgroud)