Ansible 使用循环完成重复性任务
2018-07-10 by dongnan
目标
学习在 ansible-playbook 模式,使用循环完成重复性任务。
要点
ansible-playbook 配置文件
- 使用 synchronize模块,进行文件同步,详细参考这里。
- 使用 with_items模块,进行文件(夹)拷贝。
举个栗子
不使用循环
先来看下没有使用循环的 playbook “剧本文件”
---
- hosts: node1
  tasks:
    - name: rancher-nfs
      synchronize:
        mode: pull
        src: "/var/lib/rancher/volumes/rancher-nfs"
        dest: "/data/backup/node1/"
    - name: node1-aof
      synchronize:
        mode: pull
        src: "/var/lib/docker/volumes/smln_rds-data_569fb"
        dest: "/data/backup/node1/"
- hosts: node3
  tasks:
    - name: node3-aof
      synchronize:
        mode: pull
        src: "/var/lib/docker/volumes/scfs_redis-data_9ef00"
        dest: "/data/backup/node3/"
    - name: node3-sign
      synchronize:
        mode: pull
        src: "/var/lib/docker/volumes/smln_sign-data_19978"
        dest: "/data/backup/node3/"
使用循环
使用循环方式的 playbook “剧本文件”
---
- hosts: node1
  tasks:
    - name: sync node1
      synchronize: mode=pull src={{ item.src }} dest={{ item.dest }}
      with_items:
        - { src: "/var/lib/rancher/volumes/rancher-nfs", dest: "/data/backup/node1/" }
        - { src: "/var/lib/docker/volumes/smln_rds-data_569fb", dest: "/data/backup/node1/" }
- hosts: node3
  tasks:
    - name: sync node3
      synchronize: mode=pull src={{ item.src }} dest={{ item.dest }}
      with_items:
        - { src: "/var/lib/docker/volumes/scfs_redis-data_9ef00", dest: "/data/backup/node3/" }
        - { src: "/var/lib/docker/volumes/smln_sign-data_19978", dest: "/data/backup/node3/" } 
执行 playbook 任务
ansible-playbook sync-2.yml PLAY [node1]
...省略
TASK [node3] **********************************************************************************************************************************
changed: [node3] => (item=/var/lib/docker/volumes/scfs_redis-data_9ef00)
changed: [node3] => (item=/var/lib/docker/volumes/smln_sign-data_19978)
PLAY RECAP ************************************************************************************************************************************
node1                      : ok=2    changed=0    unreachable=0    failed=0  
node3                      : ok=2    changed=1    unreachable=0    failed=0  
小结
这两个 playbook剧本文件功能上是完全相同的,但是对比就会发现使用循环方式内容更加简洁,对于重复性任务使用循环方式更适合。