我正在尝试自动创建指向
的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上,我才发生致命故障。
答案 0 :(得分:0)
您正在使用with_dict
选项设置loop
。这会将每次迭代的item
变量的值设置为带有两个键的字典:
key
:dict
中当前键的名称。value
:dict
中现有键的值。然后,您将运行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
。
希望对您有帮助。