ansible.builtin.fetch 模块是 Ansible 的内置模块,用于从远程主机复制文件到本地主机。它与 copy 模块相反,copy 模块用于将文件从本地复制到远程主机。

主要参数

  • src:字符串,指定远程主机上的源文件路径(必需参数)。必须是一个文件,而不是目录。
  • dest:字符串,指定本地主机上的目标目录路径(必需参数)。文件将被保存到该目录中。
  • fail_on_missing:布尔值,如果源文件不存在,任务是否会失败。默认为 true。
  • validate_checksum:布尔值,是否在源和目标之间验证文件的校验和。默认为 true。
  • flat:布尔值,是否覆盖默认行为(将主机名和路径附加到目标路径)。默认为 false。

示例:从远程主机复制文件到本地

以下是一个示例 Playbook,展示如何使用 fetch 模块从远程主机复制文件到本地。

Playbook 文件:fetch.yml

---
- name: fetch module demo
  hosts: all
  become: true
  vars:
    log_file: "/var/log/messages"
    dump_dir: "logs"
  tasks:
    - name: fetch log
      ansible.builtin.fetch:
        src: "{{ log_file }}"
        dest: "{{ dump_dir }}"

执行步骤

  1. 准备主机清单文件 确保你的 inventory 文件中包含了目标主机的列表。例如:

    ini [targets] demo.example.com

  2. 运行 Playbook 使用以下命令运行 Playbook:

    bash ansible-playbook -i inventory fetch.yml

执行结果

如果任务成功执行,输出将类似于以下内容:

PLAY [fetch module demo] *******************************************************

TASK [Gathering Facts] ******************************************************
ok: [demo.example.com]

TASK [fetch log] ************************************************************
changed: [demo.example.com]

PLAY RECAP *******************************************************************
demo.example.com           : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

复制的文件将被保存到本地的 logs 目录中,文件名格式为 <hostname>/<path/to/file>。例如:

logs/demo.example.com/var/log/messages

注意事项

  1. 目标路径:
    • dest 参数指定的是本地主机上的目标目录路径,而不是文件路径。
    • 如果目录不存在,Ansible 会自动创建。
  2. 文件存在性:
    • 如果远程主机上的文件不存在,任务会失败(默认行为)。可以通过设置 fail_on_missing: false 来避免任务失败。
  3. 校验和验证:
    • 默认情况下,Ansible 会在源和目标之间验证文件的校验和。如果不想进行校验和验证,可以设置 validate_checksum: false。
  4. 扁平化路径:
    • 默认情况下,文件会被保存到 <hostname>/<path/to/file> 的路径下。如果希望保存到扁平化的路径(即不包含主机名和路径),可以设置 flat: true。
  5. 权限问题:
    • 如果需要访问远程主机上的文件,可能需要管理员权限。确保 become: true。

总结

fetch 模块是一个非常实用的工具,用于从远程主机复制文件到本地主机。通过灵活使用各种参数,你可以轻松地管理文件的复制、校验和验证以及路径格式。