使用方法失败; 'module'对象没有属性'dumps'

时间:2017-09-18 20:26:24

标签: python ansible

作为evidenced here,我注意到Ansible中有一个奇怪的新行为。

我有an Ansible role named "degoss"Goss和一些测试文件一起安装到系统中,执行测试,然后删除它们的所有痕迹。我正在使用a callback plugin格式化输出,使用a custom module来调用Goss。

当测试失败时,而不是获得合理的输出,在较新版本的Ansible中(据我所知,大约为2.3),我得到以下不直观的错误消息,并且我的插件没有任何输出:

[WARNING]: Failure using method (v2_runner_on_failed) in callback plugin
(<ansible.plugins.callback.default.CallbackModule object at 0x7fb5e92efd50>):
'module' object has no attribute 'dumps'

现在,当我搜索ansible.plugins.callback.default.CallbackModule时,我看不到dumps的任何调用。当我搜索ansible.plugins.callback.CallbackBase时,我确实看到了三次转储调用。在我自己的回调插件和自定义模块中,我try / except阻止了我对json.dumps的所有调用。

更糟糕的是,我似乎无法一致地复制这个问题。我不能在本地复制它,它只在任务失败时出现。我的成功/失败逻辑如下:

succeed(module, **result) if rc == 0 else fail(
    module, "Goss Tests Failed.", **result
)

我的succeed / fail方法定义如下:

def succeed(module, **kwargs):
    module.exit_json(changed=False, failed=False, goss_failed=False, **kwargs)

def fail(module, message, **kwargs):
    module.fail_json(msg=message, failed=True, goss_failed=True, **kwargs)

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

这是一个猜测: ansible的callback plugin loaderansible.plugins.callback中创建了一个模块,该模块恰好还包含json module。当您的回调插件imports json获得ansible.plugins.callback.json时,其中不包含dumps。您可以通过在插件中添加from __future__ import absolute_import来解决此问题。

您无法重现它的原因可能是您在本地使用Python 3,默认为绝对导入。

答案 1 :(得分:0)

除了接受的答案外,只想指出有两个文件需要在其中添加导入语句。

playbooks / callback_plugins / sqs.py

playbooks / callback_plugins / task_timing.py

我错过了更新task_timing.py文件,因此错误仍然存​​在。在这里指出这一点,以防其他人也遇到同样的问题。

来源:edx configuration repo - diff