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</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提供的命令以交互形式修复错误,然后再继续执行后续步骤,不需要像之前那样修改代码再重头执行,提高了调试效率。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容