如何解决无法比较从 ansble_devices 事实返回的嵌套字典中键的值
团队,我正在尝试比较来自 ansible_devices 变量并停留在语法错误处的键值的字符串值。我只想在满足 WHEN
条件时打印 msg。基本上,我只想在分区为 NULL 或其中没有值时打印 msg。
我有以下示例输出,我可以检索它,但现在我想将它与某个字符串进行比较,但失败了 值.yml
null_partitions: "{}"
debug:
msg: "{{ ansible_hostname }} {{ item }} {{ ansible_devices[item]['partitions'] }}"
#when: "{{ ansible_devices[item]['partitions'] is defined }}"
when: "ansible_devices[item]['partitions'] == ansible_devices[item] {{ null_partitions }}"
with_items: "{{ ansible_devices }}"
输出错误:
fatal: [node1]: FAILED! => {"msg": "The conditional check 'ansible_devices[item]['partitions'] == ansible_devices[item] {{ null_partitions }}' failed. The error was: template error while templating string: expected token 'end of statement block',got '{'. String: {% if ansible_devices[item]['partitions'] == ansible_devices[item] {} %} True {% else %} False {% endif %}\n\nThe error appears to be in '/ansible-managed/jenkins-slave/slave0/workspace/run_ansible_playbook/k8s/baremetal/roles/local_volume_mount/tasks/main.yml': line 15,column 3,but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n# As per the warning in your output,'when' clauses should not be wrapped with curly braces. Also better to use 'inventory_hostname' in this case\n- name: Print device partitions that are defined\n ^ here\n"}
示例 ansible_Devices
如下
ok: [node1] => {
"ansible_devices": {
"loop0": {
"holders": [],"host": "","links": {
"ids": [],"labels": [],"masters": [],"uuids": []
},"model": null,"partitions": {},"removable": "0","rotational": "1","sas_address": null,"sas_device_handle": null,"scheduler_mode": "none","sectors": "0","sectorsize": "512","size": "0.00 Bytes","support_discard": "0","vendor": null,"virtual": 1
},
我评论的 when
的输出如下
ok: [node] => (item=loop3) => {
"msg": "node1 loop0 {}"
}
根据评论,我试过了
when: "ansible_devices[item]['partitions'] == null_partitions"
输出是
TASK [local_volume_mount : Print device partitions that are defined]
skipping: [node] => (item=loop0)
不确定我的模式 {}
是否在值中定义错误?或者如果任务实际上是在寻找 null_partitions
作为字符串?
解决方法
"partitions": {}
不是一个包含 "{}"
的字符串,而是一个空字典。
因此,编写 when
子句的正确且安全的方法是检查变量是否为 mapping
以及是否具有 0 长度(即没有声明的键)。
when:
- ansible_devices[item]['partitions'] is mapping
- ansible_devices[item]['partitions'] | length == 0
关于 mapping
测试,请参阅 https://jinja2docs.readthedocs.io/en/stable/templates.html#list-of-builtin-tests
在@jack 评论的部分帮助下,我能够弄清楚。
when: "ansible_devices[item]['partitions'] == {{ null_partitions }}"
变量替换需要花括号。
输出
ok: [node1] => (item=loop0) => {
14:36:45 "msg": "node1 loop0 {}"
14:36:45 }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。