跳转至

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剧本文件功能上是完全相同的,但是对比就会发现使用循环方式内容更加简洁,对于重复性任务使用循环方式更适合。

参考

ansible-doc Ansible synchronize 模块

回到页面顶部