前言
通过利用循环,管理员无需编写多个使用同一模块的任务。例如,他们不必编写五个任务来确保存在五个用户,而是只需编写一个任务来对含有五个用户的列表迭代,从而确保他们都存在
Ansible 支持使用 loop 关键字对一组项目迭代任务。我们可以配置循环以利用列表中的各个项目、列表中的各个文件的内容、生成的数字序列或更为复杂任务
提示:本篇文章所使用的环境为centos-8.2基于ansible-2.8.0 搭建
具体环境搭建,请参考:ansible-2.8.0 搭建链接
一、简单循环
读取并打印用户列表中用户名
#编辑play-book文件
[root@Ansible-Server ansible]# vim da1.yml
---
- hosts: all
tasks:
- name: print users name
debug:
msg: '{{ item }}'
loop:
- tom
- bob
- alice
#检查语法
[root@Ansible-Server ansible]# ansible-playbook da1.yml --syntax-check
playbook: da1.yml
#执行play-book
[root@Ansible-Server ansible]# ansible-playbook da1.yml
PLAY [all] *********************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************
ok: [node03]
ok: [node01]
ok: [node04]
ok: [node02]
TASK [print users name] ********************************************************************************************
ok: [node01] => (item=tom) => {
"msg": "tom"
}
ok: [node01] => (item=bob) => {
"msg": "bob"
}
ok: [node01] => (item=alice) => {
"msg": "alice"
}
ok: [node02] => (item=tom) => {
"msg": "tom"
}
ok: [node02] => (item=bob) => {
"msg": "bob"
}
ok: [node02] => (item=alice) => {
"msg": "alice"
}
ok: [node03] => (item=tom) => {
"msg": "tom"
}
ok: [node03] => (item=bob) => {
"msg": "bob"
}
ok: [node03] => (item=alice) => {
"msg": "alice"
}
ok: [node04] => (item=tom) => {
"msg": "tom"
}
ok: [node04] => (item=bob) => {
"msg": "bob"
}
ok: [node04] => (item=alice) => {
"msg": "alice"
}
PLAY RECAP *********************************************************************************************************
node01 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node02 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node03 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node04 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
改写后执行
[root@Ansible-Server ansible]# vim da2.yml
---
- hosts: all
vars:
users:
- tom
- bob
- alice
tasks:
- name: print users name
debug:
msg: '{{ item }}'
loop: "{{ users }}"
[root@Ansible-Server ansible]# ansible-playbook da2.yml
PLAY [all] *********************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************
ok: [node04]
ok: [node02]
ok: [node01]
ok: [node03]
TASK [print users name] ********************************************************************************************
ok: [node01] => (item=tom) => {
"msg": "tom"
}
ok: [node01] => (item=bob) => {
"msg": "bob"
}
ok: [node01] => (item=alice) => {
"msg": "alice"
}
ok: [node02] => (item=tom) => {
"msg": "tom"
}
ok: [node02] => (item=bob) => {
"msg": "bob"
}
ok: [node02] => (item=alice) => {
"msg": "alice"
}
ok: [node03] => (item=tom) => {
"msg": "tom"
}
ok: [node03] => (item=bob) => {
"msg": "bob"
}
ok: [node03] => (item=alice) => {
"msg": "alice"
}
ok: [node04] => (item=tom) => {
"msg": "tom"
}
ok: [node04] => (item=bob) => {
"msg": "bob"
}
ok: [node04] => (item=alice) => {
"msg": "alice"
}
PLAY RECAP *********************************************************************************************************
node01 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node02 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node03 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node04 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
二、使用散列或字典列表循环
#编辑play-book
[root@Ansible-Server ansible]# vim loop1.yml
---
- hosts: all
tasks:
- name: create users
user:
name: "{{ item.name }}"
state: present
groups: "{{ item.group }}"
loop:
- name: jane
group: whell
- name: joe
group: root
#检查语法
[root@Ansible-Server ansible]# ansible-playbook loop1.yml --syntax-check
playbook: loop1.yml
#执行playbook
[root@Ansible-Server ansible]# ansible-playbook loop3.yml
PLAY [all] *********************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************
ok: [node04]
ok: [node01]
ok: [node02]
ok: [node03]
TASK [create users] ************************************************************************************************
changed: [node04] => (item={'name': 'jane', 'groups': 'teacher'})
changed: [node03] => (item={'name': 'jane', 'groups': 'teacher'})
ok: [node04] => (item={'name': 'joe', 'groups': 'student'})
changed: [node02] => (item={'name': 'jane', 'groups': 'teacher'})
changed: [node01] => (item={'name': 'jane', 'groups': 'teacher'})
changed: [node03] => (item={'name': 'joe', 'groups': 'student'})
changed: [node02] => (item={'name': 'joe', 'groups': 'student'})
changed: [node01] => (item={'name': 'joe', 'groups': 'student'})
PLAY RECAP *********************************************************************************************************
node01 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node02 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node03 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node04 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@Ansible-Server ansible]# vim loop3.yml
[root@Ansible-Server ansible]# ansible-playbook loop3.yml
PLAY [all] *********************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************
ok: [node03]
ok: [node02]
ok: [node04]
ok: [node01]
TASK [create users] ************************************************************************************************
ok: [node04] => (item={'name': 'jane', 'groups': 'teacher'})
ok: [node01] => (item={'name': 'jane', 'groups': 'teacher'})
ok: [node02] => (item={'name': 'jane', 'groups': 'teacher'})
ok: [node03] => (item={'name': 'jane', 'groups': 'teacher'})
ok: [node01] => (item={'name': 'joe', 'groups': 'student'})
ok: [node02] => (item={'name': 'joe', 'groups': 'student'})
ok: [node04] => (item={'name': 'joe', 'groups': 'student'})
ok: [node03] => (item={'name': 'joe', 'groups': 'student'})
PLAY RECAP *********************************************************************************************************
node01 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node02 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node03 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node04 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
改写后执行
[root@Ansible-Server ansible]# vim loop4.yml
---
- hosts: all
vars:
users:
- name: jane
groups: teacher
- name: joe
groups: student
tasks:
- name: create users
user:
name: "{{ item.name }}"
groups: "{{ item.groups }}"
state: present
loop: "{{ users }}"
[root@Ansible-Server ansible]# ansible-playbook loop4.yml
PLAY [all] *********************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************
ok: [node03]
ok: [node04]
ok: [node02]
ok: [node01]
TASK [create users] ************************************************************************************************
changed: [node02] => (item={'name': 'jane', 'groups': 'teacher'})
changed: [node04] => (item={'name': 'jane', 'groups': 'teacher'})
changed: [node03] => (item={'name': 'jane', 'groups': 'teacher'})
changed: [node01] => (item={'name': 'jane', 'groups': 'teacher'})
changed: [node03] => (item={'name': 'joe', 'groups': 'student'})
changed: [node01] => (item={'name': 'joe', 'groups': 'student'})
changed: [node02] => (item={'name': 'joe', 'groups': 'student'})
changed: [node04] => (item={'name': 'joe', 'groups': 'student'})
PLAY RECAP *********************************************************************************************************
node01 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node02 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node03 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node04 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
三、随机选择 Loops
随机从1–5挑选数字,进行打印
---
- hosts: all
tasks:
- name: debug loops
debug:
var: item
with_random_choice:
- 1
- 2
- 3
- 4
- 5
[root@Ansible-Server ansible]# ansible-playbook loop5.yml --syntax-check
playbook: loop5.yml
[root@Ansible-Server ansible]# ansible-playbook loop5.yml
PLAY [all] *********************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************
ok: [node03]
ok: [node02]
ok: [node04]
ok: [node01]
TASK [debug loops] *************************************************************************************************
ok: [node01] => (item=5) => {
"ansible_loop_var": "item",
"item": 5
}
ok: [node02] => (item=5) => {
"ansible_loop_var": "item",
"item": 5
}
ok: [node03] => (item=4) => {
"ansible_loop_var": "item",
"item": 4
}
ok: [node04] => (item=1) => {
"ansible_loop_var": "item",
"item": 1
}
PLAY RECAP *********************************************************************************************************
node01 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node02 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node03 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node04 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
改写后,运行
[root@Ansible-Server ansible]# vim loop6.yml
---
- hosts: all
vars:
lists:
- 1
- 2
- 3
- 4
- 5
tasks:
- name: debug loops
debug:
var: lists|random
[root@Ansible-Server ansible]# ansible-playbook loop6.yml --syntax-check
playbook: loop6.yml
[root@Ansible-Server ansible]# ansible-playbook loop6.yml
PLAY [all] *********************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************
ok: [node04]
ok: [node03]
ok: [node01]
ok: [node02]
TASK [debug loops] *************************************************************************************************
ok: [node01] => {
"lists|random": "5"
}
ok: [node02] => {
"lists|random": "2"
}
ok: [node03] => {
"lists|random": "5"
}
ok: [node04] => {
"lists|random": "5"
}
PLAY RECAP *********************************************************************************************************
node01 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node02 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node03 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
node04 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
四、register loops 共用
[root@Ansible-Server ansible]# vim loop7.yml
[root@Ansible-Server ansible]# ansible-playbook loop7.yml --syntax-check
playbook: loop7.yml
[root@Ansible-Server ansible]# ansible-playbook loop7.yml
PLAY [localhost] ***************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************
ok: [localhost]
TASK [debug loops] *************************************************************************************************
changed: [localhost] => (item=date)
changed: [localhost] => (item=hostname)
changed: [localhost] => (item=uname)
TASK [SYSTEM INFO LOOPS----------->] *******************************************************************************
ok: [localhost] => {
"msg": " Wed Oct 14 20:21:32 CST 2020 Ansible-Server Linux "
}
PLAY RECAP *********************************************************************************************************
localhost : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0