Ansible ошибка типа var при переходе на мой пользовательский модуль - PullRequest
0 голосов
/ 10 января 2020

Я хочу сделать роль и модуль ansible способными вывести список всех пакетов в системе Linux, фактически установленных, и зарегистрировать их в var. Затем обновите их все и поместите второй список в другую переменную.

Мой модуль находится здесь, чтобы выполнить различие между двумя словарями (yum_packages1 и yum_packages2) и вернуть его в конце моей роли

Когда я пытаюсь передать эти два диктонара в мои модули и начать лечение, у меня появляется очень странная ошибка.

фатально: [centos7_]: FAILED! => {"change": false, "msg": "аргумент yum_packages2 относится к типу, и мы не смогли преобразовать в dict: невозможно преобразовать в dict"}

Ansible роль задачи

---
# tasks file for ansible_yum_update_linux
- name: Listing Linux packages already installed
  yum:
    list: installed
  register: yum_packages1

- name: Upgrade paquets Linux
  yum:
    name: '*'
    state: latest
    exclude: "{{ packages_exclude }}"

- name: Listing Linux packages installed and updated
  yum:
    list: installed
  register: yum_packages2

- debug:
    var: yum_packages1
- debug:
    var: yum_packages2

- name: file compare
  filecompare:
    yum_packages1: "{{ yum_packages1.results }}"
    yum_packages2: "{{ yum_packages2.results }}"
  register: result

- debug:
    var: result

Custome ansible module

#!/usr/bin/python

import json

from ansible.module_utils.basic import AnsibleModule

def diff_update(f1,f2):
    #f3 = set(f1.keys()) == set(f2.keys())
    upd1 = set(f1.values())
    upd2 = set(f2.values())
    f3 = (upd1.difference(upd2))
    return f3

def main():
    module = AnsibleModule(
        argument_spec = dict(
            yum_packages1 = dict(required=True, type='dict'),
            yum_packages2 = dict(required=True, type='dict')
        )
    )

    f3 = diff_update(module.params['yum_packages1'],module.params['yum_packages2'])

    module.exit_json(changed=False, diff=f3)

if __name__ == '__main__':
    main()

У вас есть идеи, почему я получаю эту ошибку?

1 Ответ

0 голосов
/ 11 января 2020

У вас есть идеи, почему я получаю эту ошибку?

Потому что set не json сериализуемый:

import json
print(json.dumps(set("hello", "kaboom")))

весело выдает:

TypeError: set(['kaboom', 'hello']) is not JSON serializable

Это на самом деле меня укусило пару раз в настоящие ansible модули, поэтому я знал, что это вещь; если вы настаиваете на использовании своего пользовательского модуля, вам нужно преобразовать set обратно в list перед его возвратом:

module.exit_json(changed=False, diff=list(f3))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...