如何通过Jinja2循环从Ansible facts中提取mount和size_total参数
问题解答
1. 数据类型说明
你拿到的hostvars[host]['ansible_facts']['mounts']返回值是字典列表,列表中的每一个元素都是对应单个挂载点属性的字典,你需要的mount(挂载路径)和size_total(总空间大小)都是字典的一级键,可直接访问。
2. 基础提取方法
如果需要遍历所有主机的所有挂载点提取对应参数,可直接用双层嵌套循环实现,示例模板如下:
{% for host in groups['test'] %} ### 主机 {{ host }} 挂载信息: {% for mount_item in hostvars[host]['ansible_facts']['mounts'] %} - 挂载路径:{{ mount_item.mount }},总空间:{{ mount_item.size_total | human_readable }} {% endfor %} {% endfor %}
3. 输出重复问题说明
你遇到的输出重复2次的原因是groups['test']分组下配置了2台主机,外层循环每遍历一台主机就会输出一次所有挂载点信息,最终就会出现2组重复的挂载数据。
如果你的需求是只保留唯一的挂载点信息(确认所有主机挂载配置一致的场景下),你自己提供的嵌套循环加列表去重的方案已经可以实现需求,另外如果需要区分不同主机的挂载数据,在输出时加上主机名标识即可避免重复混淆。
4. 优化方案参考
如果需要适配挂载点数量不固定的场景,避免固定写死slots[0]、slots[1]的硬编码问题,可以改用如下写法直接遍历去重后的列表:
{% set unique_mounts = [] %} {% for host in groups['test'] %} {% for mount_item in hostvars[host]['ansible_facts']['mounts'] %} {% if mount_item.mount not in unique_mounts | map(attribute='mount') %} {{ unique_mounts.append(mount_item) }} {% endif %} {% endfor %} {% endfor %} {% for item in unique_mounts %} Filesystem: {{ item.mount }} Size: {{ item.size_total | human_readable }} / {{ (item.size_total - item.size_available) | human_readable }} {% endfor %}
内容的提问来源于stack exchange,提问作者Irka Irenka
相关产品推荐
相关产品推荐

