美文网首页
Ansible系列(7):代码调试利器,debugger让你不用

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

作者: DevOps亮哥 | 来源:发表于2021-09-24 22:19 被阅读0次

    这是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模式下:

    image-20210922171335453.png

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

    总结

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

    相关文章

      网友评论

          本文标题:Ansible系列(7):代码调试利器,debugger让你不用

          本文链接:https://www.haomeiwen.com/subject/kcltnltx.html