簡體   English   中英

如何使用 Ansible 收集有關磁盤的事實

[英]How to gather facts about disks using Ansible

我正在嘗試編寫一個 Ansible 劇本,它將識別 RHEL 機器上新添加的磁盤。 計划是在創建新磁盤之前運行 playbook 並在該時間點緩存磁盤作為事實。 創建新磁盤后,將再次運行相同的 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

添加 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個新創建的磁盤。

如果可能,我會盡量避免使用shellcommand模塊調用。

這些信息是通過 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

如果我們改用setup 模塊上的 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

添加任何磁盤后嘗試此命令,您可以看到更改:

for d in /sys/class/scsi_device/* ; do echo 1 > $d/device/rescan; done
- name: Check disk size
  debug:
    msg: "{{ ansible_devices[item].size }}"
  loop: "{{ ansible_devices.keys()|list }}"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM