Ansible 中的 copy 模块用于将文件或目录从本地计算机或远程主机复制到远程主机上的特定位置。它是一个功能强大的模块,可用于各种文件传输任务.
将配置文件复制到远程服务器
将应用程序部署到远程服务器
将日志文件从远程服务器复制到本地计算机
备份和恢复文件和目录
简单高效:轻松复制文件和目录,维护文件系统元信息,例如权限和所有权。
灵活的源和目标:支持从本地或远程源复制到远程目标,从而实现跨各种机器的文件传输。
递归复制:有效地处理目录,复制整个目录结构及其内容。
内容替换:允许用更新的内容替换现有文件,确保最新的配置。
强制覆盖:提供强制覆盖现有文件的选项,确保无论以前的内容如何都会应用更改。
条件执行:根据目标文件的存在启用条件执行,防止不必要的复制。
模板支持:与 Ansible 模板功能集成,允许在文件传输期间插入动态内容。
分发配置文件:将 .conf 或 .ini 文件等配置文件部署到远程计算机以获得一致的系统设置。
管理应用程序文件:将应用程序文件、脚本或库复制到远程服务器以进行应用程序部署或更新。
传输日志文件:从远程计算机收集日志文件以进行集中分析或故障排除。
备份关键文件:创建重要文件或目录的备份以确保数据完整性。
在三台centos中操作
一台安装ansible的服务器来控制另外两台客户端
1.进行上传文件
2.对于文件给予用户,组权限
3.对于文件做备份防止数据覆盖丢失
vim /etc/ansible/host
通过以下配置就是创建一个webServers组 并且加入两个主机 再给组赋予变量 用户名和密码 这样组下的所有主机都可以访问 更加的便捷
[webServers]
host1 host2
[webServers:vars]
ansible_ssh_user='root'
ansible_ssh_pass='abc-123'
[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
}
先来大致分析一下每行的内容
客户端检测是否成功
[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
再次传输分发一个文件 这次附带用户和组以及权限
[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模块的一个选项
[root@ansible ~]# ansible webServers -m copy -a 'src=/etc/hosts dest=/mnt/2.txt owner=root group=bin mode=770 backup=yes'
客户端查看
使用ls -la查看 可以发现上传的文件并没有被覆盖掉 而是形成一个备份存放
现在就有了两个文件数据测试成功
参数 描述 数据类型 默认值
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
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。