2014-12-21 37 views
0

在RHEL6.5上運行Fabric 1.10,Python 2.7。我們有一個雲環境,我們提供操作系統層支持,並且沒有中央LDAP,因此所有事情都通過腳本,操作系統級帳戶和RSA密鑰完成。您需要做的一件事就是密切關注您的帳戶,以確保您的密鑰正常工作,同時還要確保您的每個系統上的密碼正確無誤,以便您可以sudo。我設計了一個小的測試專門爲此....Fabric sudo call - 無法隱藏致命錯誤

def sudotest(cmd="echo TEST"): 
    with hide('status','warnings','stderr', 'stdout','running','everything','status'), settings(warn_only=True): 
      env.abort_on_prompts = True 
      try: 
       result=sudo(cmd) 
       if (result.succeeded): 
        print(env.host + ":SUCCESS") 
       else: 
        print(env.host + ":FAIL") 
      except SystemExit: 
       print(env.host + ":FAIL") 
      except: 
       print(env.host + ":FAIL - catchall") 

你會發現我一直在嘗試各種設置甚至增加了一倍,因爲我已經看到了隱藏輸出古怪的行爲。例如,如果沒有雙重'狀態',我仍然看到「斷開連接」信息。所以我已經嘗試過把所有的東西和所有的stderr都扔出去,而不會改變輸出。我添加了包容性的除外:只是爲了看看它是否有幫助,沒有改變。也沒有試圖改變當別人:

在一個良好的運行我看到這樣的輸出:

[host1] Executing task 'sudotest' 
host1 :SUCCESS 
host2 :SUCCESS 

所以先觀察是,我仍然收到這個第一個運行的消息。否則,這正是我想要的。

在同一主機列表的故意失敗的運行我得到:

[host1] Executing task 'sudotest' 
[host1] out: Sorry, try again. 
[host1] out: sudo password: 
Fatal error: Needed to prompt for a connection or sudo password (host: host1), but abort-on-prompts was set to True 

Aborting. 
host1 :FAIL 
[host2] out: Sorry, try again. 
[host2] out: sudo password: 
Fatal error: Needed to prompt for a connection or sudo password (host: host2), but abort-on-prompts was set to True 

Aborting. 
host2 :FAIL 

我已經得到了以下ENV設置:

env.disable_known_hosts = True 
env.skip_bad_hosts = True 
env.remote_interupt = True 
env.warn_only = True 
env.eagerly_disconnect = True 

我通過晶圓廠,而不是Python運行它,即:fab sudotest

通常與我這是因爲我錯過了一些簡單的東西。我可以忍受第一個正在運行的信息,這是致命的錯誤和額外的stderr輸出,可以將乾淨的輸出變成殘骸。

那麼缺少什麼?謝謝。

回答

0

你可以安靜=真正的嘗試:

output = sudo(cmd, quiet=True):

0

嘗試:

import fabric.api as fab 
fab.output['aborts'] = False 

我看着面料中止功能,並沒有對 「output.aborts」

檢查

更多的信息在這裏output_controls