Ansible循環(loop)
有時您想重復執行多次任務。在計算機編程中,這稱為循環。常見的Ansible循環包括使用文件模塊更改多個文件和/或目錄的所有權,使用用戶模塊創建多個用戶以及重復輪詢步驟直到達到特定結果。Ansible提供了兩個用於創建循環的關鍵字:loop和with_
注意:目前ansible2.5中,我們習慣於用loop替代with_*
循環方式
簡單遍歷
重復的任務可以作為標准循環寫在簡單的字符串列表上。可以直接在任務中定義列表
被控機上有3個用戶。想利用循環刪除這 3個用戶
[root@localhost ~]# id test1
uid=1001(test1) gid=1001(test1) groups=1001(test1)
[root@localhost ~]# id test2
uid=1002(test2) gid=1002(test2) groups=1002(test2),10(wheel)
[root@localhost ~]# id test3
uid=1003(test3) gid=1003(test3) groups=1003(test3),0(root)
[root@localhost project]# vim ceshi2.yml
---
- name: test
hosts: 192.168.190.134
tasks:
- name: delete user
user:
name: "{{ item }}" 調用循環變量。代表loop下面的循環體
state: absent
loop:
- test1 創建3個列表。用來代表循環體
- test2
- test3
changed: [192.168.190.134] => (item=test1)
changed: [192.168.190.134] => (item=test2)
changed: [192.168.190.134] => (item=test3)
......
同時也可以利用變量來作為循環體
[root@localhost project]# !vim
vim ceshi2.yml
---
- name: test
hosts: 192.168.190.134
vars:
test_name: 定義變量
- test1
- test2
- test3
tasks:
- name: delete user
user:
name: "{{ item }}"
state: present
loop: "{{ test_name }}" 調用變量
changed: [192.168.190.134] => (item=test1)
changed: [192.168.190.134] => (item=test2)
changed: [192.168.190.134] => (item=test3)
哈希表遍歷
[root@localhost project]# !vim
vim ceshi2.yml
---
- name: test
hosts: 192.168.190.134
tasks:
- name: delete user
user:
name: "{{ item.name }}" 引用哈希表中子項
groups: "{{ item.groups }}"
state: present
loop:
- name: test1
groups: root
- name: test2
groups: test1
changed: [192.168.190.134] => (item={'name': 'test1', 'groups': 'root'})
changed: [192.168.190.134] => (item={'name': 'test2', 'groups': 'test1'})
注冊變量與loop
---
- name: test
hosts: 192.168.190.134
gather_facts: no
tasks:
- name: delete user
shell: echo '{{ item }}'
loop:
- one
- two
register: result
- name: print
debug:
msg: "{{ result.results }}"
ansible_facts": {
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"ansible_loop_var": "item",
"changed": true,
"cmd": "echo 'one'",
"delta": "0:00:00.003743",
"end": "2020-09-06 11:27:13.127451",
"failed": false,
"invocation": {
......
Ansible條件判斷(when)
條件判斷:
when的值是一個條件表達式,如果條件判斷成立,這個task就執行,如果判斷不成立,則task不執行
常見判斷符號
符號 | 說明 |
---|---|
== | 比較兩個對象是否相等,相等為真 |
=! | 比較兩個對象是否不等,不等為真 |
> | 比較兩個值的大小,如果左邊的值大於右邊的值,則為真 |
< | 比較兩個值的大小,如果左邊的值小於右邊的值,則為真 |
>= | 比較兩個值的大小,如果左邊的值大於右邊的值或左右相等,則為真 |
<= | 比較兩個值的大小,如果左邊的值小於右邊的值或左右相等,則為真 |
and | 邏輯與,當左邊與右邊同時為真,則返回真 |
or | 邏輯或,當左邊與右邊有任意一個為真,則返回真 |
not | 取反 |
is defined | 變量被定義且存在 |
is not defined | 變量不存在 |
簡單判斷
例:
- 被控機必須是RedHat系統
- 被控及版本號必須為8.1
[root@localhost project]# vim ceshi1.yml
---
- hosts: test_group
tasks:
- name: when
shell: echo 'hellp world'
when:
- ansible_facts.distribution == 'RedHat'
- ansible_facts.distribution_version == '8.1'
register: result
- debug:
var: result.stdout_lines
changed: [192.168.190.134]
changed: [192.168.190.133]
ok: [192.168.190.133] => {
"result.stdout_lines": [
"hellp world" 兩台主機成功打印
]
}
ok: [192.168.190.134] => {
"result.stdout_lines": [
"hellp world"
]
}
組合判斷
when 后加>,可以多行編輯
---
- hosts: test_group
tasks:
- name: when
shell: echo 'hellp world'
when: >
(ansible_facts.distribution == 'RedHat' and ansible_facts.distribution_version == '8.1')
or
(ansible_facts.distribution == 'CentOS' and ansible_facts.distribution_version == '7.1')
register: result
- debug:
var: result.stdout_lines
示例
刪除test1用戶,如果change值為true則證明成功執行,否則失敗。且需要打印信息
注意:ignore_errors"表示即使當前task執行報錯,ansible也會忽略這個錯誤,繼續執行playbook
---
- name: 測試
hosts: test_group
tasks:
- name: delete user test1
user:
name: test1
state: absent
register: result
ignore_errors: yes 執行錯誤,play繼續。
- debug:
msg: "命令運行成功"
when:
result.changed == True
- debug:
msg: "命令運行失敗"
when:
result.changed != True
134主機上有test1,但是133主機上沒有test1,所以134執行成功,但是133執行失敗。
TASK [debug] *******************************************************************************************
skipping: [192.168.190.133]
ok: [192.168.190.134] => {
"msg": "命令運行成功"
}
TASK [debug] *******************************************************************************************
ok: [192.168.190.133] => {
"msg": "命令運行失敗"
}
skipping: [192.168.190.134]