在自动化运维的过程中,我们经常需要从远程主机下载文件到本地,以便进行分析或备份。Ansiblefetch模块正是为了满足这一需求而设计的,它可以帮助我们轻松地从远程主机获取文件,并将其保存到本地指定的位置。在这篇文章中,我们将详细探讨如何使用fetch模块,以及它在实际工作中的常见应用场景。

📝fetch模块的功能

fetch模块的主要功能是从目标主机(被管理主机)中抓取指定的文件或目录,并将其下载到控制主机的指定路径下。常见的应用场景包括:

  1. 从远程主机抓取日志文件进行分析。

  2. 从远程主机下载配置文件进行备份。

  3. 抓取诊断数据或错误信息供后续处理。

📝fetch模块的常用参数

参数描述类型必填
src远程主机上的文件或目录路径字符串
dest本地控制主机保存文件的路径字符串
flat是否保留目录结构,yes保留,no不保留布尔值
fail_on_missing如果远程文件不存在,是否报错,yesno布尔值
validate_checksum是否验证文件的checksum,默认yes布尔值

📝fetch模块的基本用法

✍️从远程主机抓取文件

最简单的用法是从远程主机上抓取一个文件并保存到本地控制主机上。

ansible node1 -m fetch \
-a "src=/var/log/auth.log dest=/tmp/"

在这个例子中,我们从 node1 组中的主机上指定要下载的文件路径(通过 src 参数),然后指定这些文件在本地控制主机上的保存位置(通过 dest 参数)。文件将会被下载并保存到你指定的目录中。

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

✍️抓取多个文件

如果需要抓取多个文件,建议采用playbook的方式,并利用with_items循环来轻松实现对多个文件的处理。这种方式既灵活又高效。

- name: 从远程主机抓取多个日志文件
  hosts: node1
  tasks:
  - name: 从远程主机抓取多个日志文件
    ansible.builtin.fetch:
      src: "{{ item }}"
      dest: /tmp/logs/
    with_items:
      - /var/log/mail.log
      - /var/log/syslog.2.gz

然后你只需要运行下面的命令:

ansible-playbook download.yml

执行完上述命令后,输出如下结果:

✍️保留原有目录结构

默认情况下,fetch模块会将远程文件下载到目标路径下,是保留原有的目录结构。如果需要不保留远程主机的目录结构,可以使用flat: yes参数。

ansible node1 -m fetch \
-a "src=/var/log/syslog dest=/tmp/ flat=yes"

此时,文件syslog将不被保留原有的目录结构,并下载到/tmp/syslog。如下图所示:

✍️文件不存在时的错误处理

如果远程文件不存在,fetch模块会报错。可以通过fail_on_missing: no来防止错误抛出,控制任务继续执行。


ansible node1 -m fetch \
-a "src=/var/log/nonexistent.log dest=/tmp/logs/ fail_on_missing=no"

✍️使用checksum验证文件

在抓取文件时,可以启用validate_checksum来验证文件的checksum,确保文件的完整性。


ansible node1 -m fetch \
-a "src=/var/log/syslog dest=/tmp/logs/ validate_checksum=yes"

📝fetch模块的高级用法

✍️下载目录

fetch模块不仅支持下载单个文件,还支持下载整个目录。

ansible node1 -m fetch \
-a "src=/home/user/data/ dest=/tmp/data_backup/"

此命令会将远程主机上的/home/user/data/目录及其内容递归下载到本地控制主机的/tmp/data_backup/目录中,保留目录结构。

✍️使用registerdebug输出文件信息

可以使用register来保存抓取的文件信息,并通过debug模块查看抓取的文件路径等详细信息。

- name: 从远程主机抓取文件并保存结果
  hosts: node1
  tasks:
  - name: 从远程主机抓取文件并保存结果
    ansible.builtin.fetch:
      src: /var/log/syslog
      dest: /tmp/log/
    register: fetched_file
  
  - name: 输出抓取的文件信息
    ansible.builtin.debug:
      var: fetched_file

📝总结

Ansible的fetch模块为我们提供了简单高效的远程文件下载解决方案。无论是抓取单个文件、多个文件,还是整个目录,它都能轻松完成任务。通过结合使用flatfail_on_missing等参数,我们可以灵活应对各种场景。掌握fetch模块,将极大提高我们的自动化运维效率。

推荐阅读