作为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 loader在ansible.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/