run call () per un host esplicito: Tessuto
-
01-10-2019 - |
Domanda
Mi piacerebbe usare tessuto come uno strumento per raccogliere tutti i carichi dei server ed elaborare i valori dopo, ho pensato a qualcosa di simile:
from fabric.api import run
for servername in servernames:
load_str = run('cat /proc/loadavg | cut -d' ' -f1', host=servername)
, ma il tessuto non mi permette di specificare il nome host in questo modo, ho trovato questo modo IMO brutta:
from fabric.api import env, run
for servername in servernames:
env.host_string = servername
load_str = run('cat /proc/loadavg | cut -d' ' -f1')
ci sono modi più eleganti?
Utilizzando paramiko direttamente, come suggerito spinte qui me di scrivere un proprio modulo che astrae che - citando dal sito tessuti, che è esattamente ciò che il tessuto dovrebbe fare per me:
Oltre all'uso tramite il folle fab, componenti di tessuto può avvenire in altro codice Python, fornendo un'interfaccia Pythonic alla suite protocollo SSH ad un livello superiore a quello previsto per esempio Paramiko (che in tessuto per sé sfrutta.)
Soluzione
Questa domanda offre una soluzione:
Altri suggerimenti
Sembra che il tessuto è in realtà lo strumento sbagliato per questo.
L'affermazione sopra citato è probabilmente da una versione precedente.
Guardando il codice run()
è chiaro non c'è modulo in tessuto che potrebbe essere utilizzato per il mio scopo.
Ci sono piccoli livelli di astrazione intorno paramiko, per esempio questo
from fabric.api import settings
for servername in servernames:
with settings(host_string=servername):
load_str = run('cat /proc/loadavg | cut -d' ' -f1')
o meglio usando eseguire
from fabric.tasks import execute
data = execute(load_str , hosts = servernames)
def load_str():
return run('cat /proc/loadavg | cut -d' ' -f1')
mi piacerebbe consiglia di impostare per saltare gli host che non sono raggiungibili
env.skip_bad_hosts = True