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提供的命令以交互形式修復錯誤,然后再繼續執行后續步驟,不需要像之前那樣修改代碼再重頭執行,提高了調試效率。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容