tela cómo definir env.hosts complejos

tela cómo definir env.hosts complejos

Estoy trabajando en Fabric para mis herramientas de implementación y también distribuyo el comando en varios hosts. pero no sé cómo puedo definir hosts complejos en mi fabfile.py

por ejemplo: tengo 4 servidores. servidorA, servidorB, servidorC, servidorD

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

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

def all():
    prod()
    dev()

¿Puedo ejecutar un comando en todos los hosts sin definirlo nuevamente?

EX: fab all {command}

Respuesta1

Podrías echarle un vistazo a la definiciónrolespara su entorno.

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

Esto significaría que ahora tendrás que emitir tus llamadas de tejido de esta manera:

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

Respuesta2

Una solución alternativa para algo más dinámico... sin configuración estática en el archivo fabfile, usando bash.

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

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

Aquí hay una manera de hacer que haga un ensayo... ejecútelo antes de sus pruebas:

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

ejemplo 1: lista de tamaños arbitrarios usando expansiones de shell/globbinb/lo que quieras usar

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

ejecutará un 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

Ejemplo 2: Acabo de implementar 7 máquinas nuevas y una de cada dos está rota y quiero ejecutar un comando para verificarlo/arreglarlo.

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

ejecutará un comando como:

fab -H node100,node102,node104,node106 example_command

Ejemplo 3: más opciones, incluido --el uso de la propia tela:

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

información relacionada