【问题标题】:Ansible error of var type when passing to my custom module传递给我的自定义模块时 var 类型的 Ansible 错误
【发布时间】:2020-04-28 05:39:55
【问题描述】:

我正在寻找一个能够列出 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()

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

【问题讨论】:

  • 嗨,欢迎来到 SO。您可以编辑您的问题并添加完整的(至少可以查看所有已运行的任务和 2 个变量的结构)剧本输出吗?此外,您真的需要为此定制一个模块吗? difference filter 似乎做同样的工作。

标签: python module ansible roles molecule


【解决方案1】:

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

因为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))

【讨论】:

  • 所以返回对象,即类的实例对于 Ansible 来说实际上是不可能的,我假设任何必须返回对象的东西首先不应该是模块并返回对象或类的实例是糟糕的设计吗?只是好奇,因为这似乎不值得单独提出一个问题,在此先感谢!
猜你喜欢
  • 2022-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多