2012-04-18 88 views
14

我打算寫一個簡單的fabfile這樣安裝check_mk插件:如何使Fabric在獲取退出狀態後繼續運行下一個命令:1?

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包布將與下面的錯誤停止:

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. 

這種情況有什麼解決辦法嗎?

回答

18

查看教程(specific section)和here是主文檔中的更多信息。你只想警告。

+3

回答鏈接是不好的做法 – 2017-02-17 04:25:18

1

您只需將「env.warn_only = True」添加到def mk_agent():任務。

14

,因爲計算器不會讓我給予好評摩根的回答沒有更多的代表,我會從http://docs.fabfile.org/en/1.4.1/api/core/context_managers.html#fabric.context_managers.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' 

這是可取的,因爲你基本上可以'捕捉'一個部分的錯誤,而不會造成致命錯誤,但是在其他地方留下錯誤是致命的。

0

Fabric Failure handling

一旦任務列表中已建成,面料爲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' 
相關問題