16

I'm going to install check_mk plugin by writing a simple fabfile like this:

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)

But, as you can guess, if the xinetd package is already installed, Fabric will be stopped with below errors:

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.

Is there any solution in this situation?

4

4 に答える 4

19

stackoverflow では、担当者がいないと Morgan の回答に賛成票を投じることができないため、 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'

これは、あるセクションで致命的なエラーになることなく本質的に「キャッチ」できるため、致命的なエラーを別の場所に残すことができるため、望ましいことです。

于 2013-09-04T04:17:27.917 に答える
1

def mk_agent(): タスクに「env.warn_only = True」を追加するだけです。

于 2012-04-19T21:47:39.307 に答える