作为evidenced here ,我注意到 Ansible 中有一个奇怪的新行为。
我有an Ansible role named "degoss"安装 Goss连同一些测试文件到系统,执行测试,然后删除它们的所有痕迹。我正在使用 a callback plugin格式化输出和 a custom module调用高斯。
当测试失败时,在较新版本的 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 block 包装我对 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 loader在 ansible.plugins.callback 中创建一个模块,它恰好也包含一个 json module .当你的回调插件 imports json你得到 ansible.plugins.callback.json,它不包含 dumps。您可以通过将 from __future__ import absolute_import 添加到您的插件来解决此问题。
您无法重现它的原因可能是您在本地使用 Python 3,它默认为绝对导入。
