一、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
