ansible - архивные файлы, с датированным именем файла, по дате архивирования - PullRequest
0 голосов
/ 06 декабря 2018

Я хочу заархивировать все файлы, содержащие дату в своих именах, присутствующие в той же папке, в том же архиве по дате с Ansible.

Позвольте мне объяснить:

Файлы могутбыть такого типа: (обратите внимание, что дата может быть разделена тире или подчеркиванием)

/app/logs/app.log
/app/logs/app.log.2018-12-04
/app/logs/app.log.2018-12-05
/app/logs/batch.log
/app/logs/batch.log.2018-12-04
/app/logs/batch.log.2018-12-05
/app/logs/web.log
/app/logs/web.log.2018_12_04
/app/logs/web.log.2018_12_05

Я хочу архивные файлы с ansible, содержащие такую ​​дату:

/app/logs/20181204.tar.gz
/app/logs/20181205.tar.gz

Дляв момент поиска файлов:

- name: Search files
  find:
    paths: "/app/logs/"
  register: files

Я пытаюсь создать новый словарь:

- set_fact:
  file:
    - "name": "{{ item.path | basename | regex_replace( '[A-Z-_.a-z]' , '') }}"
      "path": [ "{{ item.path }}" ]
  loop: "{{ files.files }}"
  when: item.path | basename | regex_replace( '[A-Z-_.a-z]' , '') != ''

И архивировать мои файлы, но мой файл var содержит только один файл

- name: archive logs
  archive:
    path: "{{ item.path }}"
    dest: "/app/logs/{{ item.name }}.tar.gz"
  with_items: "{{ file }}"

Спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

наконец-то мне нужен только второй список files_list

- name: archive logs in zip
  archive:
    path: "{{ item[1]|map(attribute='path')|list }}"
    dest: "/app/logs/{{ item[0] }}.zip"
   format: zip
  loop: "{{ grouped }}"
  vars:
    grouped: "{{ files_list|groupby('name') }}"

Спасибо, Ларкс, второй список - твой:)

0 голосов
/ 06 декабря 2018

И заархивируйте мои файлы, но мой var-файл содержит только один файл

Это потому, что вы устанавливаете переменную file в одно значение:

- set_fact:
  file:
    - "name": "{{ item.path | basename | regex_replace( '[A-Z-_.a-z]' , '') }}"
      "path": [ "{{ item.path }}" ]
  loop: "{{ files.files }}"
  when: item.path | basename | regex_replace( '[A-Z-_.a-z]' , '') != ''

Простое помещение set_fact в цикл не меняет того факта, что вы устанавливаете file на одно значение {{ item.path | basename | regex_replace( '[A-Z-_.a-z]' , '') }}.

Если вы хотите, чтобы результат вашей задачи set_factбыть списком, вам нужно создать список.Примерно так может работать:

- set_fact:
    files_list: "{{
      (files_list|default([])) +
      [{
      'name': item.path | basename | regex_replace( '[A-Z-_.a-z]' , ''),
      'path': item.path
      }]
      }}"
    loop: "{{ files.files }}"
    when: item.path | basename | regex_replace( '[A-Z-_.a-z]' , '') != ''

Это создаст список переменных files_list, добавив в него словарь для каждой итерации вашего loop.

...