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


有任何想法吗?

最佳答案

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

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

关于python - 使用方法失败; “模块”对象没有属性“转储”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46287669/

10-12 21:49