2015-12-30 4 views
0

Я хотел бы запустить мои существующие задачи fabfile без cli непосредственно из Python. Как я могу уловить «выполнение» исключений и захватить вывод для ведения журнала, если происходят какие-либо исключения?Как запускать задачи для Fabric непосредственно из Python, занимаясь исключениями и выводами?

@roles(['localhost']) 
def my_sudo_task(): 
    sudo('ls -l /root/') 

from fabfile import my_sudo_task 
from fabric.tasks import execute 

execute(my_sudo_task) 

вот моя точная проблема:

try: 
    # is there a way to leave out stderr and capture it somehow? 
    with settings(hide('stdout', 'stderr', 'aborts', 'warnings', 'running')): 
     execute(my_sudo_task) 
except Exception as e: # doesnt catch error 
    print ('ERROR') 
    raise 
except: 
    print ('ERROR') # catches but lacks the error message that i can log 

ответ

1

Вы должны обрабатывать ошибки, исследуя результирующие коды внутри задачи. Исключения не будут достаточно описательными.

from fabric.api import * 

@roles(['localhost']) 
def my_sudo_task(): 
    with settings(warn_only=True): 
     result = sudo('ls -l /root/') 

    if result.return_code == 0: 
     [do something...] 
    elif result.return_code == 1: 
     [do something...] 
    else: 
     [do something else...] 



from fabfile import my_sudo_task 
from fabric.tasks import execute 

execute(my_sudo_task) 

См. Раздел учебника по failure handling.

+0

все, что мне нужно, для выполнения (задачи), чтобы вызвать любое исключение, когда sudo ('not a valid cmd') терпит неудачу. способ fab существует с 1. Конечно, есть лучший способ, чем переписывать каждую задачу, чтобы «поднять». – jayshilling

+0

Из документов: «Тем не менее, Fabric по умолчанию использует« неуправляемый »шаблон поведения: если что-то пойдет не так, например, удаленная программа, возвращающая ненулевое возвращаемое значение, или код Python файла fabfile, столкнувшись с исключением, выполнение немедленно прекратится». – jumbopap

+0

Я уточнил вопрос: «за исключением« Исключение как е »ничего не ловит, просто« кроме »работает, но бесполезно, поскольку он не предоставляет сообщение об ошибке для журнала – jayshilling

0

Следующая решить мой вопрос

try: 
    with settings(hide('stdout', 'stderr', 'aborts', 'warnings', 'running')): 
     execute(my_sudo_task) 
except SystemExit as e: 
    print (e.message) 

, потому что 'казнить' технически не сгенерирует исключение

issubclass(SystemExit, Exception) = False 
0

Исключения NetworkError и CommandTimeout определены в модуле fabric.exceptions. Вызов execute() возвращает словарь того, что возвращается выполняемой им задачей с именами хостов в качестве ключей. Если встречается исключение, оно также будет храниться в словаре. Вы можете проверить атрибут «сообщение» исключения для строкового описания проблемы. См. Следующий пример:

>>> from fabric.api import run, execute 
>>> from fabric.context_managers import quiet 
>>> from fabric.state import env 
>>> env.skip_bad_hosts = True 
>>> env.warn_only = True 
>>> def task_a(): 
... return run('pwd') 
... 
>>> with quiet(): 
... a = execute(task_a,hosts=['badhost']) 
... 
>>> a 
{'badhost': NetworkError(Name lookup failed for badhost) => gaierror(8, 'nodename nor servname provided, or not known')} 
>>> type(a['badhost']) 
<class 'fabric.exceptions.NetworkError'> 
>>> a['badhost'].message 
'Name lookup failed for badhost'