我将通过编写一个简单的fabfile来安装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.
在这种情况下有解决方案吗?
答案 0 :(得分:18)
因为stackoverflow不允许我在没有更多代表的情况下支持摩根的回答,我将从http://docs.fabfile.org/en/1.4.1/api/core/context_managers.html#fabric.context_managers.settings提供更多详细信息
在以下代码中的'with 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'
这是可取的,因为你可以基本上“捕获”一个部分中的错误而不会致命,但在其他地方留下致命的错误。
答案 1 :(得分:1)
您只需要在def mk_agent():task中添加“env.warn_only = True”。
答案 2 :(得分:1)
也许在2020年会很有用。
在Fabric 2.5中,您只需要在命令中添加warn=True
即可避免中断。
例如:connection.run('test -f /path/to/file && tail /path/to/file, warn=True)
答案 3 :(得分:0)
构建任务列表后,Fabric将按Execution strategy中所述开始执行它们,直到所有任务都在其整个主机列表上运行。但是,Fabric默认为“fail-fast”行为模式:如果出现任何问题,例如远程程序返回非零返回值或fabfile的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'