我正在尝试编写Ansible剧本,该剧本将识别RHEL机器上新添加的磁盘。计划是在创建新磁盘之前,在该时间点运行剧本并缓存磁盘。创建新磁盘后,将再次运行相同的剧本,并计算磁盘创建前后磁盘之间的差异。
例如,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
返回:
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
sdb 18.6G disk
sdc 18.6G disk
sdd 18.6G disk
sde 18.6G disk
sdf 18.6G disk
sdg 18.6G disk
sdh 18.6G disk
sdi 18.6G disk
sr0 1024M rom
理想情况下,我可以收集以下形式的磁盘的初始列表:
['sda']
在创建磁盘后,收集以下形式的磁盘列表:
['sda', 'sdb', 'sdc', 'sdd', 'sde', 'sdf', 'sdg', 'sdh', 'sdi']
计算两个列表之间的差异将得出:
['sdb', 'sdc', 'sdd', 'sde', 'sdf', 'sdg', 'sdh', 'sdi']
这是8个新创建的磁盘。
如果可能的话,我试图避免使用shell
或command
模块调用。
答案 0 :(得分:2)
此信息通过ansible的fact gathering机制自动收集。
请参见Variables discovered from systems: Facts。
例如:
#!/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
如果我们改为使用setup module上的collect_subset配置,则可以加快事实收集的速度,仅收集有关系统硬件的信息。
然后我们可以将其与python keys()
方法和jinja2 list
过滤器结合使用,以产生所需的输出。
#!/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
还可以使用gather_subset
部分中的[defaults]
键来配置要在ansible配置文件ansible.cfg中收集的事实。
编辑:
如果要过滤掉各种磁盘类型,最简单的方法是使用map('regex_search', '*search string*')
提取所需的值。您可以通过select('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
答案 1 :(得分:0)
在添加任何磁盘之后尝试此命令,您将看到更改:
for d in /sys/class/scsi_device/* ; do echo 1 > $d/device/rescan; done