Ansible:使用ignore_errors

时间:2018-04-12 20:34:09

标签: ansible

我试图不仅使用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

关于如何获得失败计数的任何想法都会显示它忽略的错误?

2 个答案:

答案 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的建议,但是有了这本剧本,已经有成百上千的任务,因此每次我由于失败而要跳过任务时,都很难放入其中的一个。真正的目标是将其包含在播放摘要中,而不仅仅是另一个任务,以使输出全部在一起。