Skip to content
章节导航

copy 模块

copy 模块 是远程推送数据模块,只能将数据推送到远程主机节点。无法拉取数据到本地。

常用参数

参数名是否必须默认值选项说明
src用于定位ansible执行的机器上的文件,需要使用绝对路径。
如果拷贝的是文件夹,那么文件夹会整体拷贝。
如果结尾是/,那么只有文件夹内的东西被拷贝。
content用于代替 src,用于指定文件的内容,拷贝到远程主机。
dest用于定位远程节点上的文件,需要绝对路径。
如果 src 指向的是文件夹,这个参数也必须是指向文件夹。
backuptrue/false备份远程节点上的原始文件,在拷贝之前。如果发生什么意外,原始文件还能使用。
directory_mode进行递归复制时,设置目录的模式。
如果未设置,将使用系统默认值。
只对新创建的目录设置,不影响已经存在的目录。
followtrue/false当拷贝的文件夹内有链接存在的时候,那么拷贝过去的也会有链接
forcetruetrue/false默认为 true 会覆盖远程的内容不一样的文件(可能文件名一样)。
如果是 false,远程存在这个文件就不会拷贝
group设定一个群组拥有拷贝到远程节点的文件权限
mode等同于 chmod 命令参数,可以配置成 u+rwx 或者 u=rw,g=r,o=r
owner设定一个用户拥有拷贝到远程节点的文件权限

更多参数可以使用命令 ansible-doc -s copy 获取更多使用相关的文档或者查看官方文档

一些示例

发送文件

bash
# 新建一个文件
echo 'hello world!' > /tmp/ansible-copy.txt 

# 发送 /tmp/ansible-copy.txt 文件
ansible all -i src/inventory.yml -m copy -a "src=/tmp/ansible-copy.txt dest=/tmp/"

# 查看拷贝的文件
ansible all -i src/inventory.yml -m shell -a "ls -l /tmp/ansible-copy.txt"

ansible 模块记录了文件属性,文件md5值,得到了文件的唯一校验值,判断文件的内容是否变化,如果没有变化则不做处理,提升批量管理的效率。

指定文件属性

将权限修改为 600,文件属主修改为 www(保证在远程机器存在这个 www 用户)

bash
# 新建 www 用户
ansible all -i src/inventory.yml -m shell -a "useradd www"

# 新建一个文件
echo 'hello world!' > /tmp/ansible-copy.txt 

# 发送 /tmp/ansible-copy.txt 文件
ansible all -i src/inventory.yml -m copy -a "src=/tmp/ansible-copy.txt dest=/tmp/ group=www owner=www mode=600"

# 查看拷贝的文件
ansible all -i src/inventory.yml -m shell -a "ls -l /tmp/ansible-copy.txt"

备份文件

使用 backup 参数防止覆盖远程服务器文件,提前备份目标机器文件。

bash
# 新建一个文件
echo 'hello world!' > /tmp/ansible-copy.txt 

# 发送 /tmp/ansible-copy.txt 文件
ansible all -i src/inventory.yml -m copy -a "src=/tmp/ansible-copy.txt dest=/tmp/"

# 修改文件内容
echo 'hi world' >> /tmp/ansible-copy.txt

# 拷贝文件时添加备份
ansible all -i src/inventory.yml -m copy -a "src=/tmp/ansible-copy.txt dest=/tmp/ backup=true"

直接传递内容

bash
ansible all -i src/inventory.yml -m copy -a "content='hi curder' dest=/tmp/ansible-copy.txt"

# 查看内容
ansible all -i src/inventory.yml -m shell -a "cat /tmp/ansible-copy.txt"

不需要提供源文件,而直接使用字符串传递到远程服务器,建议添加 backup=true 参数。