fabric como definir env.hosts complexos

2

Estou trabalhando no Fabric para minhas ferramentas de implantação e também distribuo o comando em vários hosts. mas não sei como definir um host complexo no meu fabfile.py

por exemplo: eu tenho 4 servidores. serverA, serverB, serverC, serverD

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

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

def all():
    prod()
    dev()

é possível executar um comando em todos os hosts sem definir novamente?

EX: fab all {command}
    
por Calvin Pham 14.01.2014 / 11:26

3 respostas

1

Você pode dar uma olhada na definição de papéis para o seu ambiente.

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')

Isso significa que agora você terá que emitir suas chamadas de malha assim:

fab -R prod hostname
fab -R dev hostname
fab -R all hostname
fab -R dev,envC hostname
    
por 14.01.2014 / 13:09
0

Obrigado user76776 muito pela sua ajuda.

Na verdade, minha configuração para host é um pouco mais complicada.

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 e dbA são os servidores da Tailândia (sistema para a Tailândia) webB e dbB são os servidores do Vietnã (sistema para o Vietnã)

caso 1: execute um comando em todos os servidores (funciona como sua recomendação)

case 2: como posso executar um comando em todos os servidores WEB (inclui 2 países - webA e webB)? caso 3: como posso executar um comando apenas nos servidores da Tailândia (incluiu webA e dbA)?

desculpe se minha pergunta for ruim, já que sou novo com tecido.

Muito obrigado pela sua ajuda.

    
por 19.01.2014 / 05:17
0

Uma solução alternativa para algo mais dinâmico ... nenhuma configuração estática no fabfile, usando o bash.

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

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

Aqui está uma maneira de fazer uma corrida seca ... execute isso antes dos testes:

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

exemplo 1: lista de tamanho arbitrário usando expansões de shell / globbinb / o que você quiser usar

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

executará um comando como:

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

exemplo 2: acabei de implantar 7 novas máquinas e cada segunda está quebrada e quero executar um comando para verificar / corrigir isso.

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

executará um comando como:

fab -H node100,node102,node104,node106 example_command

exemplo 3: mais opções incluindo -- usado pelo próprio tecido:

mfab node{01..10} -- -P -- uname -a
    
por 23.05.2017 / 15:54

Tags