2012-04-18 8 views
14

Я собираюсь установить плагин check_mk написав простой fabfile вроде этого:Как заставить Fabric продолжить выполнение следующей команды после получения статуса выхода: 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) 

Но, как вы можете догадаться, если пакет xinetd уже установлен, ткань будет остановлен ниже ошибок:

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. 

Есть ли какие-либо решения в этой ситуации?

ответ

18

Перейдите к руководству (specific section) и here - это дополнительная информация в основных документах. Вы хотите предупредить.

+3

Ответ на ссылки - плохая практика –

1

Вам просто нужно добавить «env.warn_only = True» в def mk_agent(): task.

14

так StackOverflow не дает мне upvote ответ Моргана без дополнительной повторении, я буду способствовать более подробно с http://docs.fabfile.org/en/1.4.1/api/core/context_managers.html#fabric.context_managers.settings

Вне «с параметрами» в коде ниже, поведение будет вернуться к нормальной жизни:

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' 

Это желательно, поскольку вы можете «поймать» то, что было бы ошибкой в ​​одном разделе, без его смертельного исхода, но оставить ошибки фатальными в другом месте.

0

Fabric Failure handling

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

Обычно это желаемое поведение, но существует множество исключений из правила, поэтому Fabric предоставляет env.warn_only, булево значение. По умолчанию он равен False, что означает, что условие ошибки приведет к немедленному прерыванию программы. Однако, если env.warn_only установлен на True во время сбоя - с, скажем, менеджером контекста settings - Ткань выдает предупреждающее сообщение, но продолжает выполнение.

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' 
Смежные вопросы