linux学习

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 

留言

您的电子邮箱地址不会被公开。 必填项已用 * 标注