You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 23:48:26