web-dev-qa-db-ja.com

終了ステータスを取得した後、Fabricに次のコマンドの実行を継続させる方法:1?

次のような単純な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.

この状況で解決策はありますか?

14
quanta

stackoverflowでは、担当者を増やさずにMorganの回答に賛成することはできないため、詳細については http://docs.fabfile.org/en/1.4.1/api/core/context_managers.html#fabric)から提供します。 .context_managers.settings

以下のコードの「withsettings」の外では、動作は通常に戻ります。

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つのセクションでエラーとなるものを本質的に「キャッチ」できるが、他の場所ではエラーを致命的なままにすることができるため、望ましいことです。

18
pacifist

チュートリアル( 特定のセクション )に目を通し、 ここ はメインドキュメントの詳細です。 warn_onlyしたい。

17
Morgan

Def mk_agent():taskに「env.warn_only = True」を追加するだけです。

1
Brian Carpio

ファブリック障害処理

タスクリストが作成されると、Fabricは、すべてのタスクがホストリスト全体で実行されるまで、 実行戦略 で概説されているようにそれらの実行を開始します。ただし、Fabricはデフォルトで「fail-fast」動作パターンになります:リモートプログラムが戻るなどの問題が発生した場合ゼロ以外の戻り値またはfabfileのPythonコードで例外が発生すると、実行はすぐに停止します。

これは通常、望ましい動作ですが、ルールには多くの例外があるため、Fabricはブール設定であるenv.warn_onlyを提供します。デフォルトはFalseです。これは、エラー状態が発生すると、プログラムがすぐに中止されることを意味します。ただし、失敗時にenv.warn_onlyTrueに設定されている場合、たとえば 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'
0
luoluo