Ansible 实战案例--任务控制 之 循环

前言

通过利用循环,管理员无需编写多个使用同一模块的任务。例如,他们不必编写五个任务来确保存在五个用户,而是只需编写一个任务来对含有五个用户的列表迭代,从而确保他们都存在
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值