ansible - 存档文件,带有日期文件名,按存档日期

ansible - archive files, with a dated filename, by archive date

我想使用 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 }}"

感谢您的帮助

And archive my files, but my var file contains only one file

那是因为您将变量 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.

的每次迭代的字典

最后我只需要第二个列表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') }}"

谢谢 Larsks,第二个列表是你的:)