Ansible Fetch 模块

AnsibleAnsibleBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

欢迎来到 Ansible Fetch 模块实验!在本实验中,你将深入学习 Ansible Fetch 模块的使用。Fetch 模块允许你从远程机器上检索文件,并将其复制到执行 Ansible 的控制机器上。当你需要从托管主机收集特定文件或工件时,这非常有用。

让我们开始吧!


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ansible(("`Ansible`")) -.-> ansible/ModuleOperationsGroup(["`Module Operations`"]) ansible(("`Ansible`")) -.-> ansible/PlaybookEssentialsGroup(["`Playbook Essentials`"]) ansible/ModuleOperationsGroup -.-> ansible/fetch("`Retrieve Files`") ansible/ModuleOperationsGroup -.-> ansible/file("`Manage Files/Directories`") ansible/ModuleOperationsGroup -.-> ansible/template("`Generate Files from Templates`") ansible/PlaybookEssentialsGroup -.-> ansible/loop("`Iteration`") ansible/PlaybookEssentialsGroup -.-> ansible/playbook("`Execute Playbook`") subgraph Lab Skills ansible/fetch -.-> lab-290159{{"`Ansible Fetch 模块`"}} ansible/file -.-> lab-290159{{"`Ansible Fetch 模块`"}} ansible/template -.-> lab-290159{{"`Ansible Fetch 模块`"}} ansible/loop -.-> lab-290159{{"`Ansible Fetch 模块`"}} ansible/playbook -.-> lab-290159{{"`Ansible Fetch 模块`"}} end

获取单个文件

在这一步中,你将学习如何使用 Ansible 的 Fetch 模块从远程机器上获取单个文件。这将帮助你理解该模块的基本用法和语法。

首先,完成 /home/labex/project/fetching_a_single_file.yml 文件。
在文本编辑器中打开它,并将以下内容添加到 playbook 文件中:

- name: Fetch Module Lab
  hosts: localhost
  gather_facts: false

  tasks:
    - name: Fetch a single file
      fetch:
        src: /home/labex/example/example_1.txt
        dest: /home/labex/project/example_1.txt
        flat: true
  • fetch:这是用于从远程主机获取文件的 Ansible 模块。
  • src:指定需要获取的远程主机上文件的路径。在本例中,路径为 /home/labex/example/example_1.txt
  • dest:指定获取的文件在本地主机上的存储路径。在本例中,路径为 /home/labex/project/example_1.txt
  • flat:此参数控制目标路径的行为。当设置为 true 时,确保获取的文件直接放置在目标目录中,而不会创建任何子目录。这在获取单个文件并希望保持目录结构简单时非常有用。

Ansible 中的 fetch 模块用于将文件从远程主机获取到本地主机。在此配置中,它用于从远程主机的 /home/labex/example/ 目录中获取名为 "example_1.txt" 的文件,并将其存储为本地主机 /home/labex/project/ 目录中的 "example_1.txt"。flat: true 参数确保获取的文件直接放置在目标目录中,而不会创建任何子目录。

然后,使用以下命令运行 playbook:

ansible-playbook fetching_a_single_file.yml

示例输出:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [Fetch Module Lab] **************************************************

TASK [Fetch a single file] *****************************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

最后,验证 example_1.txt 文件是否已从远程主机成功获取到本地。

ll /home/labex/project/example_1.txt

示例输出:

-rw-rw-r-- 1 labex labex 23 Mar 14 10:45 /home/labex/project/example_1.txt

获取多个文件

在这一步中,你将通过从远程机器获取多个文件来加深对 Fetch 模块的理解。这将允许你在单个任务中收集多个文件。

首先,完成 /home/labex/project/fetching_multiple_files.yml 文件。
在文本编辑器中打开它,并将以下内容添加到 playbook 文件中:

- name: Fetch Module Lab
  hosts: localhost
  gather_facts: false

  tasks:
    - name: Fetch multiple files
      loop:
        - example_2.txt
        - example_3.txt
      fetch:
        src: "/home/labex/example/{{ item }}"
        dest: "/home/labex/project/{{ item }}"
        flat: true
  • loop:此关键字用于遍历项目列表。
  • fetch:这是用于从远程主机获取文件的 Ansible 模块。
  • src:指定要获取的文件的源路径。{{ item }} 占位符会被循环中的每个项目替换,从而从 /home/labex/example/ 目录中获取 example_2.txtexample_3.txt
  • dest:指定获取的文件在本地主机上的存储路径。同样,{{ item }} 占位符用于确保每个文件被放置在 /home/labex/project/ 中的相应目录中。
  • flat:此参数控制目标路径的行为。当设置为 true 时,确保获取的文件直接放置在目标目录中,而不会创建任何子目录。这在获取单个文件并希望保持目录结构简单时非常有用。

在此配置中,它用于从本地主机的 /home/labex/example/ 目录中获取多个文件(example_2.txtexample_3.txt),并将它们存储在 /home/labex/project/ 中的相应目录中。loop 结构允许遍历项目列表,并为列表中的每个项目执行获取操作。

然后,使用以下命令运行 playbook:

ansible-playbook fetching_multiple_files.yml

示例输出:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [Fetch Module Lab] **************************************************

TASK [Fetch multiple files] ****************************************************
changed: [localhost] => (item=example_2.txt)
changed: [localhost] => (item=example_3.txt)

PLAY RECAP *********************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

最后,验证 example_2.txtexample_3.txt 是否已从远程主机成功获取到本地。

ll /home/labex/project/ | grep example

示例输出:

-rw-rw-r-- 1 labex labex 23 Mar 14 10:45 example_1.txt
-rw-rw-r-- 1 labex labex 23 Mar 14 11:00 example_2.txt
-rw-rw-r-- 1 labex labex 23 Mar 14 11:00 example_3.txt

在 Fetch 模块中使用变量

在这一步中,你将通过引入变量来探索 Ansible Fetch 模块的更高级用法。你将根据 playbook 中定义的动态值获取文件。

首先,完成 /home/labex/project/using_variablesin_fetch_modules.yml 文件。
在文本编辑器中打开它,并将以下内容添加到 playbook 文件中:

- name: Fetch Module Lab
  hosts: localhost
  gather_facts: false
  vars:
    file_path: "/home/labex/example/example_4.txt"
    dest_path: "/home/labex/project/example_4.txt"

  tasks:
    - name: Fetch files using variables
      fetch:
        src: "{{ file_path }}"
        dest: "{{ dest_path }}"
        flat: true
  • vars:此部分允许定义在 playbook 中使用的变量。
  • fetch:这是用于从远程主机获取文件的 Ansible 模块。
  • src:指定要获取的文件的源路径。它使用 file_path 变量动态提供源文件路径。
  • dest:指定获取的文件在本地主机上的存储路径。它使用 dest_path 变量动态提供目标文件路径。
  • flat:此参数控制目标路径的行为。当设置为 true 时,确保获取的文件直接放置在目标目录中,而不会创建任何子目录。这在获取单个文件并希望保持目录结构简单时非常有用。

在此配置中,它用于从远程主机的源文件路径(file_path 变量)获取文件,并将其存储在本地 Ansible 控制节点的目标文件路径(dest_path 变量)中。使用变量可以动态指定文件路径,从而为 playbook 提供灵活性和可重用性。

然后,使用以下命令运行 playbook:

ansible-playbook using_variablesin_fetch_modules.yml

示例输出:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [Fetch Module Lab] **************************************************

TASK [Fetch files using variables] *********************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

接下来,验证 example_4.txt 文件是否已从远程主机成功获取到本地。

ll /home/labex/project/example_4.txt

示例输出:

-rw-rw-r-- 1 labex labex 23 Mar 14 11:16 /home/labex/project/example_4.txt

最后,尝试使用 -e 选项指定 file_pathdest_path

ansible-playbook using_variablesin_fetch_modules.yml -e file_path="/tmp/example_5.txt" -e dest_path="/tmp/target/example_5.txt"

示例输出:

[WARNING]: No inventory was parsed, only implicit localhost is available
[WARNING]: provided hosts list is empty, only localhost is available. Note that
the implicit localhost does not match 'all'

PLAY [Fetch Module Lab] **************************************************

TASK [Fetch files using variables] *********************************************
changed: [localhost]

PLAY RECAP *********************************************************************
localhost : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

验证 example_5.txt 文件是否已从远程主机成功获取到本地。

ll /tmp/target/example_5.txt

示例输出:

-rw-rw-r-- 1 labex labex 23 Mar 14 11:24 /tmp/target/example_5.txt

总结

恭喜你完成了 Ansible Fetch 模块实验!在本实验中,你学习了如何使用 Ansible 的 Fetch 模块从远程机器获取文件并将其复制到控制机器。从获取单个文件开始,你逐步掌握了获取多个文件以及使用变量实现动态文件获取的方法。

通过完成本实验,你获得了利用 Fetch 模块从托管主机收集特定文件或工件的宝贵经验。继续探索 Ansible 及其模块,以进一步提升你的自动化能力。

祝你自动化愉快!

您可能感兴趣的其他 Ansible 教程