ansible 調試 debug、-vvv


一、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}}'設置參數名,然后通過  命令重新執行該任務,再次執行時執行成功

在ansible.cfg文件中:

[defaults]
enable_task_debugger = True

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM