偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Ansible劇本的6個(gè)排查技巧

譯文
開(kāi)發(fā) 前端
本文介紹的六個(gè)方法可供您在運(yùn)行Ansible腳本時(shí)檢查問(wèn)題。Ansible是一種功能很強(qiáng)大的工具,可以跨服務(wù)器、云、網(wǎng)絡(luò)和容器等更多系統(tǒng)自動(dòng)化管理各種平臺(tái)。

[[407898]]

【51CTO.com快譯】Ansible是一種功能很強(qiáng)大的工具,可以跨服務(wù)器、云、網(wǎng)絡(luò)和容器等更多系統(tǒng)自動(dòng)化管理各種平臺(tái)。

您常常只需重用現(xiàn)有的角色和集合,就可以自動(dòng)執(zhí)行想要完成的操作。還有許多模塊可供選擇,可以在劇本中使用它們。

但是當(dāng)您開(kāi)始開(kāi)發(fā)和測(cè)試更復(fù)雜的劇本時(shí),最終需要一些故障排查方法。比如檢查Ansible任務(wù)流、確認(rèn)變量的數(shù)據(jù)類(lèi)型,甚至在某個(gè)特定點(diǎn)暫停以檢查它們的值。

本文討論的一些技巧僅適用于通過(guò)命令行執(zhí)行Ansible。其他技巧從Ansible Tower運(yùn)行時(shí)也適用。

1. 你的Ansible環(huán)境和參數(shù)

如果您需要分析為什么某內(nèi)容在劇本中沒(méi)有按預(yù)期運(yùn)行,最好先檢查您的Ansible環(huán)境。

您在運(yùn)行Ansible二進(jìn)制文件和Python的哪些版本和路徑?

如果您添加了劇本所需的操作系統(tǒng)包或Python模塊,Ansible解釋器會(huì)“看到”它們嗎?

可以通過(guò)多種不同的方式獲取這些基本信息。從命令行運(yùn)行ansible --version命令。

  1. > ansible --version 
  2.  
  3. ansible 2.9.10 
  4.  
  5.   config file = /etc/ansible/ansible.cfg 
  6.   configured module search path = ['/home/admin/.ansible/plugins/modules''/usr/share/ansible/plugins/modules'
  7.   
  8.  ansible python module location = /usr/lib/python3.6/site-packages/ansible 
  9.   executable location = /usr/bin/ansible 
  10.   python version = 3.6.8 (default, Mar 18 2021, 08:58:41) [GCC 8.4.1 20200928 (Red Hat 8.4.1-1)] 

可以通過(guò)運(yùn)行其他Ansible命令來(lái)獲取同樣的信息,比如使用--version選項(xiàng)的ansible-playbook或ansible-config。

在Ansible Tower中,如果使用VERBOSITY 2(更詳細(xì))或更高版本執(zhí)行作業(yè)模板,可顯示該信息。

除了Ansible和Python二進(jìn)制文件的版本和位置之外,仔細(xì)檢查用于模塊的路徑總是好事,包括執(zhí)行是否使用了不是默認(rèn)的ansible.cfg文件(即不是/etc/ansible /ansible.cfg)。

要調(diào)查來(lái)自自定義ansible.cfg文件的選項(xiàng),可以從命令行執(zhí)行以下操作:

  1. > ansible-config dump --only-changed 
  2. DEFAULT_BECOME(/home/admin/ansible/ansible.cfg) = True 
  3. DEFAULT_BECOME_USER(/home/admin/ansible/ansible.cfg) = root 
  4. DEFAULT_FORKS(/home/admin/ansible/ansible.cfg) = 10 
  5. DEFAULT_HOST_LIST(/home/admin/ansible/ansible.cfg) = ['/home/admin/ansible/inventory'
  6. DEFAULT_ROLES_PATH(/home/admin/ansible/ansible.cfg) = ['/home/admin/ansible/roles'
  7. HOST_KEY_CHECKING(/home/admin/ansible/ansible.cfg) = False 

顧名思義,這將列出與默認(rèn)參數(shù)不同的參數(shù)。

2. 以詳細(xì)模式運(yùn)行

下一步是在調(diào)試模式下運(yùn)行劇本,以獲取有關(guān)任務(wù)和變量中所發(fā)生情況的更多詳細(xì)信息。

您可以從命令行添加-v(或-vv、-vvv、-vvvv、-vvvvv)。最高的詳細(xì)級(jí)別有時(shí)可能含有太多信息,因此最好在多次執(zhí)行中逐漸增加詳細(xì)級(jí)別,直至獲得所需信息。

排查連接問(wèn)題時(shí)級(jí)別4有所幫助,級(jí)別5適用于排查WinRM問(wèn)題。

在Tower中,您可以從作業(yè)模板定義中選擇VERBOSITY級(jí)別。

注意:記得在解決問(wèn)題后禁用調(diào)試模式,因?yàn)樵敿?xì)信息僅對(duì)排查故障有用。

此外,在調(diào)試模式下,除非您在任務(wù)中使用no_log選項(xiàng),否則會(huì)顯示某些變量(比如密碼)的值,因此完成后刪除輸出。

3.使用調(diào)試來(lái)顯示變量

如果您很清楚問(wèn)題可能出在哪里,可以使用更精準(zhǔn)的方法:僅顯示您需要查看的變量。

  1.  (...) 
  2.   - name: Display the value of the counter 
  3.      debug: 
  4.       msg: "Counter={{ counter }} / Data type={{ counter | type_debug }}" 
  5. (...) 
  6. TASK [Display the value of the counter]  
  7. *************************************************************************** 
  8. ok: [node1] => { 
  9.     "msg""Counter=42 / Data type=AnsibleUnicode" 

這就是為什么我無(wú)法加大計(jì)數(shù)。過(guò)濾器type_debug顯示,數(shù)據(jù)類(lèi)型是text,而不是我以為的int。

4. 確保變量有合適的內(nèi)容和數(shù)據(jù)類(lèi)型

可以使用assert模塊來(lái)確認(rèn):變量有預(yù)期的內(nèi)容/類(lèi)型,如果出了岔子,就促使任務(wù)失敗。

下列劇本表明了這點(diǎn):

  1. --- 
  2. name: Assert examples 
  3.   hosts: node1 
  4.   gather_facts: no 
  5.   vars: 
  6.     var01: 13 
  7.   tasks: 
  8.   - debug: 
  9.       msg: "Parameter 01 is {{ (param01 | type_debug) }}" 
  10.   - name: Make sure that we have the right type of content before proceeding 
  11.     assert: 
  12.       that:  
  13.       - "var01 is defined" 
  14.       - "(var01 | type_debug) == 'int' " 
  15.       - "param01 is defined " 
  16.       - "(param01 | type_debug) == 'int' " 

如果我從命令行運(yùn)行劇本,不提供額外變量:

  1. > ansible-playbook xassert.yml 
  2. PLAY [Assert examples]  
  3. *************************************************************************** 
  4. TASK [debug]  
  5. *************************************************************************** 
  6. ok: [node1] => { 
  7.     "msg""Parameter 01 is AnsibleUndefined" 
  8. TASK [Make sure that we have the right type of content before proceeding] *************************************************************************** 
  9. fatal: [node1]: FAILED! => { 
  10.     "assertion""param01 is defined "
  11.     "changed"false
  12.     "evaluated_to"false
  13.     "msg""Assertion failed" 
  14. PLAY RECAP  
  15. *************************************************************************** 
  16. node1 : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0   

如果我從命令行運(yùn)行劇本,使用額外變量:

  1. > ansible-playbook xassert.yml -e "param01=99" 
  2. PLAY [Assert examples]  
  3. *************************************************************************** 
  4. TASK [debug]  
  5. *************************************************************************** 
  6. ok: [node1] => { 
  7.     "msg""Parameter 01 is str" 
  8. TASK [Make sure that we have the right type of content before proceeding] *************************************************************************** 
  9. fatal: [node1]: FAILED! => { 
  10.     "assertion""(param01 | type_debug) == 'int' "
  11.     "changed"false
  12.     "evaluated_to"false
  13.     "msg""Assertion failed" 
  14. PLAY RECAP  
  15. ***************************************************************************node1 : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0  

看到數(shù)據(jù)類(lèi)型顯示為str讓我很驚訝,但這里給出了解釋和解決方法(https://github.com/ansible/ansible/issues/14179)。

另外,如果您從Tower運(yùn)行同一個(gè)劇本,將參數(shù)作為額外變量或調(diào)查字段來(lái)傳遞,參數(shù)的數(shù)據(jù)類(lèi)型就會(huì)是int。

是的,這有點(diǎn)復(fù)雜,但如果您知道找什么,這些“功能”對(duì)您來(lái)說(shuō)不成問(wèn)題。

5. 列出事實(shí)和變量

無(wú)論您在庫(kù)存中定義了變量,還是在劇本執(zhí)行期間創(chuàng)建和賦予了額外變量,它在某個(gè)時(shí)候?qū)τ跈z查值很有用:

  1. --- 
  2. name: vars 
  3.   hosts: node1,node2 
  4.   tasks: 
  5.   
  6.   - name: Dump vars 
  7.     copy: 
  8.       content: "{{ hostvars[inventory_hostname] | to_nice_yaml }}" 
  9.       dest: "/tmp/{{ inventory_hostname }}_vars.txt" 
  10.     delegate_to: control 
  11.   - name: Dump facts 
  12.     copy:  
  13.       content: "{{ ansible_facts | to_nice_yaml }}" 
  14.       dest: "/tmp/{{ inventory_hostname }}_facts.txt" 
  15.     delegate_to: control 

這將把變量和事實(shí) (如果您在搜集事實(shí))保存在單獨(dú)的文件中,供您分析。

6. 使用任務(wù)調(diào)試器從命令行排查

您還可以使用Ansible調(diào)試器,在逐步模式下執(zhí)行劇本,并以交互方式檢查變量和參數(shù)的內(nèi)容。

此外,還可以實(shí)時(shí)改變變量的值,并繼續(xù)執(zhí)行。

可以在任務(wù)或劇本層面啟用調(diào)試器,比如在以下示例中:

  1. --- 
  2. name: Example using debugger 
  3.   hosts: localhost 
  4.   gather_facts: no 
  5.   vars: 
  6.     radius: "5.3" 
  7.     pi: "3.1415926535" 
  8.   debugger: on_failed 
  9.   tasks: 
  10.   - name: Calculate the area of a circle 
  11.     debug: 
  12.       msg: 
  13.       - "Radius.............: {{ radius }}" 
  14.       - "pi................: {{ pi }}" 
  15.       - "Area of the circle: {{ (pi * (radius * radius)) }}" 

事先聲明一下:我將變量定義為字符串,我試圖執(zhí)行計(jì)算時(shí)這顯然會(huì)引發(fā)錯(cuò)誤。

  1. > ansible-playbook xdebugger.yml  
  2. PLAY [Example using debugger]  
  3. *************************************************************************** 
  4. TASK [Calculate the area of a circle]  
  5. *************************************************************************** 
  6. fatal: [localhost]: FAILED! => {"msg""Unexpected templating type error occurred on (Area of the circle: {{ (pi * (radius * radius)) }}): can't multiply sequence by non-int of type 'AnsibleUnicode'"
  7. [localhost] TASK: Calculate the area of a circle (debug)> p task_vars['pi'
  8. '3.1415926535' 
  9. [localhost] TASK: Calculate the area of a circle (debug)> p task_vars['radius'
  10.  
  11. '5.3' 
  12.  
  13. [localhost] TASK: Calculate the area of a circle (debug)> task_vars['pi']=3.1415926535 
  14. [localhost] TASK: Calculate the area of a circle (debug)> task_vars['radius']=5.3 
  15. [localhost] TASK: Calculate the area of a circle (debug)> p task_vars['radius'
  16.  
  17. 5.3 
  18.  
  19. [localhost] TASK: Calculate the area of a circle (debug)> task_vars['pi']=3.1415926535 
  20. [localhost] TASK: Calculate the area of a circle (debug)> redo 
  21. ok: [localhost] => { 
  22.     "msg": [ 
  23.         "Radius............: 5.3"
  24.         "pi................: 3.1415926535"
  25.         "Area of the circle: 88.247337636815" 
  26.     ] 
  27. PLAY RECAP  
  28. *************************************************************************** 
  29. localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0   

這里發(fā)生了什么:

1. 起初,任務(wù)失敗,抱怨是非int變量。

2. 調(diào)試器被調(diào)用。

3. 我使用了 print (p) 命令來(lái)顯示變量的值。

4. 在這種情況下,我知道問(wèn)題出在數(shù)據(jù)類(lèi)型上,但有人可能認(rèn)為值是正確的(如果不注意值兩邊的引號(hào))。

5. 后來(lái),我更新了變量的內(nèi)容,為它們賦予了數(shù)字。

6. 然后,我使用redo命令用新值重新執(zhí)行任務(wù),結(jié)果成功完成。

這是簡(jiǎn)單的場(chǎng)景,因?yàn)槲覀冎罌](méi)人會(huì)真正使用Ansible來(lái)計(jì)算圓的面積。但在較復(fù)雜的情況下,在長(zhǎng)時(shí)間的劇本執(zhí)行過(guò)程中找到變量的內(nèi)容可能很有用,無(wú)需從頭開(kāi)始就能在此后繼續(xù)下去。

原文標(biāo)題:6 troubleshooting skills for Ansible playbooks,作者:Roberto Nozaki

【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】

 

責(zé)任編輯:華軒 來(lái)源: 51CTO
相關(guān)推薦

2021-03-02 06:32:03

Ansible系統(tǒng)運(yùn)維

2021-01-24 16:00:22

Ansible系統(tǒng)運(yùn)維

2020-10-15 15:09:27

Seaborn圖表數(shù)據(jù)集

2021-01-08 10:32:42

項(xiàng)目預(yù)算項(xiàng)目經(jīng)理

2021-07-14 13:50:51

Linux命令文件

2015-10-09 08:48:11

javascript思維技巧

2018-09-04 14:53:19

VMware技巧SSH

2017-09-14 12:45:35

2018-12-26 09:00:00

2014-11-24 09:39:26

docker云計(jì)算

2017-10-30 17:25:11

javascript

2015-10-09 09:33:50

JavaScript思維技巧

2020-05-27 11:25:48

開(kāi)發(fā)技能代碼

2021-02-03 10:46:31

SQL數(shù)據(jù)庫(kù)技巧

2015-10-30 09:49:30

2021-01-14 10:45:12

網(wǎng)絡(luò)安全網(wǎng)絡(luò)犯罪網(wǎng)絡(luò)攻擊

2021-03-12 10:01:33

Sudo命令Linux

2019-06-20 05:47:25

云計(jì)算成本IT

2020-02-20 22:36:54

物聯(lián)網(wǎng)項(xiàng)目物聯(lián)網(wǎng)IOT

2020-06-03 09:08:21

JavaScript開(kāi)發(fā)代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)