Ansible任务:with_dict语句被触发,即使子句应避免这种情况

时间:2019-08-05 18:12:09

标签: ansible munin

我正在尝试自动创建指向

的smart_ [diskdevice]链接
  

/ usr / share / munin / plugins / smart _

在通过ansible安装munin节点期间。

这里的代码部分起作用,除了目标机器上没有要链接的磁盘设备。然后

导致了致命的失败
  

{"msg": "with_dict expects a dict"}

我已经审查了Ansible文档,并尝试在网上搜索问题。据我了解,如果“ when”语句失败,则不应执行整个“ file”指令。

---
- name: Install Munin Node
  any_errors_fatal: true
  block:
...

# drives config
    - file:
        src: /usr/share/munin/plugins/smart_
        dest: /etc/munin/plugins/smart_{{ item.key }}
        state: link
      with_dict: "{{ ansible_devices }}"
      when: "item.value.host.startswith('SATA')"
      notify:
        - restart munin-node

在具有SATA驱动器的目标上,该代码有效。找到“ sda”之类的驱动器并创建链接。环路和其他软设备将被忽略(按预期方式) 只有在完全没有SATA驱动器的Raspberry上,我才发生致命故障。

1 个答案:

答案 0 :(得分:0)

您正在使用with_dict选项设置loop。这会将每次迭代的item变量的值设置为带有两个键的字典:

  1. keydict中当前键的名称。
  2. valuedict中现有键的值。

然后,您将运行when选项,该选项将在每次迭代时检查item变量。因此,请检查这是否是您想要的行为。

关于您的错误,由于某些原因,ansible_devices不是错误所说的dict,因此引发了该错误。然后Ansible在解决with_dict条件之前检查when类型的有效性。

检查以下示例:

---
- name: Diff test
  hosts: local
  connection: local
  gather_facts: no
  vars:
    dict:
      value: True
      name: "dict"
  tasks:
    - debug: var=item
      when: dict.value == False
      with_dict: '{{ dict }}'

    - debug: var=item
      when: dict.value == True
      with_dict: '{{ dict }}'

    - debug: var=item
      when: dict.value == False
      with_dict: "Not a dict"

前两个task将成功,因为它们在dict选项上具有有效的with_dict并且在when选项上具有正确的条件。最后一个失败,因为with_dict的值类型错误,即使when条件正确解析,也应保证跳过task

希望对您有帮助。