我正在尝试写一个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模块调用。
发布于 2019-07-19 07:54:37
这些信息是通过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上的gather_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还可以使用[defaults]部分中的gather_subset键配置要在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发布于 2020-12-08 23:15:47
在添加任何磁盘后尝试此命令,您可以看到更改:
for d in /sys/class/scsi_device/* ; do echo 1 > $d/device/rescan; donehttps://stackoverflow.com/questions/57102717
复制相似问题