我使用Ansible在远程服务器上运行作业。 stdout生成一些输出,有时会出现错误。错误文本采用
的形式 #ERROR FMM0129E The following error was returned by the vSphere(TM) API: 'Cannot complete login due to an incorrect user name or password.'.
问题在于可以安全地忽略其中一些错误,只有那些不在我的误报列表中的错误才会导致失败。
我的问题是,这可以用纯粹的Ansible方式完成吗?
唯一想到的是简单的失败_检查,在这种情况下,检查不足。我认为这些“复杂”的输出检查应该用Ansible完成,调用python / shell /等脚本来帮助。
答案 0 :(得分:2)
您可以使用failed_when
代替ignore_errors: true
,这将使您进入传递失败任务并将stdout转发到另一个任务的位置。但我不建议这样做,因为在我看来,任务永远不应该通过打算报告失败的状态。但如果您认为这是一个选项,那么甚至可以重置错误计数器,以便最后的Ansible统计数据正确。
- some: task
register: some_result
ignore_errors: true
- name: Reset errors after intentional fail
meta: clear_host_errors
when: some_result | failed
- another: task
check: "{{ some_result.stdout }}
when: some_result | failed
然后最后一个任务会在自定义脚本或任何你自己的脚本中检查你的stdout,并且应该报告一个失败的状态(返回代码!= 0)。
据我所知,clear_host_errors
功能尚未记录且commit大约有一个月的时间,所以我猜它只能在Ansible 2.0.1中使用。
另一个想法是将您的任务包装在脚本中,该脚本检查输出或将其传递给该脚本。这显然只有在运行shell命令而不是任何其他ansible模块时才有效。
除了这两个选项之外,我认为还没有其他选择。
答案 1 :(得分:1)
如果您正在远程执行shell命令,那么没有理由不能将它包装在shell脚本中,该脚本为您关注的事物返回非0状态代码,然后通过{{3模块。
#!/bin/bash
randomInt=$[ 1 + $[ RANDOM % 10 ]]
echo $randomInt
if [ $randomInt == 1 ]; then
exit 1
else
exit 0
fi
然后在你的剧本中使用它:
- name: run example.sh
script: example.sh
当任务失败时,Ansible会自动看到任何非0返回代码。