如何使用Ansible收集有关磁盘的信息

如何使用Ansible收集有关磁盘的信息,ansible,ansible-facts,Ansible,Ansible Facts,我正在尝试写一本Ansible playbook,它将识别RHEL机器上新添加的磁盘。计划是在创建新磁盘之前,运行playbook并在该时间点缓存磁盘。创建新磁盘后,将再次运行相同的playbook,并计算创建磁盘前后磁盘的差异 例如,lsblk最初返回以下内容: NAME SIZE TYPE sda 100G disk ├─sda1 1G part └─sda2 99G part

我正在尝试写一本Ansible playbook,它将识别RHEL机器上新添加的磁盘。计划是在创建新磁盘之前,运行playbook并在该时间点缓存磁盘。创建新磁盘后,将再次运行相同的playbook,并计算创建磁盘前后磁盘的差异

例如,lsblk最初返回以下内容:

NAME              SIZE  TYPE
sda               100G  disk
├─sda1              1G  part
└─sda2             99G  part
  ├─rhel-root      50G  lvm
  ├─rhel-swap     7.9G  lvm
  └─rhel-home    41.1G  lvm
sr0              1024M  rom

添加8个新磁盘后,lsblk返回:

理想情况下,我可以收集以下形式的磁盘的初始列表:

['sda']
['sda', 'sdb', 'sdc', 'sdd', 'sde', 'sdf', 'sdg', 'sdh', 'sdi']
创建磁盘后,收集表单中的另一个磁盘列表:

['sda']
['sda', 'sdb', 'sdc', 'sdd', 'sde', 'sdf', 'sdg', 'sdh', 'sdi']
计算两个列表之间的差异将产生:

['sdb', 'sdc', 'sdd', 'sde', 'sdf', 'sdg', 'sdh', 'sdi']
这是新创建的8个磁盘


如果可能的话,我试图避免使用shell或命令模块调用。

此信息通过ansible的机制自动收集

例如:

#!/usr/bin/env ansible-playbook
- name: Lets look at some disks
  hosts: localhost
  become: false
  gather_facts: true
  tasks:
  - name: Output disk information
    debug:
      var: hostvars[inventory_hostname].ansible_devices
如果我们改为在上使用gather_子集配置,则可以加快事实收集速度,并且只收集有关系统硬件的信息

然后,我们可以将其与python键方法和jinja2列表过滤器相结合,以生成所需的输出

#!/usr/bin/env ansible-playbook
- name: Lets look at some disks
  hosts: localhost
  become: false
  gather_facts: false
  tasks:
  - name: Collect only facts about hardware
    setup:
      gather_subset:
      - hardware

  - name: Output disks
    debug:
      var: hostvars[inventory_hostname].ansible_devices.keys() | list
还可以使用[defaults]部分中的gather_subset键在ansible配置文件中配置要收集的事实

编辑: 如果您想筛选出各种磁盘类型,最简单的方法是使用map'regex_search'、“*search string*”来提取所需的值。您可以通过选择“字符串”来删除空值

例如,对于sd*形式的磁盘:

#!/usr/bin/env ansible-playbook
- name: Lets look at some disks
  hosts: localhost
  become: false
  gather_facts: false
  tasks:
  - name: Collect only facts about hardware
    setup:
      gather_subset:
      - hardware

  - name: Output disks
    debug:
      var: hostvars[inventory_hostname].ansible_devices.keys() | map('regex_search', 'sd.*') | select('string') | list

添加任何磁盘后,请尝试此命令,您可以看到更改:

for d in /sys/class/scsi_device/* ; do echo 1 > $d/device/rescan; done

在实施@Nick建议的解决方案后,我看到了以下输出:`[dm-10、dm-8、fd0、sr0、sda、sdb、dm-9、dm-6、dm-7、dm-4、dm-5、dm-2、dm-3、dm-0、dm-1]`在我的机器上运行lsblk时,我没有看到任何设备映射器名称dm-如上所列,我可以正确地看到新添加的sdc、sdd等形式的磁盘。。。。我期望能够看到sdc、sdd等形式的磁盘名称,这是不是错了。。。从ansible_devices.keys中,您是否仅列出原始磁盘?只是磁盘分区?只是逻辑卷?ansible_设备中包含的信息将是上述所有信息,您必须过滤掉您不想看到的内容。lsblk命令将自动以可视方式格式化此信息。dm-X条目通常是逻辑卷的设备映射器条目。我只查找原始磁盘。我查看了ansible_设备的全部输出,似乎没有看到任何新创建的磁盘名。我还尝试在ansible中使用命令运行lsblk,但在创建后无法看到新磁盘,这使我认为问题可能不在ansible_磁盘上。来自@Nick的原始答案非常有效-我意识到我有一个我没有注意到的“连接:本地”,因此我收集了有关错误机器的事实。此信息非常有用有价值的如果要在具有hd、sd、nvme和xd驱动器的系统上使用,该怎么办?如何使其成为收集这些设备名称的通用方法?