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 }}"
执行步骤
-
准备主机清单文件 确保你的
inventory文件中包含了目标主机的列表。例如:ini [targets] demo.example.com -
运行 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
注意事项
- 目标路径:
dest参数指定的是本地主机上的目标目录路径,而不是文件路径。- 如果目录不存在,Ansible 会自动创建。
- 文件存在性:
- 如果远程主机上的文件不存在,任务会失败(默认行为)。可以通过设置
fail_on_missing: false来避免任务失败。
- 如果远程主机上的文件不存在,任务会失败(默认行为)。可以通过设置
- 校验和验证:
- 默认情况下,Ansible 会在源和目标之间验证文件的校验和。如果不想进行校验和验证,可以设置
validate_checksum: false。
- 默认情况下,Ansible 会在源和目标之间验证文件的校验和。如果不想进行校验和验证,可以设置
- 扁平化路径:
- 默认情况下,文件会被保存到
<hostname>/<path/to/file>的路径下。如果希望保存到扁平化的路径(即不包含主机名和路径),可以设置flat: true。
- 默认情况下,文件会被保存到
- 权限问题:
- 如果需要访问远程主机上的文件,可能需要管理员权限。确保
become: true。
- 如果需要访问远程主机上的文件,可能需要管理员权限。确保
总结
fetch 模块是一个非常实用的工具,用于从远程主机复制文件到本地主机。通过灵活使用各种参数,你可以轻松地管理文件的复制、校验和验证以及路径格式。