2012-04-18 7 views
14

Zamierzam zainstalować wtyczkę check_mk pisząc prosty fabfile takiego:Jak sprawić, aby Fabric kontynuował uruchamianie następnego polecenia po uzyskaniu statusu wyjścia: 1?

from fabric.api import env, run, roles, execute, parallel 

env.roledefs = { 
    'monitoring': ['192.168.3.118'], 
    'mk-agent': ['192.168.3.230', '192.168.3.231', '192.168.3.232'] 
} 

@roles('monitoring') 
def mk(): 
    run('[ -f check_mk-1.1.12p7.tar.gz ] || wget http://mathias-kettner.de/download/check_mk-1.1.12p7.tar.gz') 
    run('[ -d check_mk-1.1.12p7 ] || tar zxvf check_mk-1.1.12p7.tar.gz') 
    run('cd check_mk-1.1.12p7 && sudo ./setup.sh') 

@parallel  
@roles('mk-agent') 
def mk_agent(): 
    run('[ `rpm -qa | grep -c xinetd` -eq 0 ] && sudo yum -y install xinetd.x86_64') 
    run('sudo rpm -ivh http://mathias-kettner.de/download/check_mk-agent-1.2.0b2-1.noarch.rpm') 

def check_mk(): 
    execute(mk) 
    execute(mk_agent) 

Ale, jak można się domyślić, jeśli pakiet xinetd jest już zainstalowany, Fabric zostanie zatrzymany z poniższych błędów:

Fatal error: run() received nonzero return code 1 while executing! 

Requested: [ `rpm -qa | grep -c xinetd` -eq 0 ] && sudo yum -y install xinetd.x86_64 
Executed: /bin/bash -l -c "[ \`rpm -qa | grep -c xinetd\` -eq 0 ] && sudo yum -y install xinetd.x86_64" 

Aborting. 

Czy istnieje rozwiązanie w tej sytuacji?

Odpowiedz

18

Przejdź do samouczka (specific section), a here to więcej informacji w dokumentacji głównej. Chcesz ostrzec.

+3

Udzielanie linków to zła praktyka –

1

Po prostu musisz dodać "env.warn_only = True" do def mk_agent(): task.

14

od stackoverflow nie pozwala mi upvote odpowiedź Morgan bez rep więcej, będę przyczynić się więcej szczegółów z http://docs.fabfile.org/en/1.4.1/api/core/context_managers.html#fabric.context_managers.settings

poza „z ustawieniami” w poniższym kodzie zachowanie wróci do normy:

def my_task(): 
    with settings(
     hide('warnings', 'running', 'stdout', 'stderr'), 
     warn_only=True 
    ): 
     if run('ls /etc/lsb-release'): 
      return 'Ubuntu' 
     elif run('ls /etc/redhat-release'): 
      return 'RedHat' 

Jest to pożądane, ponieważ zasadniczo można "złapać" błąd, który byłby błędem w jednej sekcji, ale nie jest to zgubne, ale pozostawia błędy krytyczne w innym miejscu.

0

Fabric Failure handling

Gdy lista zadanie zostało wykonane, tkanina zacznie ich wykonanie zgodnie z opisem w Execution strategy, dopóki wszystkie zadania zostały uruchomić na całokształt ich listach gospodarza. Jednak tkanina domyślnie przyjmuje następujący wzór: "fail-fast": , jeśli coś pójdzie nie tak, jak na przykład program zdalny zwracający wartość różną od zera lub kod Pythona z fabfile napotyka wyjątek, wykonanie zostanie natychmiast zatrzymane.

Zazwyczaj jest to pożądane zachowanie, ale istnieje wiele wyjątków od reguły, więc tkanina zapewnia env.warn_only, ustawienie logiczne. Domyślnie jest to False, co oznacza, że ​​błąd spowoduje natychmiastowe przerwanie programu. Jeśli jednak env.warn_only jest ustawione na True w momencie awarii - z, powiedzmy, menedżerem kontekstu settings - Fabric wyśle ​​komunikat ostrzegawczy, ale kontynuuje wykonywanie.

Powiązane problemy