Fabric sudo call - 无法隐藏致命错误

时间:2014-12-21 15:00:34

标签: python fabric

在RHEL6.5上运行Fabric 1.10,Python 2.7。我们有一个云环境,我们提供操作系统层支持,没有中央LDAP,所以一切都通过脚本,操作系统级帐户和RSA密钥完成。您需要做的一件事是密切关注您的帐户,以确保您的密钥正常工作,同时您的每个系统上的密码都是正确的,这样您就可以sudo。我专门为此设计了一个小测试....

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.disable_known_hosts = True
env.skip_bad_hosts = True
env.remote_interupt = True
env.warn_only = True
env.eagerly_disconnect = True

我通过fab运行它,而不是python,即:fab sudotest

通常和我在一起,因为我错过了一些简单的事情。我可以忍受第一个正在运行的消息,它是致命的错误和额外的stderr输出,它将一个干净的输出变成了一个残骸。

那么缺少什么?感谢。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用quiet = True:

output = sudo(cmd, quiet=True):

答案 1 :(得分:0)

尝试:

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

我查看了结构中止功能,并检查了“output.aborts”

此处有更多信息output_controls