此文章为「ansible笔记(2)之常用模块」的子文章。
拷贝文件,它与之前介绍的 fetch 模块类似,不过,fetch 模块是从远程主机中拉取文件到 ansible 主机,而 copy 模块是将 ansible 主机上的文件拷贝到远程主机中。
参数说明:
src
:用于指定需要 copy 的文件或目录;dest
:用于指定文件将被拷贝到远程主机的哪个目录中,dest
为必须参数;content
:当不使用src
指定拷贝的文件时,可以使用content
直接指定文件内容,src
与content
两个参数必有其一,否则会报错;force
:当远程主机的目标路径中已经存在同名文件,并且与 ansible 主机中的文件内容不同时,是否强制覆盖,可选值有 yes 和 no,默认值为 yes,表示覆盖,如果设置为 no,则不会执行覆盖拷贝操作,远程主机中的文件保持不变;backup
:当远程主机的目标路径中已经存在同名文件,并且与 ansible 主机中的文件内容不同时,是否对远程主机的文件进行备份,可选值有yes
和no
,当设置为yes
时,会先备份远程主机中的文件,然后再将 ansible 主机中的文件拷贝到远程主机。owner
:指定文件拷贝到远程主机后的属主,但是远程主机上必须有对应的用户,否则会报错;group
:指定文件拷贝到远程主机后的属组,但是远程主机上必须有对应的组,否则会报错;mode
:指定文件拷贝到远程主机后的权限,如果你想将权限设置为rw-r--r--
,则可以使用mode=0644
表示,如果你想要在user
对应的权限位上添加执行权限,则可以使用mode=u+x
表示;remote_src
:指定从客户机本地拷贝;
例 1:将 ansible 主机中 /root/copytest
文件复制到远程主机的 /opt
目录下,注意,如果 copytest
文件已经存在于远程主机的 /opt
目录中,并且远程主机中的 copytest
与 ansible 主机中 copytest
文件内容不同,那么使用如下命令时,远程主机中的 copytest
文件将被覆盖。
$ ansible all -m copy -a 'src=/root/copytest dest=/opt'
例 2:在远程主机的 /opt
目录下生成文件 test
,文本内容为 aaa
,当使用 content
指定文件内容时,dest
参数对应的值必须是一个文件,而不能是一个目录。
$ ansible all -m copy -a 'content='aaa' dest=/opt/test'
例 3:将 ansible 主机中 /testdir/copytest
文件复制到远程主机的 /opt
目录中时,如果远程主机中已经存在 /opt/copytest
文件,并且文件内容与 ansible 主机中的 copytest
文件的内容不一致,则不执行拷贝操作,远程主机中的 /opt/copytest
文件内容不会被改变。
$ ansible all -m copy -a 'src=/testdir/copytest dest=/opt/ force=no'
例 4:将 ansible 主机中 /testdir/copytest
文件复制到远程主机的/opt目录中时,如果远程主机中已经存在 /opt/copytest
文件,并且文件内容与 ansible 主机中的 copytest
文件的内容不一致,会执行拷贝操作,但是在执行拷贝操作之前,会将远程主机中的原文件重命名,以作备份,然后再进行拷贝操作。
$ ansible all -m copy -a 'src=/testdir/copytest dest=/opt backup=yes'
例 5:拷贝文件时,指定文件的属主,需要注意,远程主机上必须存在对应的用户。
$ ansible all -m copy -a 'src=/testdir/copytest dest=/opt/ owner=zze'
例 6:拷贝文件时,指定文件的属组,需要注意,远程主机上必须存在对应的组。
$ ansible all -m copy -a 'src=/testdir/copytest dest=/opt/ group=zze'
例 7:拷贝文件时,指定文件的权限。
$ ansible all -m copy -a 'src=/testdir/copytest dest=/opt/ mode=0640'
评论区