在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输出,它将一个干净的输出变成了一个残骸。
那么缺少什么?感谢。
答案 0 :(得分:1)
您可以尝试使用quiet = True:
output = sudo(cmd, quiet=True):
答案 1 :(得分:0)
尝试:
import fabric.api as fab
fab.output['aborts'] = False
我查看了结构中止功能,并检查了“output.aborts”
此处有更多信息output_controls