Ansible copy模块用于将本地文件或目录从控制节点复制到远程主机,必须指定src和绝对路径dest,支持设置owner、group、mode、backup、force等参数实现权限管理、备份覆盖与条件同步。

用 Ansible 的 copy 模块就能把本地文件复制到远程主机,这是最常用、最直接的方式。它默认从控制机(你运行 ansible 命令的那台机器)读取文件,推送到目标主机指定路径。
基础用法:单个文件复制
确保目标路径的父目录已存在,否则会报错(比如 /tmp 存在,但 /opt/app/conf 不存在,就得先建目录)。最简命令如下:
ansible web -m copy -a "src=/local/path/config.yml dest=/etc/myapp/config.yml"- 执行后,
config.yml就会出现在远程/etc/myapp/下,权限和属主默认继承源文件(若控制机上是 root 写的,远程也倾向设为 root)
关键参数说明与常见设置
实际使用中常需控制权限、归属和覆盖行为:
-
dest 必须是绝对路径,例如
/home/deploy/app.jar,不能写成~/app.jar或app.jar -
owner/group:指定远程文件属主和属组,如
owner=deploy group=deploy;远程主机必须已存在该用户或组,否则任务失败 -
mode:用八进制表示权限,如
mode=0644(rw-r--r--)或mode=0755(rwxr-xr-x);注意前面的0不能省 -
backup=yes:覆盖前自动备份原文件,生成类似
config.yml.1234.2026-10-10@11:20:33~的带时间戳备份,防误操作 - force=no:当远程文件已存在且内容与本地不同时,跳过复制(即只在内容变更时才更新),适合做“条件同步”
复制目录与特殊场景
复制整个目录时要注意末尾斜杠的影响:
-
src=/local/dir/ dest=/remote/→ 只复制dir/里的内容(不创建dir目录本身) -
src=/local/dir dest=/remote/→ 复制dir整个目录及其内容到/remote/dir/ - 若想生成纯文本内容而非复制文件,可用
content参数,例如:ansible web -m copy -a 'content="host=192.168.1.10\nport=8080\n" dest=/etc/myapp/config.env'
安全与权限提醒
多数情况下需提权才能写入系统目录(如 /etc、/usr/local):
- 加
-b(become)启用 sudo,例如:ansible web -b -m copy -a "src=nginx.conf dest=/etc/nginx/nginx.conf" - 若远程用户不是 root,但有免密 sudo 权限,
-b就够了;没配置则会提示密码或失败 - 避免用
mode=777等宽泛权限,尤其对配置文件或脚本,最小权限原则更安全


















