LINUX.ORG.RU

История изменений

Исправление CaHbl4, (текущая версия) :

ну в целом можно через register сохранять вывод в переменную для нужных хостов, а потом на локалхосте в цикле собрать значения в один словарь/список

---
# тут для каждого хоста сохраняем вывод в переменную os_version
- hosts: test_hosts
  tasks:
    - name: "get OS version"
      command: "cat /etc/redhat-release"
      register: os_version

    - debug:
        var: os_version

# тут заводим пустой словарь и в цикле аппендим в него значения
- hosts: localhost
  vars:
    os_versions: {}
  tasks:
    - name: "OS version in one dict"
      set_fact:
        os_versions: "{{ hostvars[item]['os_version']['stdout'] | append_to_dict(os_versions, item) }}"
      with_items: "{{ groups['test_hosts'] }}"

    - debug:
        var: os_versions

Примерный вывод:

ok: [localhost] => {
    "os_versions": {
        "test01": "Red Hat Enterprise Linux release 8.2 (Ootpa)",
        "test02": "Red Hat Enterprise Linux release 8.2 (Ootpa)",
        "test03": "Red Hat Enterprise Linux release 8.2 (Ootpa)"
    }
}

дальше уже приделывать логику для сравнения, можно кастомным фильтром

append_to_dict тоже кастомный, может можно стандартным набором обойтись, но сходу не придумал:

def append_to_dict(_val, _dict, _hostname):
    _dict[_hostname] = _val
    return _dict

class FilterModule(object):
    def filters(self):
        return {
            'append_to_dict': append_to_dict
        }

Исходная версия CaHbl4, :

ну в целом можно через register сохранять вывод в переменную для нужных хостов, а потом на локалхосте в цикле собрать значения в один словарь/список

---
# тут для каждого хоста сохраняем вывод в переменную os_version
- hosts: test_hosts
  tasks:
    - name: "get OS version"
      command: "cat /etc/redhat-release"
      register: os_version

    - debug:
        var: os_version

# тут заводим пустой словарь и в цикле аппендим в него значения
- hosts: localhost
  vars:
    os_versions: {}
  tasks:
    - name: "OS version in one dict"
      set_fact:
        os_versions: "{{ hostvars[item]['out']['stdout'] | append_to_dict(os_versions, item) }}"
      with_items: "{{ groups['test_hosts'] }}"

    - debug:
        var: os_versions

Примерный вывод:

ok: [localhost] => {
    "os_versions": {
        "test01": "Red Hat Enterprise Linux release 8.2 (Ootpa)",
        "test02": "Red Hat Enterprise Linux release 8.2 (Ootpa)",
        "test03": "Red Hat Enterprise Linux release 8.2 (Ootpa)"
    }
}

дальше уже приделывать логику для сравнения, можно кастомным фильтром

append_to_dict тоже кастомный, может можно стандартным набором обойтись, но сходу не придумал:

def append_to_dict(_val, _dict, _hostname):
    _dict[_hostname] = _val
    return _dict

class FilterModule(object):
    def filters(self):
        return {
            'append_to_dict': append_to_dict
        }