Ansible 中 loop 循环
loop循环
Playbook中很多任务都在使用相同的模块,可以使用loop循环避免这些重复。在这里loop循环相当于shell中for循环。
在web1主机上创建5个目录/tmp/{aaa,bbb,ccc,ddd,eee},代码示意如下:
[root@pubserver ansible]# vim loop1.yml
---
- name: use loop
hosts: web1
tasks:
- name: create directory
file:
path: /tmp/{{item}} # item是固定的,用于表示循环中的变量。
state: directory
loop: [aaa,bbb,ccc,ddd,eee]
# 其他写法:
---
- name: use loop
hosts: web1
tasks:
- name: create directory
file:
path: /tmp/{{item}}
state: directory
loop:
- aaa
- bbb
- ccc
- ddd
- eee
[root@pubserver ansible]# ansible-playbook loop1.yml
.................
changed: [web1] => (item=aaa)
changed: [web1] => (item=bbb)
changed: [web1] => (item=ccc)
changed: [web1] => (item=ddd)
changed: [web1] => (item=eee)
PLAY RECAP *****************************************************************************************************************************************
web1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
复杂变量
Ansible中循环用到的变量名是固定的,叫item。循环时,loop中每个’-’后面的内容作为一个整体赋值给item。loop中{ }中的内容是自己定义的,写法为key:val,取值时使用句点表示,如下例中取出用户名就是{{item.uname}}。
创建gousheng用户,密码是123;创建lisi用户,密码是456,代码示意如下:
[root@pubserver ansible]# vim loop_user.yml
---
- name: create users
hosts: webservers
tasks:
- name: create many users
user:
name: "{{item.uname}}"
password: "{{item.upass|password_hash('sha512')}}"
loop:
- {"uname":"gousheng","upass":"123"}
- {"uname":"lisi","upass":"123"}
[root@pubserver ansible]# ansible-playbook loop_user.yml
PLAY [create users] ********************************************************************************************************************************
TASK [Gathering Facts] *****************************************************************************************************************************
ok: [web2]
ok: [web1]
TASK [create many users] ***************************************************************************************************************************
changed: [web2] => (item={'uname': 'gousheng', 'upass': '123'})
changed: [web1] => (item={'uname': 'gousheng', 'upass': '123'})
changed: [web2] => (item={'uname': 'lisi', 'upass': '123'})
changed: [web1] => (item={'uname': 'lisi', 'upass': '123'})
PLAY RECAP *****************************************************************************************************************************************
web1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
web2 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0