我将通过编写这样一个简单的fab文件来安装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中贡献更多细节
在下面代码中的“带设置”之外,行为将恢复正常:
这是可取的,因为你基本上可以“捕捉”一个部分中本来是错误的内容,而不是致命的错误,但在其他地方留下致命的错误。
只需将“env.warn_only=True”添加到def mk_agent():任务。
Fabric Failure handling
构建任务列表后,Fabric将按照Execution strategy中的说明开始执行它们,直到所有任务都在它们的整个主机列表上运行。但是,Fabric默认为“fail fast”行为模式:如果出现任何错误,例如远程程序返回非零返回值或fabfile的Python代码遇到异常,则执行将立即停止。
这通常是所需的行为,但是规则有许多异常,因此Fabric提供了一个布尔设置
env.warn_only
。它默认为False
,这意味着错误条件将导致程序立即中止。但是,如果在失败时将env.warn_only
设置为True
,那么settings上下文管理器结构将发出警告消息,但仍将继续执行。相关问题 更多 >
编程相关推荐