事实、循环、条件判断
文章目錄
- 事實、循環、條件判斷
- 1.描述Ansible事實
- 2.ansible事實作為變量注入
- 3.關閉事實收集
- 4.創建自定義事實
- 5.魔法變量
- 6.利用循環迭代任務
- 7.循環散列或字典列表
- 8.較早樣式的循環關鍵字
- 9.將register變量與loop一起使用
- 10.有條件的運行任務
事實、循環、條件判斷
1.描述Ansible事實
? Ansible事實是Ansible在受管主機上自動檢測到的變量。事實中包含有與主機相關的信息,可以像play中的常規變量、條件、循環或依賴于從受管主機收集的值的任何其他語句那樣使用。
? 為受管主機收集的一些事實可能包括:
- 主機名稱
- 內核版本
- 網絡接口
- IP地址
- 操作系統版本
- 各種環境變量
- CPU數量
- 提供的或可用的內存
- 可用磁盤空間
借助事實,可以方便地檢索受管主機的狀態,并根據該狀態確定要執行的操作。例如:
- 可以根據含有受管主機當前內核版本的事實運行條件任務,以此來重啟服務器
- 可以根據通過事實報告的可用內存來自定義MySQL配置文件
- 可以根據事實的值設置配置文件中使用的IPv4地址
通常,每個play在執行第一個任務之前會先自動運行setup模塊來收集事實。
? 查看為受管主機收集的事實的一種方式是,運行一個收集事實并使用debug模塊顯示ansible_facts變量值的簡短playbook。
我們用模塊獲取對面的事實。
[root@node1 ansible]# ansible 192.168.100.147 -m setup 192.168.100.147 | SUCCESS => {"ansible_facts": {"ansible_all_ipv4_addresses": ["192.168.100.147"],"ansible_all_ipv6_addresses": ["fe80::79b2:48d0:db63:ff3e"],"ansible_apparmor": {"status": "disabled"},"ansible_architecture": "x86_64","ansible_bios_date": "07/22/2020","ansible_bios_version": "6.00","ansible_cmdline": {"BOOT_IMAGE": "(hd0,msdos1)/vmlinuz-4.18.0-257.el8.x86_64", 此內容省略。。。。。。我們直接獲取對面全部內容,內容可能很多, 這個時候我們可以只查看前面的內容
[root@node1 ansible]# ansible 192.168.100.147 -m setup|less我們用playbook獲取對面的事實
[root@node1 ansible]# cat test.yml //如果需要獲取對面全是的事實playbook入下 --- - hosts: 192.168.100.147tasks: - name: ansible_factsdebug: var: ansible_facts[root@node1 ansible]# [root@node1 ansible]# ansible-playbook test1/test.yml PLAY [192.168.100.147] *********************************************************************************************TASK [Gathering Facts] ********************************************************************************************* ok: [192.168.100.147]TASK [print all facts] ********************************************************************************************* ok: [192.168.100.147] => {"ansible_facts": {"all_ipv4_addresses": ["192.168.100.147"],"all_ipv6_addresses": ["fe80::79b2:48d0:db63:ff3e"],"ansible_local": {}, 此處內容省略。。。。。。我們也可以獲取指定的事實內容,比如我們獲取對面的IP地址
[root@node1 ansible]# cat test1/test.yml //playbook內容寫法 --- - hosts: '192.168.100.147'tasks: - name: print all factsdebug: var: ansible_facts['default_ipv4']['address'][root@node1 ansible]# [root@node1 ansible]# ansible-playbook test1/test.yml //公告獲取到對面的IPPLAY [192.168.100.147] *********************************************************************************************TASK [Gathering Facts] ********************************************************************************************* ok: [192.168.100.147]TASK [print all facts] ********************************************************************************************* ok: [192.168.100.147] => {"ansible_facts['default_ipv4']['address']": "192.168.100.147" }PLAY RECAP ********************************************************************************************************* 192.168.100.147 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [root@node1 ansible]#獲取指定內容,還有簡便的寫法
[root@node1 ansible]# cat test1/test.yml --- - hosts: '192.168.100.147'tasks: - name: print all factsdebug: var: ansible_facts.default_ipv4.address //這里我們用點代表,[root@node1 ansible]#Playbook以JSON格式顯示ansible_facts變量的內容。
下表顯示了可能從受管節點收集的并可在playbook中使用的一些事實:
| 短主機名 | ansible_facts[‘hostname’] |
| 完全限定域名 | ansible_facts[‘fqdn’] |
| IPv4地址 | ansible_facts[‘default_ipv4’][‘address’] |
| 所有網絡接口的名稱列表 | ansible_facts[‘interfaces’] |
| /dev/vda1磁盤分區的大小 | ansible_facts[‘devices’][‘vda’][‘partitions’][‘vda1’][‘size’] |
| DNS服務器列表 | ansible_facts[‘dns’][‘nameservers’] |
| 當前運行的內核版本 | ansible_facts[‘kernel’] |
如果變量的值為散列/字典類型,則可使用兩種語法來獲取其值。比如:
- ansible_facts[‘default_ipv4’][‘address’]也可以寫成ansible_facts.default_ipv4.address
- ansible_facts[‘dns’][‘nameservers’]也可以寫成ansible_facts.dns.nameservers //這種方法雖然簡便,但是不推薦使用,因為可能會和python中的某些函數會沖突,所以不建議使用。
注:msg能在之前的變量上面去加東西
在playbook中使用事實時,Ansible將事實的變量名動態替換為對應的值:
[root@node1 ansible]# cat test1/test.yml --- - hosts: '192.168.100.147'tasks: - name: testdebug: msg: > //在這里的意思是打印一行的內容出來,為了美觀所以我們可以換行寫The host named {{ ansible_facts['fqdn'] }} of ip is{{ ansible_facts['default_ipv4']['address'] }}[root@node1 ansible]# [root@node1 ansible]# ansible-playbook test1/test.yml PLAY [192.168.100.147] *********************************************************************************************TASK [Gathering Facts] ********************************************************************************************* ok: [192.168.100.147]TASK [test] ******************************************************************************************************** ok: [192.168.100.147] => {"msg": "The host named node2 of ip is 192.168.100.147\n" //ip已經出來了 }PLAY RECAP ********************************************************************************************************* 192.168.100.147 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=02.ansible事實作為變量注入
? 在Ansible2.5之前,事實是作為前綴為字符串ansible_的單個變量注入,而不是作為ansible_facts變量的一部分注入。例如,ansible_facts[‘distribution’]事實會被稱為ansible_distribution。
? 許多較舊的playbook仍然使用作為變量注入的事實,而不是在ansible_facts變量下創建命名空間的新語法。我們可以使用臨時命令來運行setup模塊,以此形式顯示所有事實的值。以下示例中使用一個臨時命令在受管主機192.168.100.147上運行setup模塊:
ansible 172.16.103.129 -m setup //這也就是我們上面第一條獲取對面事實的命令ansible事實名稱比較
| ansible_facts[‘hostname’] | ansible_hostname |
| ansible_facts[‘fqdn’] | ansible_fqdn |
| ansible_facts[‘default_ipv4’][‘address’] | ansible_default_ipv4[‘address’] |
| ansible_facts[‘interfaces’] | ansible_interfaces |
| ansible_facts[‘devices’][‘vda’][‘partitions’][‘vda1’][‘size’] | ansible_devices[‘vda’][‘partitions’][‘vda1’][‘size’] |
| ansible_facts[‘dns’][‘nameservers’] | ansible_dns[‘nameservers’] |
| ansible_facts[‘kernel’] | ansible_kernel |
? 目前,Ansible同時識別新的事實命名系統(使用ansible_facts)和舊的2.5前“作為單獨變量注入的事實”命名系統。
? 將Ansible配置文件的**[default]部分中inject_facts_as_vars參數設置為False**,可關閉舊命名系統。默認設置目前為True。
[root@node1 ansible]# vim ansible.cfg //進入配置文件# inject_facts_as_vars = True //改為false就可以執行舊命令了,記得取消注釋? inject_facts_as_vars的默認值在Ansible的未來版本中可能會更改為False。如果設置為False,則只能使用新的**ansible_facts.***命名系統引用Ansible事實。所以建議大家一開始就要適應這種方式。
3.關閉事實收集
有時我們不想為play收集事實。這樣做的原因可能有:
- 不準備使用任何事實
- 希望加快play速度
- 希望減小play在受管主機上造成的負載
- 受管主機因為某種原因無法運行setup模塊
- 需要安裝一些必備軟件后再收集事實
以上種種原因導致我們可能想要永久或暫時關閉事實收集的功能,要為play禁用事實收集功能,可將gather_facts關鍵字設置為no:
[root@node1 ansible]# cat test1/test.yml --- - hosts: '192.168.100.147'gather_facts: no //如果我們不想獲取對面的事實, 那么我們就要關閉掉。tasks: - name: testdebug: msg: >The host named {{ ansible_facts['fqdn'] }} of ip is{{ ansible_facts['default_ipv4']['address'] }}[root@node1 ansible]#即使play設置了gather_facts: no,也可以隨時通過運行使用setup模塊的任務來手動收集事實:
[root@node1 ansible]# cat test1/test.yml --- - hosts: '192.168.100.147'gather_facts: no tasks: - name: testsetup: - name: debugdebug: var: ansible_facts[root@node1 ansible]#4.創建自定義事實
? 除了使用系統捕獲的事實外,我們還可以自定義事實,并將其本地存儲在每個受管主機上。這些事實整合到setup模塊在受管主機上運行時收集的標準事實列表中。它們讓受管主機能夠向Ansible提供任意變量,以用于調整play的行為。
? 自定義事實可以在靜態文件中定義,格式可為INI文件或采用JSON。它們也可以是生成JSON輸出的可執行腳本,如同動態清單腳本一樣。
? 有了自定義事實,我們可以為受管主機定義特定的值,供play用于填充配置文件或有條件地運行任務。動態自定義事實允許在play運行時以編程方式確定這些事實的值,甚至還可以確定提供哪些事實。
? 默認情況下,setup模塊從各受管主機的**/etc/ansible/facts.d目錄下的文件和腳本中加載自定義事實。各個文件或腳本的名稱必須以.fact**結尾才能被使用。動態自定義事實腳本必須輸出JSON格式的事實,而且必須是可執行文件。
? 以下是采用INI格式編寫的靜態自定義事實文件。INI格式的自定義事實文件包含由一個部分定義的頂層值,后跟用于待定義的事實的鍵值對:
[packages] //這個配置文件要在受管主機上寫入 web_package = httpd db_package = mariadb-server[users] user1 = joe user2 = jane? 同樣的事實可能以JSON格式提供。以下JSON事實等同于以上示例中INI格式指定的事實。JSON數據可以存儲在靜態文本文件中,或者通過可執行腳本輸出到標準輸出:
{"packages": {"web_package": "httpd","db_package": "mariadb-server"},"users": {"user1": "joe","user2": "jane"} }注意:
自定義事實文件不能采用playbook那樣的YAML格式。JSON格式是最為接近的等效格式。
自定義事實由setup模塊存儲在ansible_facts.ansible_local變量中。
事實按照定義它們的文件的名稱來整理。例如,假設前面的自定義事實由受管主機上保存為**/etc/ansible/facts.d/custom.fact**的文件生成。在這種情況下,
ansible_facts.ansible_local[‘custom’][‘users’][‘user1’]的值為joe。
可以利用臨時命令在受管主機上運行setup模塊來檢查自定義事實的結構。
[root@node1 ansible]# ansible 192.168.100.147 -m setup|less //執行之后我們在下面搜索local和packages,我們發現有這兩個東西,也就是我們剛剛上面再受管主機寫的東西。"ansible_local": {"custom": {"packages": {"db_package": "mariadb-server","web_package": "httpd""packages": {"db_package": "mariadb-server","web_package": "httpd"注意:自定義事實的使用方式與playbook中的默認事實相同:
--- - hosts: alltasks:- name: Prints various Ansible factsdebug:msg: >The package to install on {{ ansible_facts['fqdn'] }}is {{ ansible_facts['ansible_local']['cutstom']['packages']['web_package'] }}5.魔法變量
一些變量并非事實或通過setup模塊配置,但也由Ansible自動設置。這些魔法變量也可用于獲取與特定受管主機相關的信息。
最常用的有四個:
| hostvars | 包含受管主機的變量,可以用于獲取另一臺受管主機的變量的值。 如果還沒有為受管主機收集事實,則它不會包含該主機的事實。 |
| group_names | 列出當前受管主機所屬的所有組 |
| groups | 列出清單中的所有組和主機 |
| inventory_hostname | 包含清單中配置的當前受管主機的主機名稱。 因為各種原因有可能與事實報告的主機名稱不同 |
? 另外還有許多其他的“魔法變量”。有關更多信息,請參見以下鏈接:
https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable。
若要深入了解它們的值,一個途徑是使用debug模塊報告特定主機的hostvars變量的內容:
ansible 172.16.103.129 -m debug -a 'var=hostvars["localhost"]'6.利用循環迭代任務
通過利用循環,我們無需編寫多個使用同一模塊的任務。例如,他們不必編寫五個任務來確保存在五個用戶,而是只需編寫一個任務來對含有五個用戶的列表迭代,從而確保它們都存在。
Ansible支持使用loop關鍵字對一組項目迭代任務。可以配置循環以利用列表中的各個項目、列表中各個文件的內容、生成的數字序列或更為復雜的結構來重復任務。
簡單循環對一組項目迭代任務。loop關鍵字添加到任務中,將應對其迭代任務的項目列表取為值。循環變量item保存每個迭代過程中使用的值。
請思考以下代碼片段,它使用兩次service模塊來確保兩個網絡服務處于運行狀態:
- name: Postfix is runningservice:name: postfixstate: started- name: Devecot is runningservice:name: dovecotstate: started //利用兩次來確保這個服務啟動,顯得多此一舉,我們可以用更簡潔的方法這兩個任務可以重新編寫為使用一個簡單循環,從而只需一個任務來確保兩個服務都在運行:
- name: serviceservice:name: "{{ item }}"state: startedloop:- postfix- dovecot例子:
如果我們想創建多個用戶,比如十個,百個,我們可以利用循環來創建,代碼如下:
[root@node1 ansible]# cat test1/test.yml //這里比如我們創建五個用戶shen --- - hosts: 192.168.100.147tasks: - name: create useruser: name: '{{item}}'state: presentloop: - shen1- shen2- shen3- shen4- shen5 [root@node1 ansible]# [root@node1 ansible]# ansible-playbook test1/test.yml //下面可以看見,我們創建成功,此時受管主機應該是由我們五個用戶的PLAY [192.168.100.147] *******************************************************************************************TASK [Gathering Facts] ******************************************************************************************* ok: [192.168.100.147]TASK [create user] *********************************************************************************************** changed: [192.168.100.147] => (item=shen1) changed: [192.168.100.147] => (item=shen2) changed: [192.168.100.147] => (item=shen3) changed: [192.168.100.147] => (item=shen4) changed: [192.168.100.147] => (item=shen5)PLAY RECAP ******************************************************************************************************* 192.168.100.147 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [root@node1 ansible]# [root@node2 ~]# id shen1 //受管主機有這五個用戶 uid=1002(shen1) gid=1002(shen1) 組=1002(shen1) [root@node2 ~]# id shen2 uid=1003(shen2) gid=1003(shen2) 組=1003(shen2) [root@node2 ~]# id shen3 uid=1004(shen3) gid=1004(shen3) 組=1004(shen3) [root@node2 ~]# id shen4 uid=1005(shen4) gid=1005(shen4) 組=1005(shen4) [root@node2 ~]# id shen5 uid=1006(shen5) gid=1006(shen5) 組=1006(shen5) [root@node2 ~]#? 可以通過一個變量提供loop所使用的列表。在以下示例中,變量mail_services含有需要處于運行狀態的服務的列表。
用變量來做
[root@node1 node]# cat llll.yml //創建一個文件,寫上這些內容 users: - shen6- shen7- shen8- shen9- shen10 [root@node1 node]# [root@node1 ansible]# cat test.yml //如果我們利用變量, 那我們就這樣寫 --- - hosts: 192.168.100.147vars_files: node/llll.ymltasks: - name: create useruser: name: '{{item}}'state: presentloop: '{{users}}' [root@node1 ansible]#[root@node1 ansible]# ansible-playbook test.yml //執行成功PLAY [192.168.100.147] *********************************************************************************************TASK [Gathering Facts] ********************************************************************************************* ok: [192.168.100.147]TASK [create user] ************************************************************************************************* changed: [192.168.100.147] => (item=shen6) changed: [192.168.100.147] => (item=shen7) changed: [192.168.100.147] => (item=shen8) changed: [192.168.100.147] => (item=shen9) changed: [192.168.100.147] => (item=shen10)PLAY RECAP ********************************************************************************************************* 192.168.100.147 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=07.循環散列或字典列表
? loop列表不需要是簡單值列表。在以下示例中,列表中的每個項實際上是散列或字典。示例中的每個散列或字典具有兩個鍵,即name和groups,當前item循環變量中每個鍵的值可以分別通過item.name和item.groups變量來檢索。
[root@node1 node]# vim llll.yml //現在我們來換一種寫法 [root@node1 node]# cat llll.yml users: - name: shen1uid: 2000- name: shen2uid: 3000- name: shen3uid: 4000- name: shen4uid: 5000 [root@node1 node]# [root@node1 ansible]# cat test.yml //注意執行文件的寫法 --- - hosts: 192.168.100.147vars_files: node/llll.ymltasks: - name: create useruser: name: '{{item.name}}' //uid: '{{item.uid}}'state: presentloop: '{{users}}' [root@node1 ansible]# [root@node1 ansible]# ansible-playbook test.yml //執行成功PLAY [192.168.100.147] *********************************************************************************************TASK [Gathering Facts] ********************************************************************************************* ok: [192.168.100.147]TASK [create user] ************************************************************************************************* changed: [192.168.100.147] => (item={'name': 'shen1', 'uid': 2000}) changed: [192.168.100.147] => (item={'name': 'shen2', 'uid': 3000}) changed: [192.168.100.147] => (item={'name': 'shen3', 'uid': 4000}) changed: [192.168.100.147] => (item={'name': 'shen4', 'uid': 5000})PLAY RECAP ********************************************************************************************************* 192.168.100.147 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [root@node1 ansible]# [root@node2 ~]# id shen1 //可以看見他的uid已經改變了 uid=2000(shen1) gid=1002(shen1) 組=1002(shen1) [root@node2 ~]# id shen2 uid=3000(shen2) gid=1003(shen2) 組=1003(shen2) [root@node2 ~]# id shen3 uid=4000(shen3) gid=1004(shen3) 組=1004(shen3) [root@node2 ~]# id shen4 uid=5000(shen4) gid=1005(shen4) 組=1005(shen4) [root@node2 ~]#8.較早樣式的循環關鍵字
? 在Ansible2.5之前,大多數playbook使用不同的循環語法。提供了多個循環關鍵字,前綴為whth_,后面跟Ansible查找插件的名稱。這種循環語法在現有playbook中很常見,但在將來的某個時候可能會被棄用。
較早樣式的Ansible循環
| with_items | 行為與簡單列表的loop關鍵字相同,例如字符串列表或散列/字典列表。 但與loop不同的是,如果為with_items提供了列表的列表, 它們將被扁平化為單級列表。循環變量item保存每次迭代過程中使用的列表項。 |
| with_file | 此關鍵字需要控制節點文件名列表。循環變量item在每次迭代過程中保存文件列表中相應文件的內容。 |
| with_sequence | 此關鍵字不需要列表,而是需要參數來根據數字序列生成值列表。 循環變量item在每次迭代過程中保存生成的序列中的一個生成項的值。 |
playbook中的with_items的示例如下所示:
vars:data:- user0- user1- user2 tasks:- name: "with_items"debug:msg: "{{ item }}"with_items: "{{ data }}"從Ansible2.5開始,建議使用loop關鍵字編寫循環。
9.將register變量與loop一起使用
? register關鍵字也可以捕獲循環任務的輸出。以下代碼片段顯示了循環任務中register變量的結構:
[root@node1 ansible]# cat test.yml --- - hosts: 192.168.100.147tasks: - name: testcommand: "echo shunzi {{item}},ni xi huan chi shi" loop:- shen1- shen2- shen3register: result- debug: var: result[root@node1 ansible]# [root@node1 ansible]# ansible-playbook test.yml //執行成功,我們可以發現他給我指定的用戶打招呼的內容PLAY [192.168.100.147] *******************************************************************************************TASK [Gathering Facts] ******************************************************************************************* ok: [192.168.100.147]TASK [test] ****************************************************************************************************** changed: [192.168.100.147] => (item=shen1) changed: [192.168.100.147] => (item=shen2) changed: [192.168.100.147] => (item=shen3)TASK [debug] ***************************************************************************************************** ok: [192.168.100.147] => {"result": {"changed": true,"msg": "All items completed","results": [{"ansible_loop_var": "item","changed": true,"cmd": ["echo","shunzi","shen1,ni","xi","huan","chi","shi"],"delta": "0:00:00.006161","end": "2021-07-25 07:09:28.296358","failed": false,"invocation": {"module_args": {"_raw_params": "echo shunzi shen1,ni xi huan chi shi","_uses_shell": false,"argv": null,"chdir": null,"creates": null,"executable": null,"removes": null,"stdin": null,"stdin_add_newline": true,"strip_empty_ends": true,"warn": true}},"item": "shen1","rc": 0,"start": "2021-07-25 07:09:28.290197","stderr": "","stderr_lines": [],"stdout": "shunzi shen1,ni xi huan chi shi","stdout_lines": ["shunzi shen1,ni xi huan chi shi"]},{"ansible_loop_var": "item","changed": true,"cmd": ["echo","shunzi","shen2,ni","xi","huan","chi","shi"],"delta": "0:00:00.002744","end": "2021-07-25 07:09:28.647163","failed": false,"invocation": {"module_args": {"_raw_params": "echo shunzi shen2,ni xi huan chi shi","_uses_shell": false,"argv": null,"chdir": null,"creates": null,"executable": null,"removes": null,"stdin": null,"stdin_add_newline": true,"strip_empty_ends": true,"warn": true}},"item": "shen2","rc": 0,"start": "2021-07-25 07:09:28.644419","stderr": "","stderr_lines": [],"stdout": "shunzi shen2,ni xi huan chi shi","stdout_lines": ["shunzi shen2,ni xi huan chi shi"]},{"ansible_loop_var": "item","changed": true,"cmd": ["echo","shunzi","shen3,ni","xi","huan","chi","shi"],"delta": "0:00:00.003040","end": "2021-07-25 07:09:28.977042","failed": false,"invocation": {"module_args": {"_raw_params": "echo shunzi shen3,ni xi huan chi shi","_uses_shell": false,"argv": null,"chdir": null,"creates": null,"executable": null,"removes": null,"stdin": null,"stdin_add_newline": true,"strip_empty_ends": true,"warn": true}},"item": "shen3","rc": 0,"start": "2021-07-25 07:09:28.974002","stderr": "","stderr_lines": [],"stdout": "shunzi shen3,ni xi huan chi shi","stdout_lines": ["shunzi shen3,ni xi huan chi shi"]}]} }PLAY RECAP ******************************************************************************************************* 192.168.100.147 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [root@node1 ansible]#在上面的例子中,results鍵包含一個列表。在下面,修改了playbook,使第二個任務迭代此列表:
[root@node1 ansible]# cat test.yml --- - hosts: 192.168.100.147tasks: - name: testcommand: "echo shunzi {{item}},ni xi huan chi shi" loop:- shen1- shen2- shen3register: result- debug: msg: "STDOUT from previous task: {{ item.stdout }}"loop: "{{ echo_results['results'] }}"[root@node1 ansible]#10.有條件的運行任務
Ansible可使用conditionals在符合特定條件時執行任務或play。例如,可以利用一個條件在Ansible安裝或配置服務前確定受管主機上的可用內存。
我們可以利用條件來區分不同的受管主機,并根據它們所符合的條件來分配功能角色。Playbook變量、注冊的變量和Ansible事實都可通過條件來進行測試。可以使用比較字符串、數字數據和布爾值的運算符。
== < > <= >=以下場景說明了在Ansible中使用條件的情況
- 可以在變量中定義硬限制(如min_memory)并將它與受管主機上的可用內存進行比較。
- Ansible可以捕獲并評估命令的輸出,以確定某一任務在執行進一步操作前是否已經完成。例如,如果某一程序失敗,則將路過批處理。
- 可以利用Ansible事實來確定受管主機網絡配置,并決定要發送的模板文件(如,網絡綁定或中繼)。
- 可以評估CPU的數量,來確定如何正確調節某一Web服務器。
- 將注冊的變量與預定義的變量進行比較,以確定服務是否已更改。例如,測試服務配置文件的MD5檢驗以和查看服務是否已更改。
when語句用于有條件地運行任務。它取要測試的條件為值。如果條件滿足,則運行任務。如果條件不滿足,則跳過任務。
可以測試的一個最簡單條件是某一布爾變量是True還是False。以下示例中的when語句導致任務僅在run_my_task為True時運行:
[root@node1 ansible]# cat test.yml --- - name: testhosts: 192.168.100.147vars_files:node/llll.ymlvars: power: true //給一個判斷 tasks: - name: create useruser:name: "{{ item.name}}"uid: "{{item.uid}}"state: absentloop: "{{users}}"when: power [root@node1 ansible]# [root@node1 ansible]# ansible-playbook test.yml //執行成功PLAY [test] ******************************************************************************************************TASK [Gathering Facts] ******************************************************************************************* ok: [192.168.100.147]TASK [create user] *********************************************************************************************** changed: [192.168.100.147] => (item={'name': 'shen1', 'uid': 2000}) changed: [192.168.100.147] => (item={'name': 'shen2', 'uid': 3000}) changed: [192.168.100.147] => (item={'name': 'shen3', 'uid': 4000}) changed: [192.168.100.147] => (item={'name': 'shen4', 'uid': 5000})PLAY RECAP ******************************************************************************************************* 192.168.100.147 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0? 以下示例測試my_service變量是否具有值。若有值,則將my_service的值用作要安裝的軟件包的名稱。如果未定義my_service變量,則跳過任務且不顯示錯誤。
[root@node1 ansible]# cat test.yml --- - name: testhosts: 192.168.100.147vars_files:node/llll.yml tasks: - name: create useruser:name: "{{ item.name}}"uid: "{{item.uid}}"state: presentloop: "{{users}}"when: '"{{ item.name }}" == "{{ shen3}}"' [root@node1 ansible]#下表顯示了在處理條件時可使用的一些運算:
| 等于(值為字符串) | ansible_machine == “x86_64” |
| 等于(值為數字) | max_memory == 512 |
| 小于 | min_memory < 128 |
| 大于 | min_memory > 256 |
| 小于等于 | min_memory <= 256 |
| 大于等于 | min_memory >= 512 |
| 不等于 | min_memory != 512 |
| 變量存在 | min_memory is defined |
| 變量不存在 | min_memory is not defined |
| 布爾變量是True。1、True或yes的求值為True | memory_available |
| 布爾變量是False。0、False或no的求值為False | not memory_available |
| 第一個變量的值存在,作為第二個變量的列表中的值 | ansible_distribution in supported_distros |
總結
以上是生活随笔為你收集整理的事实、循环、条件判断的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机卡顿是硬盘还是内存条,笔记本电脑升
- 下一篇: 「JLOI2015」战争调度 解题报告