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

좀 더 역동적인 것을 위한 대체 솔루션... bash를 사용하여 fabfile에 정적 구성이 없습니다.

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: 쉘 확장/globinb/사용하려는 모든 것을 사용하는 임의 크기 목록

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

관련 정보