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,第二个列表是你的:)
我想使用 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,第二个列表是你的:)