這是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的使用。