Ansible中如何使用注册变量定义多个with_items实现日志归档
修正后可直接运行的Playbook
- name: 归档前一天的日志文件 become: true hosts: node1 vars: # 取前一天的日期作为归档目录名,格式为年-月-日 yesterday_date: "{{ lookup('pipe', 'date -d \"yesterday\" +%Y-%m-%d') }}" # 归档根路径,可根据实际需求修改 backup_root_path: /data/backup/logs # 要搜索日志的路径,可自行添加多个路径到列表中 log_search_paths: - /test/logs - /other/service/logs tasks: - name: 创建对应日期的归档目录 file: path: "{{ backup_root_path }}/{{ yesterday_date }}" state: directory mode: '0755' register: log_backup_dir - name: 搜索符合条件的前一天日志文件 find: paths: "{{ log_search_paths }}" # 匹配修改时间超过24小时(86400秒)的文件,如需匹配24小时内的文件改为-86400 age: 86400 patterns: - "name.log.*" recurse: yes register: matched_log_files # 调试用,确认匹配到的文件列表,不需要可直接注释 - debug: var: matched_log_files.files - name: 复制日志文件到归档目录 copy: src: "{{ item.path }}" dest: "{{ log_backup_dir.path }}/" # 保留原文件的权限、属性 preserve: yes loop: "{{ matched_log_files.files }}" # 没有匹配到文件时自动跳过该任务不报错 when: matched_log_files.matched > 0
关键调整说明
- 日期变量修正:原逻辑取的是当天日期,归档前一天的日志需将日期调整为前一天的自然日,适配归档目录命名需求
- find模块参数修正:原age参数3600仅匹配1小时前的文件,可根据实际归档范围调整秒数;多路径搜索时直接把要扫描的路径添加到
log_search_paths列表即可 - 复制逻辑修正:原copy模块的变量引用和遍历逻辑完全错误,find返回的匹配文件列表直接存储在
matched_log_files.files中,遍历该列表即可取到每个日志文件的绝对路径,目标路径直接指定到提前创建好的归档目录即可,会自动保留原文件名 - 新增异常兼容逻辑:没有匹配到符合条件的日志时自动跳过复制任务,不会抛出执行错误
内容的提问来源于stack exchange,提问作者Rumesh Sanjaya
相关产品推荐
相关产品推荐

