作者主页:点击!
Ansible专栏:点击!
创作时间:2024年4月25日13点40分
Ansible 中的 copy
模块用于将文件或目录从本地计算机或远程主机复制到远程主机上的特定位置。它是一个功能强大的模块,可用于各种文件传输任务.
作用
- 将配置文件复制到远程服务器
- 将应用程序部署到远程服务器
- 将日志文件从远程服务器复制到本地计算机
- 备份和恢复文件和目录
copy
模块的主要特性
- 简单高效:轻松复制文件和目录,维护文件系统元信息,例如权限和所有权。
- 灵活的源和目标:支持从本地或远程源复制到远程目标,从而实现跨各种机器的文件传输。
- 递归复制:有效地处理目录,复制整个目录结构及其内容。
- 内容替换:允许用更新的内容替换现有文件,确保最新的配置。
- 强制覆盖:提供强制覆盖现有文件的选项,确保无论以前的内容如何都会应用更改。
- 条件执行:根据目标文件的存在启用条件执行,防止不必要的复制。
- 模板支持:与 Ansible 模板功能集成,允许在文件传输期间插入动态内容。
copy
模块的常见用例
-
分发配置文件:将
.conf
或.ini
文件等配置文件部署到远程计算机以获得一致的系统设置。 -
管理应用程序文件:将应用程序文件、脚本或库复制到远程服务器以进行应用程序部署或更新。
-
传输日志文件:从远程计算机收集日志文件以进行集中分析或故障排除。
-
备份关键文件:创建重要文件或目录的备份以确保数据完整性。
实验环境及要求
在三台centos中操作
一台安装ansible的服务器来控制另外两台客户端
1.进行上传文件
2.对于文件给予用户,组权限
3.对于文件做备份防止数据覆盖丢失
服务器操作
1.定义一个组
vim /etc/ansible/host
通过以下配置就是创建一个webServers组 并且加入两个主机 再给组赋予变量 用户名和密码 这样组下的所有主机都可以访问 更加的便捷
[webServers]
host1 host2
[webServers:vars]
ansible_ssh_user='root'
ansible_ssh_pass='abc-123'
2.复制文件到主机
[root@ansible ~]# ansible webServers -m copy -a 'src=/etc/hosts dest='/mnt/1.txt''
host1 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "567c665328a352fc66fb407c6202846af636f321",
"dest": "/mnt/1.txt",
"gid": 0,
"group": "root",
"md5sum": "b6a7bc016a776f6ce50625fc6cffb176",
"mode": "0644",
"owner": "root",
"secontext": "system_u:object_r:mnt_t:s0",
"size": 225,
"src": "/root/.ansible/tmp/ansible-tmp-1713862721.36-10115-179845013773750/source",
"state": "file",
"uid": 0
}
host2 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "567c665328a352fc66fb407c6202846af636f321",
"dest": "/mnt/1.txt",
"gid": 0,
"group": "root",
"md5sum": "b6a7bc016a776f6ce50625fc6cffb176",
"mode": "0644",
"owner": "root",
"secontext": "system_u:object_r:mnt_t:s0",
"size": 225,
"src": "/root/.ansible/tmp/ansible-tmp-1713862721.32-10117-26808343561370/source",
"state": "file",
"uid": 0
}
先来大致分析一下每行的内容
"ansible_facts": { ... }
:此部分包含 Ansible 发现的有关远程计算机的信息。在本例中,它显示发现的 Python 解释器路径 (/usr/bin/python
)。"changed": true
:这表示复制操作导致远程计算机发生更改。这意味着该文件以前不存在或内容不同。"checksum"
和"md5sum"
:它们提供复制文件的校验和,可用于验证目的。"dest": "/mnt/1.txt"
:这会确认远程计算机上复制文件的目标路径。"owner": "root"
、"group": "root"
、"mode": "0644"
:这显示复制文件的所有权、组所有权和权限。在这里,它表示该文件由root
用户和组拥有,并且对所有者(root)具有读/写权限,对其他人具有只读权限。"secontext"
:这提供有关文件的安全增强型 Linux (SELinux) 上下文的信息。"size": 225
:这显示复制文件的大小(以字节为单位)。"src": "/root/.ansible/tmp/ansible-tmp-1713862721.36-10115-179845013773750/source"
:这会显示 Ansible 在将源文件复制到远程计算机之前暂存源文件的临时位置。 Ansible 通常会出于处理目的创建临时文件。"state": "file"
:表示对文件进行操作的模块。总之,输出确认
/etc/hosts
文件(或任何源文件)已成功复制到webServers
组中所有目标计算机上的/mnt/1.txt
。
客户端检测是否成功
[root@localhost ~]# ls /mnt
[root@localhost ~]# ls
anaconda-ks.cfg
[root@localhost ~]# cd /mnt
[root@localhost mnt]# ls
[root@localhost mnt]# ls
1.txt
[root@localhost mnt]# cat 1.txt
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.93.111 ansible
192.168.93.112 host1
192.168.93.113 host2
3.复制用户组权限文件
再次传输分发一个文件 这次附带用户和组以及权限
[root@ansible ~]# ansible webServers -m copy -a 'src=/etc/hosts dest=/mnt/2.txt owner=root group=bin mode=770'
src=/etc/hosts
: 此选项指定源文件,在本例中为位于控制机上的/etc/hosts
。该文件包含重要的网络配置信息。
dest=/mnt/2.txt
: 此选项定义远程计算机上的目标路径和文件名。此处,该文件将被复制到所有目标主机上的/mnt
目录并重命名为2.txt
。
owner=root
: 此选项将复制文件的所有权设置为远程计算机上的root
用户。这意味着只有root
用户才拥有该文件的完全读取、写入和执行权限。
group=bin
: 此选项将复制文件的组所有权设置为远程计算机上的bin
组。bin
组的成员将具有与mode
选项指定的相同权限。
mode=770
: 此选项确定复制文件的文件权限。770
值表示二进制数字的组合,用于定义所有者、组和其他人的权限。
客户端查看
可以看出权限确实改变了
[root@localhost mnt]# ll
总用量 8
-rw-r--r--. 1 root root 225 4月 23 16:58 1.txt
-rwxrwx---. 1 root bin 227 4月 23 17:14 2.txt
如果文件未更改任何数据的时候再次执行命令上传
[root@ansible ~]# ansible webServers -m copy -a 'src=/etc/hosts dest=/mnt/2.txt owner=root group=bin
修改一下复制的源文件 再里边随便添加内容我们再次上传查看是否成功
[root@ansible ~]# vim /etc/hosts
[root@ansible ~]# ansible webServers -m copy -a 'src=/etc/hosts dest=/mnt/2.txt owner=root group=bin mode=770'
客户端查看
这样的操作数据会被覆盖 文件名重复的时候也会覆盖掉 文件 造成数据丢失
这时候我们需要使用copy模块的一个选项
backup=yes
(重要补充):在复制新内容之前在远程计算机上创建原始文件的备份。
[root@ansible ~]# ansible webServers -m copy -a 'src=/etc/hosts dest=/mnt/2.txt owner=root group=bin mode=770 backup=yes'
客户端查看
使用ls -la查看 可以发现上传的文件并没有被覆盖掉 而是形成一个备份存放
查看数据是否丢失
现在就有了两个文件数据测试成功
copy常用的参数
参数 | 描述 | 数据类型 | 默认值 |
---|---|---|---|
src | 指定要复制的文件或目录的源路径。 | 字符串 | 无 |
dest | 指定远程主机上要复制到的目标路径。 | 字符串 | 无 |
force | 强制覆盖目标文件或目录,即使它已经存在。 | 布尔值 | yes |
content | 指定要写入目标文件的内容(用于创建新文件或覆盖现有文件)。 | 字符串 | 无 |
remote_src | 指定远程主机上的源路径(用于从远程主机复制文件)。 | 字符串 | 无 |
delimiter | 指定要用于分隔 content 参数中的键值对的字符。 | 字符串 | = |
directory_mode | 指定要应用于目标目录的权限。 | 字符串 | 0755 |
file_mode | 指定要应用于目标文件的权限。 | 字符串 | 0644 |
owner | 指定目标文件的用户所有者。 | 字符串 | 源文件所有者 |
group | 指定目标文件的组所有者。 | 字符串 | 源文件组所有者 |
preserve_timestamps | 保留源文件或目录的时间戳。 | 布尔值 | yes |
backup | 创建目标文件或目录的备份。 | 布尔值 | no |
checksum | 使用指定算法计算源文件或目录的校验和。 | 字符串 | md5 |
validate_checksum | 验证目标文件或目录的校验和是否与源文件或目录的校验和匹配。 | 布尔值 | no |