Как собрать выборочные диски и неиспользуемое пространство с помощью фактов Ansible?

Как собрать выборочные диски и неиспользуемое пространство с помощью фактов Ansible?

Вот мои примеры кодов, вопросы внизу

hw.j2:

System Total Memory     : {{ ansible_memtotal_mb }}
Free Memory             : {{ ansible_memfree_mb }}
System Total CPU        : {{ ansible_processor_cores }}
System Virtual CPU      : {{ ansible_processor_vcpus }}

Disks capacities
        /dev/sda        : {{ ansible_devices.sda.size }}
        /dev/sdb        : {{ ansible_devices.sdb.size }}
        /dev/sdc        : {{ ansible_devices.sdc.size }}

collecthw.yml:

---
- name: Collect information
  become: yes
  hosts: clients

  tasks:
  - name: use template from labs/hw.j2
    template:
      src: hw.j2
      dest: hw.{{ ansible_facts.hostname }}.txt
      owner: corona
      group: corona
      mode: '0600'

Работает нормально, но...

Теперь мои вопросы:

  1. Как выполнить цикл по всем /dev/sd* на управляемых узлах и собрать их соответствующий размер диска?
  2. Это размер диска, а что насчет неиспользуемого дискового пространства?

Спасибо заранее тем, кто сможет потратить время и усилия на получение ответа или, возможно, другого совета. Новичок здесь xD

решение1

Например, выберите все устройства, кроме loop*и размер дисплея

    - set_fact:
        my_devices: "{{ ansible_devices.keys()|
                        reject('match', '^loop(.*)$')|
                        list }}"
    - debug:
        msg: "{{ item }} {{ ansible_devices[item].size }}"
      loop: "{{ my_devices }}"

давать

  msg: nvme0n1 238.47 GB

В1:«Как выполнить цикл по всем /dev/sd* на управляемых узлах и собрать их соответствующий размер диска?»

A1: В коде выше изменитеrejectфильтровать поselect

                        select('match', '^sd(.*)$')|

и используйте шаблон ниже

{% for dev in my_devices %}
{{ dev }}: {{ ansible_devices[dev].size }}
{% endfor %}

В2:«А как насчет неиспользуемого дискового пространства?»

A2: Используйте переменную ansible_mountsдля отображения неиспользуемого пространства. Например

    - set_fact:
        my_devs: "{{ my_devs|default([]) +
                     [ansible_mounts|
                      selectattr('device', 'match', my_regex)|
                      list|
                      json_query(my_query)]|first }}"
      loop: "{{ my_devices }}"
      vars:
        my_regex: '^(.*){{ item }}(.*)$'
        my_query: '[].[device, size_total, size_available]'

    - debug:
        msg: "dev: {{ item.0 }}
              size[MB]: {{ (item.1|int / 1000000)|int }}
              free[MB]: {{ (item.2|int / 1000000)|int }}"
      loop: "{{ my_devs }}"

давать

  msg: 'dev: /dev/nvme0n1p6 size[MB]: 41015 free[MB]: 12677'
  msg: 'dev: /dev/nvme0n1p7 size[MB]: 109899 free[MB]: 39896'
  msg: 'dev: /dev/nvme0n1p2 size[MB]: 100 free[MB]: 45'

Используйте шаблон ниже для хранения неиспользуемого пространства в байтах.

{% for dev in my_devs %}
{{ dev[0] }}: {{ dev[2] }}
{% endfor %}

решение2

Окей, ребята, я наконец-то нашел ответ. Это значение по умолчанию с шаблоном jinja.
Пример кода ниже:
vi hw.j2
Емкость дисков
/dev/sda : {{ ansible_devices.sda.size|default("NONE", true) }}
/dev/sdb : {{ ansible_devices.sdb.size|default("NONE", true) }}
/dev/sdc : {{ ansible_devices.sdc.size|default("NONE", true) }}
/dev/sdz : {{ ansible_devices.sdz.size|default("NONE", true) }

client@ cat list-hw.r8s2.txt
Емкость дисков
/dev/sda : 20,00 ГБ
/dev/sdb : 20,00 ГБ
/dev/sdc : 20,00 ГБ
/dev/sdz : NONE

Связанный контент