如何使用Ansible收集有关磁盘的信息
我正在尝试写一本Ansible playbook,它将识别RHEL机器上新添加的磁盘。计划是在创建新磁盘之前,运行playbook并在该时间点缓存磁盘。创建新磁盘后,将再次运行相同的playbook,并计算创建磁盘前后磁盘的差异 例如,lsblk最初返回以下内容:如何使用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
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驱动器的系统上使用,该怎么办?如何使其成为收集这些设备名称的通用方法?