Ansible系列(6):如何高效的定位問題,試試這幾個小工具

這是Ansible系列課程第六節,Ansible如何進行調試?。介紹一下如何在執行過程中打印日志,如何增加斷言,或者使用調試器。

該系列課程前后章節都是有關聯性的,對于初學者建議按順序閱讀。也可以選擇特定的章節了解單個知識點。

上一節介紹了Inventory文件的語法格式,了解了如何高效管理遠程主機。今天介紹一個代碼編寫的基本技能:調試,方便的調試技巧可以讓我們更清晰的了解代碼的執行邏輯,在出現問題時快速定位,高效解決。這個Ansible系列課程中如果有些playbook不方便采用真實案例,大多數都會采用輸出調試信息的方式進行講解,這也是后續課程的基礎。

debug模塊

debug模塊是Ansible Playbook中最常用的調試模塊,可以在Playbook執行過程打印調試信息,特別是跟when條件語句一起使用時,可以調試特定條件下的執行過程。比如:當變量a定義時,將a的值打印出來,當任務成功后,打印執行結果等等

該模塊有三個參數,分別是:

msg:指定要打印的信息,如果沒有指定,打印默認值“hello world”。

var:指定要打印的變量名,與msg參數互斥,二者只能有一個。注意:var參數中的變量不需要使用{{}}表達式,而msg中需要。

verbosity:控制哪種調試級別下輸出,值為Integer。如果設為3,則只有在-vvv或更高調試級別下才會輸出。

下面舉幾個列子:

---

- hosts: devops

? tasks:

?? - name: show debug msg

? ?? debug:

? ? ?? msg: System {{inventory_hostname}} has uuid {{ansible_product_uuid}}

?? - name: print gateway when it is defined

? ?? debug:

? ? ?? msg: System {{inventory_hostname}} has gateway {{ansible_default_ipv4.gateway}}

? ?? when: ansible_default_ipv4.gateway is defined

?? - name: show uptime

? ?? shell: /usr/bin/uptime

? ?? register: result

?? - name: show uptime result

? ?? debug:

? ? ?? var: result

? ? ?? verbosity: 2

?? - name: display all vars of? a host

? ?? debug:

? ? ?? var: hostvars[inventory_hostname]

? ? ?? verbosity: 3

?? - name: print two lines of messages

? ?? debug:

? ? ?? msg:

? ? ? ?? - "first line msg"

? ? ? ?? - "second line msg"

執行結果如下,因為在執行時使用的-v參數,調試級別不夠,有2個任務skipped了。

assert模塊

assert模塊是用來斷言playbook中給定的表達式。當表達式成功或失敗時輸出一些信息,幫助進行調試。assert模塊可用作單元測試,每次修改playbook后,都通過assert斷言判斷有沒有改變執行結果。

assert模塊有四個參數,分別是:

fail_msg:當斷言失敗時輸出的消息。

success_msg:當斷言成功時輸出的消息。

quite:當為yes時,如果成功就不輸出任何消息,為no時,斷言成功會輸出消息。

that:需要判斷的表達式列表。

下面舉幾個例子:

---

- hosts: devops

? vars:

?? command_result: 'the result is success'

?? number_of_the_count: 5

?? param: 90

? tasks:

?? - name: assert param scope

? ?? assert:

? ? ?? that:

? ? ? ?? - param <= 100

? ? ? ?? - param >= 0

? ? ?? fail_msg: "'param' must be between 0 and 100"

? ? ?? success_msg: "'param' is between 0 and 100"

?? - name: use quiet to avoid verbose output

? ?? assert:

? ? ?? that:

? ? ? ?? - param <= 100

? ? ? ?? - param >= 0

? ? ?? quiet: yes

?? - name: print origin fail msg

? ?? assert:

? ? ?? that:

? ? ? ?? - "'success' in command_result"

? ? ? ?? - number_of_the_count == 4

執行結果如下:

fail模塊

fail模塊是讓當前所執行的任務失敗,并輸出信息。等與when一起使用時,可以在特定條件下讓任務失敗,以調試程序。比如:當status與期望值不符時,任務失敗并輸出變量的值。

fail模塊只有一個參數:

msg:當任務失敗時,輸出特定的消息。如果沒有指定,輸出默認消息“Failed as requested from task”。

下面舉個例子:

---

- hosts: devops

? vars:

?? number_of_the_count: 5

? tasks:

?? - name: use fail module with when

? ?? fail:

? ?? when: number_of_the_count == 5

?? - name: use fail module

? ?? fail:

? ? ?? msg: 'this is a debug msg'


執行結果:

--start-at-task參數

有時候在開發階段調試新增的palybook或task,其中有個任務經常失敗,需要不停的重試。如果在這個任務之前還有很多其他成功的任務,如果每次都從頭執行,那么每次都需要執行那些已經成功的任務,效率就很低,這時可以通過--start-at-task參數指定這個特定的任務。

$ansible-playbookassert.yml--start-at-task="print origin fail msg"

執行結果:

--step參數

--step參數與--start-at-task參數不同,--start-at-task參數是從某個特定的任務開始,而--step是以交互的模式一步一步的執行。以上面debug.yml為例:

$ansible-playbookdebug.yml--step

執行結果,可以看出,每步任務的執行都需要輸入三個選項中的一個:N(跳過)Y(執行)C(繼續執行后面所有步驟)

總結

這一小節主要介紹了幾個在playbook執行過程中方便調試的模塊或參數。編寫playbook就跟寫代碼一樣,不可能沒有bug,不可能不出問題,我們需要做的就是在遇到問題時能夠快速的發現問題,解決問題。Ansible的這幾個功能雖然對調試有很大幫助,但在使用上也有一些問題,比如debug、assert和fail這幾個模塊,需要每次都執行完任務才能看到結果,從輸出信息中判斷任務執行情況。--start-at-task能夠提供執行易錯任務的效率,--step參數可以分步執行任務,但他們不能在task任務執行過程中進行調試。下一節我們就介紹一下ansible強大的調試器debugger的使用。

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

推薦閱讀更多精彩內容