4

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

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
4

3 回答 3

6

使用包装函数 autodeploy 中的 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
于 2012-09-19T12:29:04.780 回答
3

使用runs_once装饰器。

@runs_once
def localtask1():
    local('command')
于 2014-10-20T15:50:59.707 回答
2

您可以通过将“localhost”指定为主机来滥用hosts装饰器来强制单个任务仅运行一次。

例子:

@fabric.decorators.hosts("localhost")
def localtask1():
    # download artefact
于 2016-08-18T10:25:28.477 回答