次のような単純な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.
この状況で解決策はありますか?
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つのセクションでエラーとなるものを本質的に「キャッチ」できるが、他の場所ではエラーを致命的なままにすることができるため、望ましいことです。
Def mk_agent():taskに「env.warn_only = True」を追加するだけです。
タスクリストが作成されると、Fabricは、すべてのタスクがホストリスト全体で実行されるまで、 実行戦略 で概説されているようにそれらの実行を開始します。ただし、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'