在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输出,可以将干净的输出变成残骸。
那么缺少什么?谢谢。