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

AC-*_*C-5 3 ansible ansible-facts

我正在尝试编写一个 Ansible playbook,它将识别 RHEL 机器上新添加的磁盘。计划是在创建新磁盘之前运行剧本并在该时间点缓存磁盘作为事实。创建新磁盘后,将再次运行相同的 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

Run Code Online (Sandbox Code Playgroud)

添加 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
Run Code Online (Sandbox Code Playgroud)

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

['sda']
Run Code Online (Sandbox Code Playgroud)

并在创建磁盘后收集另一个形式的磁盘列表:

['sda', 'sdb', 'sdc', 'sdd', 'sde', 'sdf', 'sdg', 'sdh', 'sdi']
Run Code Online (Sandbox Code Playgroud)

计算两个列表之间的差异将产生:

['sdb', 'sdc', 'sdd', 'sde', 'sdf', 'sdg', 'sdh', 'sdi']
Run Code Online (Sandbox Code Playgroud)

这是8个新创建的磁盘。

如果可能,我试图避免使用shellorcommand模块调用。

Nic*_*ick 6

这些信息是通过 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
Run Code Online (Sandbox Code Playgroud)

如果我们改为在setup 模块上使用 gather_subset 配置,我们可以加快事实收集速度,并且只收集有关系统硬件的信息。

然后,我们可以将其与 pythonkeys()方法和 jinja2list过滤器结合起来,以产生您想要的输出。

#!/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
Run Code Online (Sandbox Code Playgroud)

还可以使用部分中的键配置要在ansible配置文件ansible.cfg 中收集哪些事实。gather_subset[defaults]

编辑:如果您想过滤掉各种磁盘类型,最简单的方法是使用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
Run Code Online (Sandbox Code Playgroud)