Ansiblearchive 模块是一个非常实用的工具,可以帮助你轻松创建压缩文件。无论是将文件夹还是单个文件打包成 .tar.zip 格式,这个模块都能帮你搞定,非常适合用来备份、传输和管理文件。在实际工作中,它特别适合用来归档日志、配置文件或数据文件,让你的工作更加高效有序。

🥇基本用法

✍️将目录打包为压缩文件

  • /var/logs 目录打包为 .tar.gz 文件,并存储到 /backup/logs.tar.gz 中:
- name: 打包日志目录为 tar.gz 文件
  hosts: node1
  tasks:
    - name: 打包日志目录为 tar.gz 文件
      archive:  #使用模块的名称
        path: /var/logs
        dest: /tmp/logs.tar.gz
  • Ad-hoc命令:
ansible node1 -m archive -a \
"path=/var/logs dest=/tmp/logs.tar.gz"

执行上述命令后,会在tmp目录下,生成一个logs.tar.gz压缩包。如下图所示:

✍️将文件打包为压缩文件

/etc/hosts/etc/fstab 这两个文件打包成一个 .zip 文件。如果你要压缩多个文件,建议用 playbook来操作。

- name: 打包多个文件为 zip 文件
  hosts: node1
  tasks:
  - name: 打包多个文件为 zip 文件
    archive:
      path:
        - /etc/hosts
        - /etc/fstab
      dest: /tmp/system_files.zip

执行完上述的剧本后,输出结果如下图:

🥇关键参数说明

你可以使用 ansible-doc -s archive 命令来查看每个参数的详细用法和说明。具体示例如下图所示:

下表是一些参数参数说明:

参数说明
path 指定要压缩的文件或目录(支持文件列表)。
dest 指定生成的压缩文件路径和名称。
format 指定压缩格式,支持 tarzipgzbz2xz 等,默认值为 tar
exclude 指定在打包时需要排除的文件或目录。
remote_src 指定 path 是否为远程路径,默认为 nopath 为本地路径)。

🥇常见场景与案例

✍️排除特定文件

打包 /var/www 文件夹,但排除.log文件:

ansible node1 -m archive -a \
"path='/var/www' dest='/backup/website_backup.tar.gz' exclude='*.log'"

✍️配合时间戳动态生成文件名

使用Jinja2模板动态生成压缩文件名:

ansible all -m archive -a \
"path=/data dest=/backup/data_backup_\$(date -Iseconds).tar.gz format=gz" 

✍️避免覆盖已存在的文件

启用 extra_opts 确保生成文件唯一:

ansible all -m archive -a \
"path=/data dest=/backup/data_backup_\$(date -Iseconds).tar.gz format=gz \
extra_opts='keep-old-files'" 

🥇综合案例

在日常运维工作中,我们常常需要对重要的日志文件进行归档备份。例如,某企业的运维团队每天需要将 /var/log 目录下的系统日志打包为 .tar.gz 文件,保存在备份目录 /backup 中,并定期清理过期的备份文件。这种重复性操作如果手动执行,不仅效率低下,还容易出错。因此,借助Ansiblearchive 模块,可以快速实现这一需求。

✍️需求分析

  1. 每天将 /var/log 目录下的所有日志文件压缩为 .tar.gz 文件。

  2. 备份文件以时间戳命名,存储在 /backup 目录中,例如:logs_backup_20250125.tar.gz

  3. 保留最近 7 天的备份文件,删除过期文件。

✍️实现步骤

创建Playbook,以下是完整的Playbook文件,实现日志打包和过期备份清理功能。

---
- name: 自动化日志归档和清理任务
  hosts: all
  become: true
  tasks:
    - name: 创建备份目录
      ansible.builtin.file:
        path: /backup
        state: directory
        mode: '0755'

    - name: 归档日志文件到备份目录
      ansible.builtin.archive:
        path: /var/log
        dest: "/backup/logs_backup_{{ ansible_date_time.iso8601_basic }}.tar.gz"
        format: gz

    - name: 删除超过 7 天的备份文件
      ansible.builtin.find:
        paths: /backup
        age: 7d
        recurse: yes
        patterns: "*.tar.gz"
      register: old_backups

    - name: 移除过期备份文件
      ansible.builtin.file:
        path: "{{ item.path }}"
        state: absent
      with_items: "{{ old_backups.files }}"

该剧本包含4个任务,分别是创建备份目录、归档日志文件、删除超过7天的备份文件、移除过期的备份文件。

✍️ 运行Playbook

保存上述 Playbookbackup_logs.yml,执行以下命令运行任务:

ansible-playbook backup_logs.yml

总结

通过该模块,你可以更高效地管理文件备份和归档工作,配合Ansible的自动化优势,极大提升运维效率。

推荐阅读