如何使Fabric在获得退出状态后继续运行下一个命令:1?

时间:2012-04-18 10:34:26

标签: python fabric exitstatus

我将通过编写一个简单的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.

在这种情况下有解决方案吗?

4 个答案:

答案 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 Failure handling

构建任务列表后,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'