2014-12-21 36 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