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

问题描述 投票:0回答: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
fabric continuous-delivery autodeploy
4个回答
6
投票

使用包装函数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

3
投票

使用 runs_once 装饰器。

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

2
投票

您可以滥用

hosts
装饰器,通过指定“localhost”作为主机来强制单个任务仅运行一次。

示例:

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

0
投票

使用 execute function@runs_once 装饰器之间存在差异。

确保您阅读突出显示的红色警告

但是,简短的答案是在您的情况下使用

@runs_once
装饰器就是您所需要的。

© www.soinside.com 2019 - 2024. All rights reserved.