在我的结构脚本中,我遇到以下问题。我有一个主要任务称为自动部署。在此任务中,我有一些只想在本地运行一次的任务。所有远程任务都应在主机列表中的每个主机上运行。
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
使用包装函数autodeploy中的execute函数,并为远程任务指定主机列表。
对于另外两个,您可以使用execute调用它们,就像远程任务一样,或者直接调用它们。使用它们内部的本地函数就可以了,不需要在本地主机上使用 ssh。
编辑
既然您在评论中提到了不同的用例,我将根据已经给出的文档中的位来模拟您的做法,添加参数传递部分
代码:
#copy above
#redefine this one
def autodeploy(role_from_arg):
localtask1()
execute(remotetask, role=role_from_arg)
localtask2()
#calls like fab autodeploy:testing
使用 runs_once 装饰器。
@runs_once
def localtask1():
local('command')