这是Ansible系列课程第七节,Ansible如何使用debugger进行调试?。之前发现问题修改代码后需要重新执行进行验证,比较低效,bebugger可以在线修改代码,修改后立即执行,验证代码是否正确。
该系列课程前后章节都是有关联性的,对于初学者建议按顺序阅读。也可以选择特定的章节了解单个知识点。
上一节介绍了几个在编写playbook时帮助调试的工具,这几个工具通过输出日志,分步执行等方式也能提高调试的效率。但这几个工具也有不足,每次修改完代码后,需要重新执行才能验证修改的代码的正确性。今天跟大家介绍另一个调试利器:debugger,为什么说它是调试利器呢?它有什么强大之处,下面我们来介绍一下。
开启Debugger
正如前面所说,Ansible提供了很多帮助我们调试任务的工具,除了输出日志,断言,分步执行,还提供了一个任务调试器。该任务调试器可以在执行过程中修复错误,而无需编辑playbook然后再次执行来检查是否有效。该任务调试器可以访问任务上下文中的所有功能,可以检查变量、设置变量、更新模块参数,并能够使用新的变量重新运行任务。
debugger默认情况下是没有开启的,有几种方式可以帮助我们开启debugger:
使用debugger关键字
可以使用debugger关键字为play、role、block或task开启或关闭调试器。一般情况下,在新增或修改task时开启调试器,这样当失败时可以进行调试,快速修复错误。
在play级别设置debugger:
- name: this is a new play
hosts: all
debugger: on_skipped
tasks:
- name: Execute a command
ansible.builtin.command: "true"
when: False
在task级别设置debugger:
- name: this is a new play
hosts: all
tasks:
- name: Execute a command
ansible.builtin.command: "true"
debugger: on_failed
还可以在多个级别设置debugger:
- name: this is a new play
hosts: all
debugger: never
tasks:
- name: Execute a command
ansible.builtin.command: "true"
debugger: on_failed
当有多个级别中都设置了debugger关键字时,debugger的优先级的顺序由高到低是:task——>block——>play|role——>global。比如在上面的样例中,play级别的debugger值为never,而task级别的debugger值为on_failed,因此当该task失败时,就会调用debugger进行调试,因为task的级别比play的级别要高。
debugger关键的值有下面几个:
always:无论如何都会调用debugger。
never:无论如何都不会调用debugger。
on_failed:只有当任务失败的时候再调用debugger。
on_unreachable:只有当主机不可达时再调用debugger。
on_skipped:只有当任务skipped再调用debugger。
使用配置文件或环境变量
如果想全局开启debugger,可以在ansible.cfg文件或环境变量中进行设置,这两种方式默认都是task级别的。
在ansible.cfg文件中:
[defaults]
enable_task_debugger = True
在环境变量中:
ANSIBLE_ENABLE_TASK_DEBUGGER = True</pre>
用这两种方式,当任务失败或不可达时都会调用debugger,除非该task显式的将debugger禁用。
作为策略进行配置
该方法是与Ansible2.5版本之前的的兼容方案,在未来可能去掉,这里了解一下即可。有三个地方可以进行设置:play,ansible.cfg,环境变量。
在play中进行设置:
- hosts: devops
strategy: debug
tasks:
...
在ansible.cfg中进行设置:
[defaults]
strategy = debug
在环境变量中进行设置:
ANSIBLE_STRATEGY=debug
Debugger中可用的命令
在使用debugger进行调试时,是进入到一个交互模式窗口下,使用debugger提供的命令进行调试,有下面几种命令:
1、p task/task_vars/task_args/host/result
打印这些模块的值。
p task:打印出任务的名称
p task_vars:打印任务的变量
p task_args:打印任务的参数
p host:打印当前主机
p result:打印任务执行结果
2、task.args[key]=value
修改模块参数的值。
3、task.vars[key]=value
修改模块变量的值
4、u(update_task)
根据更新后的变量或参数值从新创建该task
5、r(redo)
重新执行该task
6、c(continue)
继续执行后续的tasks
7、q(quit)
从debugger会话中退出。
如何使用debugger调试
下面我们举一个例子,说明如何使用debugger进行调试。在这个例子中,设置了play级别的debugger值为on_failed,也就是当task失败是调用debugger进行调试。在task中我们使用了一个错误的变量,执行时肯定会失败。我们会在debugger中修改变量名,然后再次成功执行该任务。
---
- hosts: devops
debugger: on_failed
gather_facts: no
vars:
info: debug this playbook
tasks:
- name: print the wrong variable
ping: data={{wrong_info}}
执行结果如下,可以看到,playbook执行到Task[print the wrong variable]时失败,进入到debugger模式下:
通过p task_args
命令查看当前的参数列表,通过task.args['data'] = '{{info}}'
设置参数名,然后通过r
命令重新执行该任务,再次执行时执行成功。
总结
这一节介绍了debugger任务调试器如何开启,都有哪些命令,并通过一个示例演示了如何使用debugger进行调试。从示例可以看到,当task失败后会进入到debugger的调试模式,利用debugger提供的命令以交互形式修复错误,然后再继续执行后续步骤,不需要像之前那样修改代码再重头执行,提高了调试效率。