Ansible Copy 模块

AnsibleAnsibleBeginner
立即练习

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

介绍

在本实验中,你将探索 Ansible 的 Copy 模块,该模块允许你将文件和目录复制到远程主机。Copy 模块提供了一种灵活且高效的方式,作为 Ansible 自动化任务的一部分来传输文件。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ansible(("`Ansible`")) -.-> ansible/ModuleOperationsGroup(["`Module Operations`"]) ansible(("`Ansible`")) -.-> ansible/PlaybookEssentialsGroup(["`Playbook Essentials`"]) ansible/ModuleOperationsGroup -.-> ansible/copy("`Transfer Files`") ansible/ModuleOperationsGroup -.-> ansible/file("`Manage Files/Directories`") ansible/ModuleOperationsGroup -.-> ansible/shell("`Execute Shell Commands`") ansible/ModuleOperationsGroup -.-> ansible/template("`Generate Files from Templates`") ansible/PlaybookEssentialsGroup -.-> ansible/playbook("`Execute Playbook`") subgraph Lab Skills ansible/copy -.-> lab-289653{{"`Ansible Copy 模块`"}} ansible/file -.-> lab-289653{{"`Ansible Copy 模块`"}} ansible/shell -.-> lab-289653{{"`Ansible Copy 模块`"}} ansible/template -.-> lab-289653{{"`Ansible Copy 模块`"}} ansible/playbook -.-> lab-289653{{"`Ansible Copy 模块`"}} end

将文件复制到远程主机

在这一步骤中,你将使用 Ansible 的 Copy 模块将文件从控制机复制到远程主机。

首先,创建一个新的 Ansible playbook 文件,命名为 /home/labex/project/copy-module-playbook.yaml,并在文本编辑器中打开它。
将以下内容添加到 playbook 文件中:

- hosts: localhost
  tasks:
    - name: Copy a file to remote host
      copy:
        src: /home/labex/file.txt
        dest: /home/labex/project/file.txt
  • copy:使用 Ansible 的 copy 模块,该模块用于将文件从控制节点(本地主机)复制到远程主机。
  • src:指定源文件路径,表示本地主机上要复制的文件路径。
  • dest:指定目标文件路径,表示文件应复制到远程主机的哪个位置。

通过此 playbook 任务,文件 /home/labex/file.txt 将被复制到远程主机的 /home/labex/project/file.txt 路径。Ansible 的 copy 模块使文件复制过程更加高效。

接下来,在 /home/labex 目录下创建一个名为 file.txt 的文件。

echo "This is the content of the file." > /home/labex/file.txt

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

ansible-playbook copy-module-playbook.yaml

示例输出:

[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 [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Copy a file to remote host] **********************************************
changed: [localhost]

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

最后,验证文件 file.txt 是否存在于远程主机的指定目标路径中。

cat /home/labex/project/file.txt

示例输出:

This is the content of the file.

这里的 "This is the content of the file."/home/labex/file.txt 文件的内容相同,这意味着 /home/labex/file.txt 文件已成功复制到 /home/labex/project/file.txt

将目录复制到远程主机

在这一步骤中,你将使用 Ansible 的 Copy 模块将目录从控制机复制到远程主机。

首先,修改现有的 playbook 文件,删除所有内容并添加以下内容到 playbook 文件中:

- hosts: localhost
  tasks:
    - name: Copy a directory to remote host
      copy:
        src: /home/labex/directory
        dest: /home/labex/project/

如果 src 设置为目录,此 Playbook 任务会将 /home/labex/directory 目录复制到远程主机的 /home/labex/project/ 路径。

接下来,在 /home/labex 目录下创建一个名为 directory 的目录,并在 directory 目录中创建一个名为 file2.txt 的文件。

mkdir /home/labex/directory
touch /home/labex/directory/file2.txt

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

ansible-playbook copy-module-playbook.yaml

示例输出:

[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 [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Copy a directory to remote host] *****************************************
changed: [localhost]

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

最后,验证目录 directory 及其内容是否存在于远程主机的指定目标路径中。

tree /home/labex/project

预期输出:

/home/labex/project
├── copy-module-playbook.yaml
├── directory
│   └── file2.txt
└── file.txt

1 directory, 3 files

你可以看到,directory 目录和 file2.txt 文件已成功复制到目标主机的 /home/labex/project 目录中。

保留文件属性

在这一步骤中,你将学习如何在使用 Ansible Copy 模块时保留文件属性,例如权限和时间戳。

首先,修改现有的 playbook 文件,删除所有内容并添加以下内容到 playbook 文件中:

- hosts: localhost
  tasks:
    - name: Preserve file attributes
      copy:
        src: /home/labex/file.txt
        dest: /tmp/file.txt
        mode: preserve
  • mode: preserve:此参数在复制过程中保留源文件的模式(权限),确保目标文件保留与源文件相同的权限。

通过此 playbook 任务,文件 /home/labex/file.txt 将被复制到远程主机的 /tmp/file.txt,同时保留文件的属性,例如权限。

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

ansible-playbook copy-module-playbook.yaml

示例输出:

[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 [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Preserve file attributes] ************************************************
changed: [localhost]

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

最后,验证文件 file.txt 是否在保留其属性的情况下复制到远程主机的指定目标路径。
使用 ll 查看 /home/labex/file.txt 的详细信息:

ll /home/labex/file.txt

示例输出:

-rw-rw-r-- 1 labex labex 33 Mar 9 08:34 /home/labex/file.txt

使用 ll 查看 /tmp/file.txt 的详细信息:

ll /tmp/file.txt

示例输出:

-rw-rw-r-- 1 labex labex 33 Mar 9 09:00 /tmp/file.txt

此 Ansible playbook 可用于在复制过程中保留权限模式(权限位)和所有者信息。

处理权限

在这一步骤中,你将探索如何在使用 Ansible Copy 模块时处理文件权限。你将学习如何为远程主机上的复制文件设置特定权限。

首先,修改现有的 playbook 文件,删除所有内容并添加以下内容到 playbook 文件中:

- hosts: localhost
  tasks:
    - name: Handle permissions
      copy:
        src: /home/labex/file.txt
        dest: /tmp/file1.txt
        mode: "0644"
  • mode:将 "0644" 替换为所需的文件权限模式。有关权限模式的更多信息,请参考 chmod 文档。

通过此 playbook 任务,文件 /home/labex/file.txt 将被复制到远程主机的 /tmp/file1.txt,并设置指定的权限 0644

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

ansible-playbook copy-module-playbook.yaml

示例输出:

[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 [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Handle permissions] ******************************************************
changed: [localhost]

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

最后,验证文件 file1.txt 是否以设置的权限复制到远程主机的指定目标路径。
使用 ll 查看 /home/labex/file.txt 的详细信息:

ll /home/labex/file.txt

示例输出:

-rw-rw-r-- 1 labex labex 33 Mar 9 08:34 /home/labex/file.txt

使用 ll 查看 /tmp/file1.txt 的详细信息:

ll /tmp/file1.txt

示例输出:

-rw-r--r-- 1 labex labex 33 Mar 9 09:11 /tmp/file1.txt

此 Ansible playbook 可用于为远程主机上的文件设置特定权限,例如读取、写入和执行权限。

幂等复制

在这一步骤中,你将使用 Ansible Copy 模块实现复制操作的幂等性。你将确保仅在远程主机上不存在该文件或源文件已更改时,才复制文件。

首先,修改现有的 playbook 文件,删除所有内容并添加以下内容到 playbook 文件中:

- hosts: localhost
  tasks:
    - name: Idempotent copy
      copy:
        src: /home/labex/file.txt
        dest: /tmp/file2.txt
        remote_src: yes
  • remote_src: yes:此参数指定 src 路径位于远程主机上,允许 Ansible 将文件从远程主机传输到另一个位置。

通过此 playbook 任务,仅在远程主机上不存在该文件或源文件已更改时,远程主机上的 /home/labex/file.txt 文件才会被复制到 /tmp/file2.txt

接下来,检查 /tmp/file2.txt 文件是否存在。

ll /tmp/file2.txt

示例输出:

ls: cannot access '/tmp/file2.txt': No such file or directory

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

ansible-playbook copy-module-playbook.yaml

示例输出:

[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 [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Idempotent copy] *********************************************************
changed: [localhost]

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

最后,验证仅在远程主机上不存在该文件或源文件已更改时,文件 file2.txt 才会被复制到远程主机的指定目标路径。

ll /tmp/file2.txt

示例输出:

-rw-rw-r-- 1 labex labex 33 Mar 9 08:34 /tmp/file2.txt

此时,再次运行 playbook。

ansible-playbook copy-module-playbook.yaml

示例输出:

[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 [localhost] ***************************************************************

TASK [Gathering Facts] *********************************************************
ok: [localhost]

TASK [Idempotent copy] *********************************************************
ok: [localhost]

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

请注意,changed=1 变为 changed=0,证明此 Ansible playbook 可以实现仅在远程主机上不存在该文件或源文件已更改时,才复制文件。

总结

恭喜!你已成功完成 Ansible Copy 模块实验。你已经学习了如何使用 Copy 模块将文件和目录复制到远程主机、保留文件属性、处理权限以及确保幂等性。

Copy 模块是 Ansible 自动化任务中传输文件的强大工具。它提供了多种参数,可根据你的需求自定义复制操作。

现在你已经对 Copy 模块有了深入的了解,可以在你的 Ansible playbook 中利用其功能,高效管理文件传输和基础设施中的同步。祝你使用 Ansible 愉快地进行复制操作!

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