2015-07-29 8 views
5

W tkaninie mam zadanie zbierające coś na podstawie hosta (mały przykład).Jak mogę pobrać dane wyjściowe zadania fabric i wydrukować podsumowanie dla wielu hostów?

from fabric.api import task, run, hide 
env.hosts['h1', 'h2', 'h3'] 

@task 
def info(): 
    with hide('everything'): 
     info = run("who | tail -n 1") 
     print("On host {0} last user was {1}".format(env.host_string, info)) 

Run z

fab info 

da coś takiego

[h1] Executing task 'info' 
On host h1 last user was userXX pts/29  2015-07-29 15:57 (:0) 
[h2] Executing task 'info' 
On host h2 last user was userXX pts/29  2015-07-29 16:57 (:0) 
[h3] Executing task 'info' 
On host h3 last user was userXX pts/29  2015-07-29 17:57 (:0) 

Chociaż jest to dobre dla 3 lub 5 zastępów, to staje się bardzo trudne do wyświetlenia przez 20 lub więcej hostów (lub bardziej skomplikowane wyniki). Co chcę zrobić, to zgromadzić wszystkie dane wyjściowe dla każdego hosta i użyć go do utworzenia podsumowania/przeglądu na końcu, po wykonaniu zadania na każdym hoście.

Jak to zrobić?

Odpowiedz

5

... pisząc to pytanie, a po co najmniej godzinę googleing różne frazy, w końcu znalazłem to:

http://docs.fabfile.org/en/latest/usage/execution.html#leveraging-execute-to-access-multi-host-results

Chociaż skanowane za pośrednictwem tej strony kilka razy brakowało mi Istotna część, a więc pomyślałem, aby opublikować go tutaj z nadzieją jej łatwiej znaleźć, jeśli ktoś nie szukać dokładnej frazy w google:

from fabric.api import task, execute, run, runs_once 

@task 
def workhorse(): 
    return run("get my infos") 

@task 
@runs_once 
def go(): 
    results = execute(workhorse) 
    print results 

więc przykład od kwestii można rozwiązać:

from fabric.api import task, run, hide, execute, runs_once 
env.hosts['h1', 'h2', 'h3'] 

@task 
def collect_info(): 
    with hide('everything'): 
     info = run("who | tail -n 1") 
     return info 

@task 
@runs_once 
def info(): 
    collected_output = execute(collect_info) 
    for host, info in collected_output.iteritems(): 
     print("On host {0} last user was {1}".format(host, info)) 
Powiązane problemy