如何使用Ansible

时间:2019-07-18 21:15:59

标签: ansible ansible-facts

我正在尝试编写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个新创建的磁盘。

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

2 个答案:

答案 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