4

私のファブリック スクリプトには、次の問題があります。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
4

3 に答える 3

6

ラッパー関数 autodeploy 内で execute 関数を使用し、リモート タスクのホスト リストを指定します。

他の 2 つは、リモート タスクのように execute で呼び出すか、直接呼び出すことができます。それらの内部で local 関数を使用すれば問題なく、localhost で 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 に答える