使用with_fileglob循环

时间:2018-04-22 09:55:48

标签: ansible ansible-2.x

如何使用“with_fileglob”循环。我正在尝试复制匹配通配符的文件,但在目的地具有不同的权限。

- hosts: myhost
  gather_facts: no
  tasks:
  - name: Ansible copy test
    copy:
      src: "{{ item.origin }}"
      dest: /home/user1/tmps/
      owner: user1
      mode: "{{item.mode}}"
    with_fileglob:
      - { origin: '/tmp/hello*', mode: '640'}
      - { origin: '/tmp/hi*', mode: '600'}

它会抛出错误,如下所示:

An exception occurred during task execution. To see the full traceback, use 
-vvv. The error was: AttributeError: 'dict' object has no attribute 'rfind'

2 个答案:

答案 0 :(得分:0)

根据documentation,您无法将一个字典变量传递给fileglob,在您尝试复制后添加所需的文件权限(我的意思是声明{ origin: '/tmp/hello*', mode: '640'})。

简单的模块调用,适合您:

- hosts: localhost
  gather_facts: no
  tasks:
  - name: Ansible copy test
    copy:
      src: "{{ item }}"
      dest: /SAMBA_ROOT/TEMP/
      owner: root
    with_fileglob:
      - '/tmp/hello*'
      - '/tmp/hi*'

如果你想让每个文件组都有不同的文件权限,我建议你使用2种不同的调用,模式是“硬编码”,例如:

- hosts: localhost
  gather_facts: no
  tasks:
  - name: copy hello files
    copy:
      src: "{{ item }}"
      dest: /SAMBA_ROOT/TEMP/
      owner: root
      mode: 0640
    with_fileglob:
      - '/tmp/hello*'

  - name: copy hi files
    copy:
      src: "{{ item }}"
      dest: /SAMBA_ROOT/TEMP/
      owner: root
      mode: 0600
    with_fileglob:
      - '/tmp/hi*'

答案 1 :(得分:0)

我认为最干净的方法是实现这个,将是一个include_tasks的嵌套循环。

您的主要剧本文件包含:

...

vars:
  my_patterns:
    - origin: "/tmp/hello*"
      mode: "0640"
    - origin: "/tmp/hi*"
      mode: "0600"

tasks:
  - include_tasks: "my_glob.yml"
    with_items: "{{ my_patterns }}"
    loop_control:
      loop_var: my_pattern

...

和下属my_glob.yml - 任务文件:

---
- name: Ansible copy test
  copy:
    src: "{{ item }}"
    dest: /home/user1/tmps/
    owner: user1
    mode: "{{ my_pattern.mode }}"
  with_fileglob: "{{ my_pattern.origin }}"

替代方法

使用Jinja2根据{ 'path': '...', 'mode': '...' }'填充对象列表fileglob - 查找插件结果。

vars:
  my_patterns:
    - origin: '/tmp/hello*'
      mode: '0640'
    - origin: '/tmp/hi*'
      mode: '0600'
tasks:
  - copy:
      src: "{{ item.paht }}"
      dest: /home/user1/tmps/
      owner: user1
      mode: "{{ item.mode }}"
    with_items: "[{% for match in my_patterns %}{% for file in lookup('fileglob', match.origin, wantlist=True) %}{ 'path':'{{ file }}','mode':'{{ match.mode }}'}{% if not loop.last %},{% endif %}{% endfor %}{% if not loop.last %},{% endif %}{% endfor %}]"

如果模式匹配,上述方法有效,如果结果不为空,则需要添加检查。