Python布料任务能否调用其他任务并遵守它们的主机列表?

2024-04-28 05:18:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个fab文件如下:

@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()

我想这样做

fab deploy

让它等于

fab host1_deploy host2_deploy

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

这里有没有方法更新deploy()任务,以便它在保持子任务单独运行的同时执行我想要的操作?


Tags: 文件to列表thatisdefsomedeploy
3条回答

可能有更好的方法来处理它,但是可以将两个主机都传递给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()

这是蹩脚的,但它在织物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()

这是我的测试代码:

@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')

从Fabric 1.3开始,execute助手现在就可以执行此操作。这里有文档:Intelligently executing tasks with 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

然后从另一个任务运行migrateweb

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

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

相关问题 更多 >