如何混合任务和runs_once装饰器

时间:2014-01-10 15:33:00

标签: python fabric

如何在Fabric中混合@task和@runs_once装饰器?

我有一个任务(check_for_updates),用于检查每个主机上安装的Python包,并记录哪些需要更新。然后,我有一个任务(report_pending_updates),显示一个报告,显示哪些主机需要更新。所以我在做:

fab production check_for_updates report_pending_updates

但是,由于我有多台主机,它会为每台主机运行report_pending_updates,多次显示该报告。

我尝试过构建我的任务:

@runs_once
@task
def report_pending_updates():
    ...

但这会导致Fabric无法检测到该任务。切换装饰器顺序会导致同样的问题。

1 个答案:

答案 0 :(得分:1)

首先放置@task,否则它将无法识别它。至于runs_once,你是否并行运行它,它不会在forks中共享这个runs_once状态?

如果是这样或类似的话,你应该考虑使用execute()来处理这项工作。更像是这样:

def report_pending_updates():
    execute(check_for_updates, hosts=hosts)

    #everything else
    ...