在我的结构脚本中,我遇到以下问题。我有一个名为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
答案 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