Как получить разницу между дисками до и после добавления нового диска

Я готовлю сборник сценариев для поиска недавно отсканированного жесткого диска из vmware. Я использовал приведенную ниже фильтрацию, чтобы получить номер «нет». жестких дисков:

      before_add: "{{ hostvars[inventory_hostname].ansible_devices.keys() | select('string') | list }}"

ВЫХОД-['sr0', 'sda', 'sdb', 'sdc', 'dm-2', 'dm-3', 'dm-0', 'dm-1']

затем добавьте новый жесткий диск, используя модуль vmware_guest_disk, а затем я запустил модуль настройки, чтобы получить последний номер. дисков

      after_add: "{{ hostvars[inventory_hostname].ansible_devices.keys() | select('string') | list }}"

ВЫХОД: ['sr0', 'sda', 'sdb', 'sdc', 'sdd', 'dm-2', 'dm-3', 'dm-0', 'dm-1']

Поскольку управляемый хост является удаленным узлом, я не могу думать о поиске и фильтрации различий. Подскажите пожалуйста, как получить разницу: "SDD"

1 ответ

Добавление пользовательских фактов — это то, что вам нужно. Это служит самой цели хранения постоянных пользовательских фактов. Например, создайте каталог для пользовательских фактов и отобразите переменную ansible_local .

          - name: Create directory for ansible custom facts
      ansible.builtin.file:
        state: directory
        recurse: true
        path: /etc/ansible/facts.d
    - debug:
        var: ansible_local

Переменная ansible_local должна быть пустым словарем, если вы ранее не настроили пользовательские факты.

        ansible_local: {}

Установите переменные before_add и after_add и отобразите разницу

          - set_fact:
        before_add: "{{ ansible_local.devices.general.before_add|
                        default([]) }}"
        after_add: "{{ hostvars[inventory_hostname].ansible_devices.keys()|
                       select('string')|list }}"
    - debug:
        msg: "{{ after_add|difference(before_add) }}"

Когда вы запускаете игру в первый раз, переменная before_add будет пустым списком, и задача отладки должна отображать все устройства, например

        msg:
  - loop1
  - nvme0n1
    ...

Здесь начинается самая важная часть хранения постоянного пользовательского факта. Например, скопируйте словарь в файл

          - name: Install custom devices fact
      ansible.builtin.copy:
        content: |
          {"general": {"before_add": {{ after_add }} }}
        dest: /etc/ansible/facts.d/devices.fact

Когда вы снова запустите игру, настройка должна прочитать ansible_local.

        ansible_local:
    devices:
      general:
        before_add:
        - loop1
        - nvme0n1
          ...

и не должно быть никакой разницы между before_add и after_add

        msg: []

Если вы добавите устройство, отладка должна отобразить разницу, например

        msg:
  - sda

Но, разница будет пустой, если вы вытащите устройство. Если вы хотите видеть как добавленные, так и удаленные устройства, используйте symmetric_difference вместо разницы , например

          - debug:
        msg: "{{ after_add|symmetric_difference(before_add) }}"
Другие вопросы по тегам