Ansible: определить точную версию программного обеспечения, установленного на хосте - PullRequest
0 голосов
/ 01 октября 2019

Альтернативный вопрос для этого поста: как получить доступ к значениям dict для гнезда, в частности в ansible_facts.packages?

Я бы хотел определить точную версию программного обеспечения, установленного на хосте. Если оно ниже желаемого, мне нужно скопировать RPM из локального репо и обновить. Мне трудно понять, как получить доступ к вложенному dict, который вы получаете при запуске package_facts.

Я вижу, что package_facts возвращает данные примерно так:

    "msg": {
    ...
    "NessusAgent": [
        {
            "arch": "x86_64", 
            "epoch": null, 
            "name": "NessusAgent", 
            "release": "es7", 
            "source": "rpm", 
            "version": "6.11.1"
        }
    ], 
    ...

Вот моя попытка воспроизведениясохранить значение для 'version' в переменной ...

  - name: check installed software
    package_facts:
      manager: auto

  - name: check installed version
    set_fact:
      sw_ver_installed: "{{ item.value.version }}"
    with_dict: "{{ ansible_facts.packages['NessusAgent'] }}"

  - name: debug - sw_ver_installed
    debug:
      var: sw_ver_installed

..., которая завершается с этой ошибкой:

"Задача включает параметр с неопределеннымПеременная. Ошибка была: 'ansible.utils.unsafe_proxy.AnsibleUnsafeText объект' не имеет атрибута 'версия

Я пробовал несколько вариантов, которые терпят неудачу с такими же или похожими ошибками, или сбрасывает весьk / v набор данных для NessusAgent. Я отказался от простых примеров диктов в документации Ansible

1 Ответ

1 голос
/ 01 октября 2019

Вы не хотите with_dict, потому что использование packages["NessusAgent"] превратило это из dict[str, list[dict]] в list[dict].

На основе исключительно этого конкретного результата ,вам не нужна циклическая конструкция, вы можете просто зайти в список и вывести нужный атрибут за один раз:

set_fact:
   sw_ver_installed: "{{ ansible_facts.packages['NessusAgent']
     | map(attribute='version') | first }}"

Или, если вы уверены, что список всегда будет содержать ровно один предмет:

set_fact:
   sw_ver_installed: "{{ ansible_facts.packages['NessusAgent'][0].version }}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...