Fabric - 在所有任务完成之前和之后在本地运行命令

时间:2013-11-07 04:52:08

标签: python fabric

我正在尝试在我的结构脚本中宣布部署开始和结束。这样的感觉应该很容易,但对于我的生活,我无法弄清楚如何去做。

env.hosts = ['www1', 'www2', 'www3', 'www4']


def announce_start(): 
    # code to connect to irc server and announce deployment begins
    pass


def announce_finish(): 
    # code to connect to irc server and announce deployment finishes
    pass


def deploy():
    # actual deployment code here
    pass

这是我尝试过的:

如果我使部署任务包含'announce_start'和'announce_finish'。它将尝试在每台服务器上运行所有这些任务。

def deploy(): 
    announce_start()
    # actual deployment code here
    announce_finish()

如果我用@hosts('localhost')装饰announce_start()和announce_end(),它会在localhost上运行它,但仍然是四次。每个主机一个。

当我输入这个时,我终于通过在announce_start / end和fab命令上使用装饰器@hosts('localhost')来实现它:

fab announce_start deploy announce_end

但这看起来有点黑客。我希望它包含在一个部署命令中。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:4)

您可以使用fabric.api.execute,例如

def announce_start(): 
    # code to connect to irc server and announce deployment begins
    pass

def announce_finish(): 
    # code to connect to irc server and announce deployment finishes
    pass

@hosts(...)
def deploy_machine1():
    pass

@hosts(...)
def deploy_machine2():
    pass

def deploy():
    announce_start()
    execute(deploy_machine1)
    execute(deploy_machine2)
    announce_finish()

然后只调用fab deploy