首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Ansible收集有关磁盘的事实

如何使用Ansible收集有关磁盘的事实
EN

Stack Overflow用户
提问于 2019-07-19 05:16:00
回答 2查看 13.3K关注 0票数 3

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

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

代码语言:javascript
复制
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返回:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
['sda']

创建磁盘后,收集以下形式的另一个磁盘列表:

代码语言:javascript
复制
['sda', 'sdb', 'sdc', 'sdd', 'sde', 'sdf', 'sdg', 'sdh', 'sdi']

计算两个列表之间的差异将产生以下结果:

代码语言:javascript
复制
['sdb', 'sdc', 'sdd', 'sde', 'sdf', 'sdg', 'sdh', 'sdi']

这是新创建的8个磁盘。

如果可能的话,我尽量避免使用shellcommand模块调用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-19 07:54:37

这些信息是通过ansible的fact gathering机制自动收集的。

参见Variables discovered from systems: Facts

例如:

代码语言:javascript
复制
#!/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过滤器结合使用,以生成所需的输出。

代码语言:javascript
复制
#!/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*形式的磁盘

代码语言:javascript
复制
#!/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
票数 6
EN

Stack Overflow用户

发布于 2020-12-08 23:15:47

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

代码语言:javascript
复制
for d in /sys/class/scsi_device/* ; do echo 1 > $d/device/rescan; done
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57102717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档