Как объединить файловый глобус в цикле - PullRequest
0 голосов
/ 05 марта 2020

До сегодняшнего дня у меня был только ОДИН спецификатор типа c xml file

~/files:

gg-schema.xml.j2 
lr-schema.xml.j2

, и я скопировал его с шаблонным модулем следующим образом:

- hosts: localhost
  gather_facts: false

  vars:
     types: 
       - lr
       - gg          

  tasks:                     
    - name: "config | copy type dependent schema.xml "
      vars:
         schema_name: "{{ mydoctype }}-schema.xml"
      template:
          src: "files/{{ schema_name }}.j2"
          dest: "/tmp/{{ schema_name }}"
      loop: "{{ types }}"
      loop_control:
         loop_var: mydoctype
         label: "{{ schema_name }}"

Результат был:

PLAY [localhost] ***************************************************************
TASK [config | copy doctype dependent schema.xml] ******************************
ok: [localhost] => (item=lr-schema.xml) => {"ansible_loop_var": "mydoctype", "changed": false, "checksum": "b4a2be60cc7b4d88d7d471f37c33906bd83a0f02", "dest": "/tmp/lr-schema.xml", "gid": 30000, "group": "rz", "mode": "0644", "mydoctype": "lr", "owner": "ffeller", "path": "/tmp/lr-schema.xml", "size": 11042, "state": "file", "uid": 10069}
ok: [localhost] => (item=gg-schema.xml) => {"ansible_loop_var": "mydoctype", "changed": false, "checksum": "2792819702d1eae5d9206b717e680c635ebb4e48", "dest": "/tmp/gg-schema.xml", "gid": 30000, "group": "rz", "mode": "0644", "mydoctype": "gg", "owner": "ffeller", "path": "/tmp/gg-schema.xml", "size": 13232, "state": "file", "uid": 10069}       

Теперь у меня есть TWO файлы схемы для одного типа (например, gg ), например:

~/files:

gg-schema.xml.j2 
gg-orsh-schema.xml.j2
lr-schema.xml.j2

Как я могу использовать with_fileglob для копирования всех файлов (имя начинается с типа)?

1 Ответ

0 голосов
/ 05 марта 2020

Попробуйте:

- hosts: localhost
  gather_facts: false

  tasks:
    - name: "config | copy type dependent schema.xml "
      template:
          src: "{{ item }}"
          dest: "/tmp/{{ (item | basename | splitext)[0] }}"
      with_fileglob:
        - "files/*-schema.xml.j2"

Ansible не поддерживает настоящий синтаксис глобализации Shell.

$ ls -1 files/{lr,gg}*-schema.xml.j2
files/gg-orsh-schema.xml.j2
files/gg-schema.xml.j2
files/lr-schema.xml.j2

Это не будет работать:

- hosts: localhost
  gather_facts: false

  vars:
     types:
       - lr
       - gg

  tasks:
    - debug: msg="{{ 'files/{' + ','.join(types) + '}*-schema.xml.j2' }}"
    - name: "config | copy type dependent schema.xml "
      template:
          src: "{{ item }}"
          dest: "/tmp/{{ (item | basename | splitext)[0] }}"
      with_fileglob:
        - "{{ 'files/{' + ','.join(types) + '}*-schema.xml.j2' }}"

причина в том, что Python сам не поддерживает его.

Ни Python 2:

$ python
Python 2.7.16 (default, Oct 10 2019, 22:02:15) 
[GCC 8.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import glob
>>> glob.glob ("files/{lr,gg}*-schema.xml.j2")
[]
>>> glob.glob ("files/*-schema.xml.j2")
['files/gg-schema.xml.j2', 'files/lr-schema.xml.j2', 'files/gg-orsh-schema.xml.j2']
>>>

, ни Python 3:

$ python3
Python 3.7.3 (default, Dec 20 2019, 18:57:59) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import glob
>>> glob.glob ("files/{lr,gg}*-schema.xml.j2")
[]
>>> 
...