我试图不仅使用ansible作为配置工具,而且能够轻松地在一系列服务器上执行批量验证检查。
因此,我在剧本的开头抓取了一堆不同的信息,然后对它们进行检查。
看到这些是验证检查而不是配置,我想要立即完成所有失败,而不是获得一个,剧本失败,不得不解决它然后再次运行它,一遍又一遍地找到我的多次失败。
我可以通过在其中添加ignore_errors标志来继续运行playbook,但它不会增加"失败"在剧本结束时计算,我宁愿没有用户必须向上滚动所有输出以查找红色文本,或者刮取日志以查看是否有错误,特别是看到有一个计数器权利最后,作为一个完美的一目了然参考。
我在Ubuntu版本14.04上使用版本Ansible 2.4.2.0
这是我的剧本:
- name: Validates Preship configuration
hosts:
- active
- dr
become_user: root
become: true
become_method: su
roles:
- preShipValidation
ignore_errors: yes
然后在将任务导入main.yml文件并运行单独的任务来填充我的host_vars之后,我运行以下任务:
- name: BIOS Version Check for Equus or Seneca 2000/2100
assert:
that:
- '"2.0a" in dmidecode_bios_ver.stdout'
when: '"2000" in appliance_model and
"X10DRW" in motherboard_model'
当跑步时会给我以下输出(为便于阅读而编辑)
TASK [preShipValidation : BIOS Version Check for Equus or Seneca 2000/2100] ******************************************************************************************************************
skipping: [server1] => {"changed": false, "skip_reason": "Conditional result was False"}
skipping: [server2] => {"changed": false, "skip_reason": "Conditional result was False"}
fatal: [server3]: FAILED! => {
"assertion": "\"2.0a\" in dmidecode_bios_ver.stdout",
"changed": false,
"evaluated_to": false
}
...ignoring
ok: [server4] => {
"changed": false,
"msg": "All assertions passed"
}
PLAY RECAP ***********************************************************************************************************************************************************************************
server1 : ok=11 changed=4 unreachable=0 failed=0
server2 : ok=12 changed=4 unreachable=0 failed=0
server3 : ok=10 changed=4 unreachable=0 failed=0
server4 : ok=11 changed=4 unreachable=0 failed=0
关于如何获得失败计数的任何想法都会显示它忽略的错误?
答案 0 :(得分:0)
在您忽略的每个任务中,使用寄存器标记将输出保存到变量,并创建一个额外的任务,如果已注册的变量失败选项为True,则将变量递增1。
例如:
- name: Yum update
yum:
name: "*"
state: latest
register: result
ignore_errors: True
- name: Increment variable
set_fact: failed_count={{ failed_count | int + 1 }}
when: result.failed
请注意,在playbook开头,fail_count变量应该初始化为0.
答案 1 :(得分:0)
因此,官方的答案似乎是“ install 2.8”(公平地讲,直到我问了问题几个月后才将其写入代码)。一位开发人员承认这是一个错误:
https://github.com/ansible/ansible/issues/27160
并检查2.8的发行说明,肯定在那里有一个提交。我拉出了相关的代码片段,并将它们放在适当的位置进行测试,这似乎可以解决问题。
https://github.com/ansible/ansible/blob/stable-2.8/changelogs/CHANGELOG-v2.8.rst#id6 https://github.com/ansible/ansible/pull/48418
因此,感谢Konstantin给出的技巧,我开始朝这个方向看,但是由于我对python知识的局限性以及所有代码的工作方式,我在收集回调方面遇到了很多困难(但是学到了一些好东西!)
感谢Pavan的建议,但是有了这本剧本,已经有成百上千的任务,因此每次我由于失败而要跳过任务时,都很难放入其中的一个。真正的目标是将其包含在播放摘要中,而不仅仅是另一个任务,以使输出全部在一起。