Fabric如何定義複雜的env.hosts

Fabric如何定義複雜的env.hosts

我正在使用 Fabric 作為我的部署工具,並將命令分發到多個主機上。但我不知道如何在我的 fabfile.py 中定義複雜的主機

例如:我有4台伺服器。伺服器A、伺服器B、伺服器C、伺服器D

def prod():
    env.hosts = ["serverA', "serverB" ]

def dev():
    env.hosts = ["serverC' "serverD"]

def all():
    prod()
    dev()

我是否可以在所有主機上運行命令而無需再次定義?

EX: fab all {command}

答案1

你可以看一下定義角色為了您的環境。

from fabric.api import env, run
from fabric.decorators import task

env.roledefs = {
    'prod': ['ServerA', 'ServerB'],
    'dev': ['ServerC', 'ServerD'],
    'envC': ['ServerE', 'ServerF']
}

env.roledefs['all'] = [h for r in env.roledefs.values() for h in r]


@task
def hostname():
    run('hostname -f')

這意味著您現在必須像這樣發出結構呼叫:

fab -R prod hostname
fab -R dev hostname
fab -R all hostname
fab -R dev,envC hostname

答案2

更動態的替代解決方案... fabfile 中沒有靜態配置,使用 bash。

mfab() {
    hosts=()
    while [ "$#" != 0 ]; do
        if [ "$1" = -- ]; then
            shift
            break
        fi
        hosts+=("$1")
        shift
    done

    list=$(echo "${hosts[@]}" | tr ' ' ',')
    fab -H "$list" "$@"
}

這是讓它進行空運行的方法...在測試之前運行它:

fab() { echo fab "$@"; }

範例 1:使用 shell 擴充功能/globbinb/任何你想使用的任意大小的列表

mfab node{A..D}{01..05} -- example_command

將運行如下命令:

fab -H nodeA01,nodeA02,nodeA03,nodeA04,nodeA05,nodeB01,nodeB02,nodeB03,nodeB04,nodeB05,nodeC01,nodeC02,nodeC03,nodeC04,nodeC05,nodeD01,nodeD02,nodeD03,nodeD04,nodeD05 example_command

範例 2:我剛剛部署了 7 台新機器,每第二台機器都壞了,我想執行一個命令來檢查/修復它。

mfab node{100..106..2} -- example_command

將運行如下命令:

fab -H node100,node102,node104,node106 example_command

範例 3:更多選項,包括--Fabric 本身使用的選項:

mfab node{01..10} -- -P -- uname -a

相關內容