一、debug模塊
1、debug模塊是Ansible Playbook中最常用的調試模塊,可以在Playbook執行過程打印調試信息,特別是跟when條件語句一起使用時,可以調試特定條件下的執行過程。
比如:當變量 a 定義時,將 a 的值打印出來,當任務成功后,打印執行結果等。
msg:調試輸出的消息
var:將某個任務執行的輸出作為變量傳遞給debug模塊,debug會直接將其打印輸出 verbosity:debug的級別(默認是0級,全部顯示)
參數 | 默認值 | 解釋 |
msg(string) | null | 輸出自定義信息,如果不指定或不寫msg的話,默認也會輸出“null” |
var(string) | 指定要打印的變量名,與msg參數互斥,二者只能有一個。注意:var參數中的變量不需要使用{{}}表達式,而msg中需要。 | |
verbosity(integer) | 默認:0 | debug的調試級別,默認0是全部顯示,級別調整到3是忽略內容不顯示,如果verbosity參數設置為3還想像是debug內容的話,需要在命令后面加入 -vvv 參數 |
-vvv 參數報錯很直觀
ap deploy/start_monitor.yml -vvv
2、register注冊變量,debug 用vat參數引用register 變量result。
--- - name: Print debug infomation eg1 hosts: web gather_facts: F vars: user: jingyong tasks: - name: Command run line shell: date register: result - name: Show debug info debug: var=result verbosity=0
3、mgs:輸出自定義信息,如果不指定或不寫msg的話,默認會輸出“null”
--- - name: Print debug infomation eg1 hosts: web gather_facts: F vars: user: jingyong tasks: - name: Command run line shell: date register: result - name: Show debug info debug: msg: 這是一個msg自定義輸出測試
var:打印變量值不需要{{ }},多個變量通過 “var1,var2,var3”
--- - hosts: 192.168.40.133 remote_user: root tasks: - name: test vars set_fact: _consul_data: '{{ consul.local_dir | default("/root/zjz" ~ "/consul") }}/data' _consul_config: '{{ consul.local_dir | default("/root/test" ~ "/consul") }}/config' - name: print vars debug: var: "_consul_data, _consul_config"
4、debug模塊,msg表示打印自定義消息,獲取變量{{}},x.stdout輸出具體的值。
--- - hosts: web tasks: - name: show hostname command: hostname register: name - name: print hostname debug: msg={{name.stdout}}
5、debug與when連用
--- - hosts: web 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"
結果:兩個skipping,是因為debug的調試級別不是0
如果遇到報錯: 手敲一遍。
yaml文件格式要對其,同一級別的對象要放在同一列,幾個空格不重要,不用有tab
二、assert模塊
assert模塊是用來斷言 playbook中 給定的表達式。當表達式成功或失敗時輸出一些信息,幫助進行調試。
assert模塊可用作單元測試,每次修改playbook后,都通過 assert 斷言判斷有沒有改變執行結果。
assert模塊有四個參數,分別是:
fail_msg:當斷言失敗時輸出的消息。 success_msg:當斷言成功時輸出的消息。 quite:當為yes時,如果成功就不輸出任何消息,為no時,斷言成功會輸出消息。 that:需要判斷的表達式列表。
例子:
--- - hosts: web 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: web vars: number_of_the_count: 5 tasks: - name: use fail module with when ignore_errors: yes fail: msg: "test test test" when: number_of_the_count == 5 - name: use fail module fail:
注意:不帶參數,輸出默認消息
四、--start-at-task參數
其中有個任務經常失敗,需要不停的重試。如果在這個任務之前還有很多其他成功的任務,如果每次都從頭執行,那么每次都需要執行那些已經成功的任務,效率就很低,這時可以通過--start-at-
task參數指定這個特定的任務。
ansible-playbook assert.yml --start-at-task="print origin fail msg"
五、--step參數
-step參數與--start-at-task參數不同,--start-at-task參數是從某個特定的任務開始,而--step是以交互的模式一步一步的執行。
六、debugger調試工具
開啟方法:使用debugger關鍵字、使用配置文件或環境變量(二者默認都是task級別的)
debugger關鍵的值有下面幾個:
always:無論如何都會調用debugger。 never:無論如何都不會調用debugger。 on_failed:只有當任務失敗的時候再調用debugger。 on_unreachable:只有當主機不可達時再調用debugger。 on_skipped:只有當任務skipped再調用debugger。
Debugger中可用的命令
在使用debugger進行調試時,是進入到一個交互模式窗口下,使用debugger提供的命令進行調試,有下面幾種命令:
1、打印這些模塊的值。
p task:打印出任務的名稱 p task_vars:打印任務的變量 p task_args:打印任務的參數 p host:打印當前主機 p result:打印任務執行結果
2、修改模塊參數的值。
task.args[key]=value
3、修改模塊變量的值
task.vars[key]=value
4、根據更新后的變量或參數值從新創建該task
u(update_task)
5、重新執行該task
r(redo)
6、繼續執行后續的tasks
c(continue)
7、從debugger會話中退出。
q(quit)
實例
--- - hosts: web debugger: on_failed gather_facts: no vars: info: debug this playbook tasks: - name: print the wrong variable ping: data={{wrong_info}}
通過p task.args
命令查看當前的參數列表,通過task.args['data'] = '{{info}}'
設置參數名,然后通過 r
命令重新執行該任務,再次執行時執行成功
在ansible.cfg文件中:
[defaults] enable_task_debugger = True