Ответ 1
Перейдите к учебнику (конкретный раздел) и здесь больше информации в основных документах. Вы хотите предостеречь.
Я собираюсь установить плагин check_mk, написав простой файл, например:
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
уже установлен, Fabric будет остановлен с ошибками ниже:
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.
Есть ли какое-либо решение в этой ситуации?
Перейдите к учебнику (конкретный раздел) и здесь больше информации в основных документах. Вы хотите предостеречь.
поскольку stackoverflow не позволяет мне перенаправить ответ Morgan без дополнительной реплики, я расскажу более подробно из 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'
Это желательно, так как вы можете "поймать" то, что было бы ошибкой в одном разделе без его смертельного исхода, но оставить ошибки фатальными в другом месте.
Вам просто нужно добавить "env.warn_only = True" в def mk_agent(): task.
Как только список задач будет создан, Fabric начнет выполнять их, как указано в Стратегия исполнения, пока все задачи не будут запущены на полностью их списки хостов. Тем не менее, по умолчанию для Fabric действует шаблон поведения "неудачный" : если что-то пойдет не так, например, удаленная программа, возвращающая ненулевое возвращаемое значение, или ваш код Python с файлами, встречающийся с исключением, выполнение немедленно прекратится.
Это, как правило, желаемое поведение, но существует множество исключений из правила, поэтому Fabric предоставляет env.warn_only
, логическую настройку. По умолчанию он равен False
, что означает, что условие ошибки приведет к немедленному прерыванию программы. Однако если env.warn_only
установлено на True
во время сбоя - с помощью, скажем, settings контекстный менеджер - Fabric выдает предупреждающее сообщение, но продолжает выполнение.
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'