0

我正在寻找一个能够列出实际安装的 Linux 系统上的所有包并将它们注册到 var 的 ansible 角色和模块。然后升级所有这些并将第二个列表放在另一个变量中。

我的模块在这里制作两个字典(yum_packages1 和 yum_packages2)的差异,并在我的角色结束时返回它

当我试图将这两个字典传递到我的模块中并开始我的治疗时,我遇到了一个非常奇怪的错误。

致命:[centos7_]:失败!=> {"changed": false, "msg": "argument 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

客户 ansible 模块

#!/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()

你知道我为什么会收到这个错误吗?

4

1 回答 1

0

你知道我为什么会收到这个错误吗?

因为set不是 json 可序列化的:

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

高兴地产生:

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

这实际上在实际的 ansible 模块中咬了我几次,这就是为什么我知道这是一件事;如果您坚持使用自定义模块,则需要在返回之前将其转换set为 a :list

module.exit_json(changed=False, diff=list(f3))
于 2020-01-11T06:46:04.633 回答