
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