--- - name: 压缩和清理服务器日志 hosts: logs gather_facts: false vars: # year, month, start_day, end_day 通过命令行提供 log_base_path: "/data/roslog/roslog" local_download_path: "/mnt/d/logs" remove_after_compress: true download_to_local: true remove_local_archives: true tasks: - name: 验证必填参数 ansible.builtin.fail: msg: "缺少必填参数!必须提供: year, month, start_day, end_day" when: year is not defined or month is not defined or start_day is not defined or end_day is not defined - name: 显示将要处理的日志路径 ansible.builtin.debug: msg: "处理路径: {{ log_base_path }}/{{ year }}/{{ month }}, 日期范围: {{ start_day }}-{{ end_day }}" - name: 确保日志目录存在 ansible.builtin.stat: path: "{{ log_base_path }}/{{ year }}/{{ month }}" register: log_dir - name: 检查日志目录是否存在 ansible.builtin.fail: msg: "日志目录 {{ log_base_path }}/{{ year }}/{{ month }} 不存在" when: not log_dir.stat.exists - name: 压缩指定日期范围的日志文件夹 ansible.builtin.shell: | cd {{ log_base_path }}/{{ year }}/{{ month }} for day in $(seq -f "%02g" {{ start_day }} {{ end_day }}); do if [ -d "$day" ]; then echo "压缩目录: $day" tar -czf ${day}.tar.gz $day else echo "目录 $day 不存在,跳过" fi done args: executable: /bin/bash become: true register: compress_result - name: 显示压缩结果 ansible.builtin.debug: var: compress_result.stdout_lines - name: 列出已生成的压缩文件 ansible.builtin.find: paths: "{{ log_base_path }}/{{ year }}/{{ month }}" patterns: "*.tar.gz" register: compressed_files - name: 删除已压缩的原始文件夹 ansible.builtin.shell: | cd {{ log_base_path }}/{{ year }}/{{ month }} for day in $(seq -f "%02g" {{ start_day }} {{ end_day }}); do if [ -d "$day" ] && [ -f "${day}.tar.gz" ]; then echo "删除原始目录: $day" rm -rf $day fi done args: executable: /bin/bash become: true when: remove_after_compress - name: 确保本地下载目录存在 ansible.builtin.file: path: "{{ local_download_path }}/{{ label }}/{{ year }}/{{ month }}" state: directory delegate_to: localhost when: download_to_local become: false - name: 下载压缩文件到本地 ansible.posix.synchronize: src: "{{ log_base_path }}/{{ year }}/{{ month }}/{{ item.path | basename }}" dest: "{{ local_download_path }}/{{ label }}/{{ year }}/{{ month }}/" mode: pull rsync_opts: - "--partial" - "--progress" with_items: "{{ compressed_files.files }}" when: download_to_local become: true - name: 删除服务器上的压缩文件 ansible.builtin.file: path: "{{ item.path }}" state: absent with_items: "{{ compressed_files.files }}" when: remove_local_archives and download_to_local become: true - name: 完成信息 ansible.builtin.debug: msg: | 日志处理完成! - 服务器: {{ label }} ({{ inventory_hostname }}) - 路径: {{ log_base_path }}/{{ year }}/{{ month }} - 日期范围: {{ start_day }}-{{ end_day }} - 压缩文件数: {{ compressed_files.files | length }} {% if download_to_local %} - 本地下载路径: {{ local_download_path }}/{{ label }}/{{ year }}/{{ month }} {% endif %}