Ткань, как определить сложные 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}

3 ответа

Решение

Вы могли бы взглянуть на определение ролей для вашей среды.

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

Большое спасибо user76776 за вашу помощь.

На самом деле мой конфиг для хоста немного сложнее.

env.roledefs = {
    'webA': ['ServerA', 'ServerB'],
    'dbA': ['ServerC', 'ServerD'],
    'webB': ['serverF', 'ServerK'],
    'dbB': ['serverX', 'ServerV']  }

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

webA и dbA - серверы для Таиланда (система для Таиланда) webB и dbB - серверы для Вьетнама (система для Вьетнама)

вариант 1: выполнить команду на всех серверах (это работает как ваша рекомендация)

вариант 2: как я могу выполнить команду на всех веб-серверах (включая 2 страны - webA и webB)?Случай 3: как я могу выполнить команду только на серверах Таиланда (включая WebA и DBA)?

извините, если мой вопрос плохой, так как я новичок с тканью.

Большое спасибо за Вашу помощь.

Альтернативное решение для чего-то более динамичного... без статической конфигурации в 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: список произвольных размеров, используя расширения оболочки /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: больше опций, включая -- Используется самой тканью:

mfab node{01..10} -- -P -- uname -a
Другие вопросы по тегам