Ansible系列(7):代码调试利器,debugger让你不用重启在线调试

这是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

用这两种方式,当任务失败或不可达时都会调用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模式下:

image-20210922171335453.png

通过p task_args命令查看当前的参数列表,通过task.args['data'] = '{{info}}'设置参数名,然后通过r命令重新执行该任务,再次执行时执行成功。

总结

这一节介绍了debugger任务调试器如何开启,都有哪些命令,并通过一个示例演示了如何使用debugger进行调试。从示例可以看到,当task失败后会进入到debugger的调试模式,利用debugger提供的命令以交互形式修复错误,然后再继续执行后续步骤,不需要像之前那样修改代码再重头执行,提高了调试效率。

你可能感兴趣的:(Ansible系列(7):代码调试利器,debugger让你不用重启在线调试)