
저는 배포 도구를 위해 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