You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:50:22