Ansible Playbook - 同步模块 - 注册变量和with_items

时间:2017-05-10 17:53:28

标签: ansible

我正在尝试编写一个在数据库刷新后将源文件夹从源文件同步到目标的剧本。我们的Peoplesoft HR应用程序还需要文件系统刷新以及数据库。我是ansible的新手,而不是python的专家。我写过这个,但是如果任何with_items不存在,我的剧本就会失败。我想将此剧本用于所有应用程序,文件夹可能因应用程序而异。如何跳过源中不存在的文件夹。我在命令行传递{{ target }}

---
- hosts: '<hostname>'
  remote_user: <user>

  tasks:
    - shell: ls -l /opt/custhome/prod/
      register: folders

    - name:  "Copy PROD filesystem to target"
      synchronize:
        src: "/opt/custhome/prod/{{ item }}"
        dest: "/opt/custhome/dev/"
        delete: yes
      when: "{{ folders == item }}"
      with_items:
        - 'src/cbl/'
        - 'sqr/'
        - 'bin/'
        - 'NVISION/'

在这种情况下,NVISION在HR应用程序中不存在,但它在FIN应用程序中存在。但是剧本没有成功,因为源文件夹中不存在该文件夹。

1 个答案:

答案 0 :(得分:1)

您可以使用find module查找和存储源文件夹的路径,然后迭代结果。示例剧本:

- hosts: '<hostname>'
  remote_user: <user>

  tasks:
    - name: find all directories
      find:
        file_type: directory
        paths: /opt/custhome/prod/
        patterns:
          - "src"
          - "sqr"
          - "bin"
      register: folders

    #debug to understand contents of {{ folders }} variable
    # - debug: msg="{{ folders }}"

    - name:  "Copy PROD filesystem to target"
      synchronize:
        src: "{{ item.path }}"
        dest: "/opt/custhome/dev/"
        delete: yes
      with_items: "{{ folders.files }}"

您可能希望使用recurse进入子目录,use_regex使用python正则表达式而不是shell globbing。