如何使一些Fabric任务仅在本地运行一次,而其他任务在所有主机上运行

时间:2012-09-19 09:55:23

标签: fabric continuous-delivery autodeploy

在我的结构脚本中,我遇到以下问题。我有一个名为autodeploy的主要任务。在这个任务中,我有一些任务,我只想在本地运行一次。所有远程任务都应该在主机列表的每个主机上运行。

env.roledefs ={
  'testing': ['t-server-01', 't-server-02']  
  'staging': ['s-server-01', 's-server-02']  
  'live': ['l-server-01', 'l-server-02']  
}

def localtask1():
  # download artifact

def localtask2(): 
  # cleanup locally

def remotetask():
  # deploy artifact to all hosts

def autodeploy():
  localtask1() # run this task only once, locally  

  remotetask() # run this task on all hosts

  localtask2() # run this task only once

电话如下。我想将角色作为属性传递。

fab -R test autodeploy

3 个答案:

答案 0 :(得分:6)

使用包装器函数autodeploy中的execute函数,并指定远程任务的主机列表。

对于其他两个,您可以使用execute调用它们,例如远程任务,或直接调用它们。使用其中的本地函数,你会没事的,不需要在localhost上使用ssh。

文档here表示如何最好地使用新的execute function

修改

由于您在评论中提到了不同的用例,我将根据已经提供的文档中的位来模拟您的工作方式,添加param passing section

代码:

#copy above

#redefine this one
def autodeploy(role_from_arg):
    localtask1()
    execute(remotetask, role=role_from_arg)
    localtask2()

#calls like fab autodeploy:testing

答案 1 :(得分:3)

使用runs_once装饰器。

@runs_once
def localtask1():
    local('command')

答案 2 :(得分:2)

您可以滥用hosts decorator强制单个任务仅运行一次,方法是将“localhost”指定为主机。

示例:

@fabric.decorators.hosts("localhost")
def localtask1():
    # download artefact