Ansible 2.9.2自定义模块报错:'bool'对象无'get'属性
Fixing AttributeError in Custom Ansible Module: 'bool' object has no attribute 'get'
我一眼就发现问题出在你定义AnsibleModule的方式上——你把supports_check_mode=False错误地放到了argument_spec字典内部,而它应该是AnsibleModule类的独立初始化参数,不属于参数规范的一部分。
为什么会报错?
当Ansible解析模块的参数规范时,会默认对argument_spec里的每个键值对执行字典相关操作(比如.get()方法)。但你在这里塞了一个布尔值False,Ansible尝试对这个布尔值调用.get()方法,自然就触发了AttributeError: 'bool' object has no attribute 'get'这个错误。
修正后的模块代码
只需要把supports_check_mode=False从argument_spec里移出来,作为AnsibleModule的单独参数传入即可:
#!/usr/bin/python from ansible.module_utils.basic import AnsibleModule class AnsibleModuleTest(object): def __init__(self, var1, var2, var3, var4): self._var1 = var1 self._var2 = var2 self._var3 = var3 self._var4 = var4 def run(self, check): if check: return {"result": True, "data": {"var1": self._var1, "var2": self._var2, "var3": self._var3, "var4": self._var4}} else: return {"result": False, "error": "fail"} def main(): module = AnsibleModule( argument_spec=dict( var1=dict(required=True), var2=dict(required=True), var3=dict(required=False, default=None), var4=dict(required=False, default=None) ), supports_check_mode=False # 移到这里作为独立参数 ) var1 = module.params["var1"] var2 = module.params["var2"] var3 = module.params["var3"] var4 = module.params["var4"] _test_module = AnsibleModuleTest(var1, var2, var3, var4) _returned_data = _test_module.run(True) if _returned_data["result"]: result = dict(msg=_returned_data["data"], changed=False) module.exit_json(**result) else: module.fail_json(msg=_returned_data["error"]) if __name__ == '__main__': main()
验证修复
重新运行你的测试Playbook:
ansible-playbook module_test.yml
现在模块应该能正常执行,返回的output会包含你传入的var1、var2,以及默认值为None的var3和var4。
内容的提问来源于stack exchange,提问作者Mark Ryan
相关产品推荐
相关产品推荐

