diff --git a/inventory/hosts.yaml b/inventory/hosts.yaml index 3d69aeb..ce55f51 100644 --- a/inventory/hosts.yaml +++ b/inventory/hosts.yaml @@ -10,7 +10,7 @@ logs: ansible_user: root ansible_ssh_pass: adjg9815... - 123.6.147.9: + 43.226.59.253: name: jglog ansible_user: wyk ansible_ssh_pass: adjg9815... diff --git a/playbooks/compress_logs.yaml b/playbooks/compress_logs.yaml index e981ac3..706f2be 100644 --- a/playbooks/compress_logs.yaml +++ b/playbooks/compress_logs.yaml @@ -1,123 +1,111 @@ ---- -- name: 压缩和清理服务器日志 - hosts: logs - gather_facts: false - vars: - # 默认值,可以通过命令行参数覆盖 - log_base_path: "/data/roslog/roslog" - # year, month, start_day, end_day 必须通过命令行参数提供 - local_download_path: "/mnt/d/logs" - remove_after_compress: true - download_to_local: true - remove_local_archives: true - - tasks: - - name: 验证必填参数 - 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: 显示将要处理的日志路径 - debug: - msg: "处理路径: {{ log_base_path }}/{{ year }}/{{ month }}, 日期范围: {{ start_day }}-{{ end_day }}" - - - name: 确保日志目录存在 - stat: - path: "{{ log_base_path }}/{{ year }}/{{ month }}" - register: log_dir - - - name: 检查日志目录是否存在 - fail: - msg: "日志目录 {{ log_base_path }}/{{ year }}/{{ month }} 不存在" - when: not log_dir.stat.exists - - - name: 压缩指定日期范围的日志文件夹 - shell: | - cd {{ log_base_path }}/{{ year }}/{{ month }} - for day in {{{ 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: yes - register: compress_result - - - name: 显示压缩结果 - debug: - var: compress_result.stdout_lines - - - name: 列出已生成的压缩文件 - find: - paths: "{{ log_base_path }}/{{ year }}/{{ month }}" - patterns: "*.tar.gz" - register: compressed_files - - - name: 显示压缩文件列表 - debug: - msg: "已生成 {{ compressed_files.files | length }} 个压缩文件" - - - name: 删除已压缩的原始文件夹 - shell: | - cd {{ log_base_path }}/{{ year }}/{{ month }} - for day in {{{ 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: yes - when: remove_after_compress - register: cleanup_result - - - name: 显示清理结果 - debug: - var: cleanup_result.stdout_lines - when: remove_after_compress - - - name: 确保本地下载目录存在 - local_action: - module: file - path: "{{ local_download_path }}/{{ name }}/{{ year }}/{{ month }}" - state: directory - when: download_to_local - become: no - - - name: 下载压缩文件到本地(支持断点续传) - synchronize: - src: "{{ log_base_path }}/{{ year }}/{{ month }}/{{ item.path | basename }}" - dest: "{{ local_download_path }}/{{ name }}/{{ year }}/{{ month }}/" - mode: pull - rsync_opts: - - "--partial" - - "--progress" - - "--compress" - with_items: "{{ compressed_files.files }}" - when: download_to_local - become: yes - - - name: 删除服务器上的压缩文件 - file: - path: "{{ item.path }}" - state: absent - with_items: "{{ compressed_files.files }}" - when: remove_local_archives and download_to_local - become: yes - - - name: 完成信息 - debug: - msg: | - 日志处理完成! - - 服务器: {{ name }} ({{ inventory_hostname }}) - - 路径: {{ log_base_path }}/{{ year }}/{{ month }} - - 日期范围: {{ start_day }}-{{ end_day }} - - 压缩文件数: {{ compressed_files.files | length }} - {% if download_to_local %} - - 本地下载路径: {{ local_download_path }}/{{ name }}/{{ year }}/{{ month }} - {% endif %} +--- +- 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 %} diff --git a/scripts/compress_logs.sh b/scripts/compress_logs.sh index 0104eea..af05421 100644 --- a/scripts/compress_logs.sh +++ b/scripts/compress_logs.sh @@ -19,17 +19,17 @@ show_help() { 用法: $0 -y YEAR -m MONTH -s START_DAY -e END_DAY [其他选项] 必填选项: - -y, --year YEAR 年份 (必填) - -m, --month MONTH 月份 (必填) - -s, --start-day DAY 起始日期 (必填) - -e, --end-day DAY 结束日期 (必填) + -y, --year YEAR 年份 + -m, --month MONTH 月份 + -s, --start-day DAY 起始日期 + -e, --end-day DAY 结束日期 可选选项: - -h, --host HOST 指定单个主机 - --no-rm-origin 不删除原文件夹 - --no-download 不下载到本地 - --no-rm-archive 不删除远程压缩包 - --help 显示此帮助信息 + -h, --host HOST 指定单个主机 + --no-rm-origin 不删除原文件夹 + --no-download 不下载到本地 + --no-rm-archive 不删除远程压缩包 + --help 显示此帮助信息 示例: # 压缩2025年11月21-30日的日志 @@ -43,12 +43,6 @@ show_help() { # 只压缩不删除原文件 $0 -y 2025 -m 11 -s 21 -e 30 --no-rm-origin - -注意: - - 年月日参数必须显式指定 - - 下载路径: /mnt/d/logs//// - - 支持断点续传 - EOF }