Ansible自定义模块中能否使用print语句进行调试?
在Ansible自定义模块中调试输出的正确方式
直接用print()输出内容会导致Ansible解析模块返回结果失败——因为Ansible要求模块必须通过标准输出返回合法的JSON结构,print()的内容会混入其中,破坏JSON格式。不过有两种安全的调试方式:
1. 使用模块内置的debug()方法
AnsibleModule提供了debug()方法,它会将调试信息输出到标准错误(stderr),不会干扰JSON输出。运行playbook时加上-v/-vvv参数就能看到这些调试内容。
修改你的代码示例(顺便修正了初始化方法里的参数引用错误):
from ansible.module_utils.basic import AnsibleModule module_args = { 'jobid': {'type': 'str', 'required': True} } class dcsjob(): def __init__(self, arglist): self.jobid = arglist[0] def checkandwaitforjob(self, module): # 输出固定调试文本 module.debug("Hello") # 输出变量值 module.debug(f"当前传入的Job ID: {self.jobid}") def run_module(): module = AnsibleModule( argument_spec=module_args, supports_check_mode=True ) dcsjobobj = dcsjob([module.params['jobid']]) # 将module对象传入方法,用于调用debug接口 dcsjobobj.checkandwaitforjob(module) # 模块必须用exit_json或fail_json结束,这是Ansible模块的强制要求 module.exit_json(changed=False, msg="任务执行完成") if __name__ == '__main__': run_module()
运行playbook时添加-vvv参数,就能在输出中看到类似这样的调试信息:
... <目标主机> ESTABLISH SSH CONNECTION FOR USER: ... <目标主机> EXEC /bin/sh -c '...' <目标主机> STDERR: Hello <目标主机> STDERR: 当前传入的Job ID: 123456 ...
2. 将调试信息加入模块返回结果
如果想在playbook的任务结果中直接看到调试内容,可以在module.exit_json()里添加自定义字段:
def run_module(): module = AnsibleModule( argument_spec=module_args, supports_check_mode=True ) job_id = module.params['jobid'] dcsjobobj = dcsjob([job_id]) dcsjobobj.checkandwaitforjob(module) # 在返回结果中加入调试字段 module.exit_json( changed=False, msg="任务执行完成", debug_details={ "传入的JobID": job_id, "当前状态": "等待任务结束" } )
执行完playbook后,任务结果里会显示debug_details字段的内容,方便直接查看变量和状态信息。
内容的提问来源于stack exchange,提问作者Akash-BLR
相关产品推荐
相关产品推荐

