如何使用Ansible循环检查磁盘/设备存在性并生成硬件报告
解决方案
1. 修复磁盘存在性检查的任务
你原代码中ansible_devices.item的写法有误,因为ansible_devices是字典类型,需通过键名(即循环变量item)访问对应磁盘的信息。以下是修正后的检查任务:
- name: 检查磁盘是否存在并显示信息 loop: "{{ disks }}" when: item in ansible_devices ansible.builtin.debug: msg: "磁盘 {{ item }} 存在,大小为 {{ ansible_devices[item]['size'] }}"
2. 生成硬件报告的模板优化
要适配不同机器的磁盘数量,可在模板中动态遍历所有存在的磁盘,或先筛选出目标磁盘中实际存在的部分再生成报告。
方式一:指定目标磁盘(包含sda)
先在Playbook中定义要检查的磁盘列表:
vars: target_disks: - sda - sdb - sdc
然后编写模板templates/hwinfo.txt.j2:
=== 主机硬件磁盘报告 === 主机名:{{ ansible_hostname }} 生成时间:{{ ansible_date_time.iso8601 }} --- 已检测磁盘信息 --- {% for disk in target_disks %} {% if disk in ansible_devices %} ### 磁盘 {{ disk }} - 大小:{{ ansible_devices[disk]['size'] }} - 型号:{{ ansible_devices[disk]['model'] | default('未知') }} - 序列号:{{ ansible_devices[disk]['serial'] | default('未提供') }} {% else %} ### 磁盘 {{ disk }}:未检测到 {% endif %} {% endfor %}
方式二:遍历所有已识别磁盘
如果不需要限定磁盘名称,直接遍历ansible_devices的所有键,覆盖所有系统识别到的磁盘:
=== 主机硬件磁盘报告 === 主机名:{{ ansible_hostname }} 生成时间:{{ ansible_date_time.iso8601 }} --- 所有磁盘信息 --- {% for disk_name, disk_info in ansible_devices.items() %} ### 磁盘 {{ disk_name }} - 大小:{{ disk_info['size'] }} - 型号:{{ disk_info['model'] | default('未知') }} - 总线类型:{{ disk_info['bus'] | default('未知') }} {% endfor %}
3. 关于循环变量插入ansible_facts的问题
不需要将循环变量item插入ansible_facts。ansible_facts是Ansible收集的主机固有信息,无需修改。你只需通过item作为键,直接访问ansible_devices字典中的对应磁盘信息即可(如ansible_devices[item])。
如果需要将筛选后的磁盘列表作为可复用变量,可通过set_fact生成自定义变量:
- name: 生成已存在磁盘的自定义列表 ansible.builtin.set_fact: existing_disks: "{{ existing_disks | default([]) + [item] }}" loop: "{{ target_disks }}" when: item in ansible_devices
后续可在模板或其他任务中直接使用existing_disks变量遍历有效磁盘。
完整Playbook示例
- name: 生成硬件磁盘报告 hosts: all gather_facts: yes # 必须开启以收集ansible_devices信息 vars: target_disks: - sda - sdb - sdc report_path: /tmp/hwinfo.txt tasks: - name: 收集已存在的磁盘列表 ansible.builtin.set_fact: existing_disks: "{{ existing_disks | default([]) + [item] }}" loop: "{{ target_disks }}" when: item in ansible_devices - name: 部署硬件报告模板 ansible.builtin.template: src: templates/hwinfo.txt.j2 dest: "{{ report_path }}" owner: ansible group: ansible mode: '0644' - name: 输出已检测磁盘信息 loop: "{{ existing_disks }}" ansible.builtin.debug: msg: "磁盘 {{ item }}:{{ ansible_devices[item]['size'] }}"
内容的提问来源于stack exchange,提问作者THawk
相关产品推荐
相关产品推荐

