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

Naf*_*Kay 1 python ansible

正如这里证明的,我注意到Ansible中有一个奇怪的新行为.

我有一个名为"degoss"的Ansible角色,它将Goss与一些测试文件一起安装到系统中,执行测试,然后删除它们的所有痕迹.我正在使用回调插件来格式化输出,并使用自定义模块来调用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'
Run Code Online (Sandbox Code Playgroud)

现在,当我搜索时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
)
Run Code Online (Sandbox Code Playgroud)

我的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)
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

小智 5

这是一个猜测:ansible的回调插件加载器创建了一个模块,ansible.plugins.callback其中恰好还包含一个json模块.当你的回调插件导入你得到的jsonansible.plugins.callback.json,它不包含dumps.您可以通过添加from __future__ import absolute_import到您的插件来解决此问题.

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