介绍
在本实验中,你将探索 Ansible 的 Copy 模块,该模块允许你将文件和目录复制到远程主机。Copy 模块提供了一种灵活且高效的方式,作为 Ansible 自动化任务的一部分来传输文件。
在本实验中,你将探索 Ansible 的 Copy 模块,该模块允许你将文件和目录复制到远程主机。Copy 模块提供了一种灵活且高效的方式,作为 Ansible 自动化任务的一部分来传输文件。
在这一步骤中,你将使用 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 愉快地进行复制操作!