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

Mic*_*ler 4 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
Run Code Online (Sandbox Code Playgroud)

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

fab -R test autodeploy
Run Code Online (Sandbox Code Playgroud)

Mor*_*gan 6

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

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

文档在这里是如何最好地使用新的执行功能.

编辑

既然你在评论中提到了一个不同的用例,我将模拟你如何做到这一点,从已经给出的文档中的位,添加param传递部分

码:

#copy above

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

#calls like fab autodeploy:testing
Run Code Online (Sandbox Code Playgroud)