09-copy模块Ansible常用模块

简介: 09-copy模块Ansible常用模块

一、概述
copy 模块的作用就是拷贝文件,它与之前介绍过的 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表示。
三、示例
1.将 ansible 管理主机中 /testdir/copytest 文件复制到远程主机的 /testdir 目录下。
ansible 管理主机中的文件内容为:

[root@ansible-manager ~]# cat /testdir/copytest 
123
456

执行 copy:

[root@ansible-manager ~]# ansible ansible-demo3 -m copy -a "src=/testdir/copytest dest=/testdir/"
ansible-demo3 | FAILED! => {
    "changed": false, 
    "checksum": "47ce3ac56f911ac44537d6a3802b72ceed71e152", 
    "msg": "Aborting, target uses selinux but python bindings (libselinux-python) aren't installed!"
}

根据报错信息,ansible-demo3 主机需要安装 libselinux-python。
[root@ansible-demo3 ~]# yum install libselinux-python -y
1
安装完毕后,再次执行:

[root@ansible-manager ~]# ansible ansible-demo3 -m copy -a "src=/testdir/copytest dest=/testdir/"
ansible-demo3 | SUCCESS => {
    "changed": true, 
    "checksum": "47ce3ac56f911ac44537d6a3802b72ceed71e152", 
    "dest": "/testdir/copytest", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "c010aff9dc6276fdb7efefd1a2757658", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "system_u:object_r:default_t:s0", 
    "size": 8, 
    "src": "/root/.ansible/tmp/ansible-tmp-1526023671.74-99930404286274/source", 
    "state": "file", 
    "uid": 0

}

成功执行后,看看 ansible-demo3 的 /testdir/copytest 文件:

[root@ansible-demo3 ~]# cat /testdir/copytest 
123
456

2.在远程主机的 /testdir 目录下生成文件 testfile1,testfile1 文件中有两行文本,第一行文本为 aaa,第二行为 bbb,当使用 content 指定文件内容时,dest 参数对应的值必须是一个文件,而不能是一个路径。

[root@ansible-manager ~]# ansible ansible-demo3 -m copy -a 'content="aaa\nbbb\n" dest=/testdir/testfile1'
ansible-demo3 | SUCCESS => {
    "changed": true, 
    "checksum": "90c206af0bfefa95541d3e724efe1dbc1ed3877f", 
    "dest": "/testdir/testfile1", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "8b652b8c79f357694a04bd793f533c96", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:default_t:s0", 
    "size": 8, 
    "src": "/root/.ansible/tmp/ansible-tmp-1526113265.26-187047800648668/source", 
    "state": "file", 
    "uid": 0
}

因为 ansible-demo3 主机上面之前已经存在 /testdir/testfile1 文件,所以执行成功后返回 “changed” 为 true。
可以看到,文件内容已经改写:

执行前
[root@ansible-demo3 ~]# cat /testdir/testfile1

执行后
[root@ansible-demo3 ~]# cat /testdir/testfile1
aaa
bbb

3.将 ansible 主机中 /testdir/copytest 文件复制到远程主机的 /testdir 目录中时,如果远程主机中已经存在 /testdir/copytest文件,并且文件内容与 ansible 主机中的 copytest 文件的内容不一致,则不执行拷贝操作,远程主机中的 /testdir/copytest 文件内容不会被改变。

[root@ansible-manager ~]# ansible ansible-demo3 -m copy -a "src=/testdir/copytest dest=/testdir/ force=no"
ansible-demo3 | SUCCESS => {
    "changed": false, 
    "dest": "/testdir/", 
    "src": "/testdir/copytest"
}

4.将 ansible 主机中 /testdir/copytest 文件复制到远程主机的 /testdir 目录中时,如果远程主机中已经存在 /testdir/copytest文件,并且文件内容与 ansible 主机中的 /testdir/copytest 文件的内容不一致,会执行拷贝操作,但是在执行拷贝操作之前,会将远程主机中的原文件重命名,以作备份,然后再进行拷贝操作。
先修改 /testdir/copytest 文件

[root@ansible-manager ~]# cat /testdir/copytest 
123
456
[root@ansible-manager ~]# vi /testdir/copytest 
[root@ansible-manager ~]# cat /testdir/copytest 
123
456
789

执行 copy

[root@ansible-manager ~]# ansible ansible-demo3 -m copy -a "src=/testdir/copytest dest=/testdir/ backup=yes"
ansible-demo3 | SUCCESS => {
    "backup_file": "/testdir/copytest.20579.2018-05-12@16:31:27~", 
    "changed": true, 
    "checksum": "a8d207d098d939cb0dc9df1f3a2b986d6d4499b2", 
    "dest": "/testdir/copytest", 
    "gid": 0, 
    "group": "root", 
    "md5sum": "a2ef74a76b2bfcfe14817a27c511759c", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "system_u:object_r:default_t:s0", 
    "size": 12, 
    "src": "/root/.ansible/tmp/ansible-tmp-1526113886.45-35720740584873/source", 
    "state": "file", 
    "uid": 0
}

查看 ansible-demo3 主机 /testdir 下面的文件
copytest.20579.2018-05-12@16:31:27~ 为备份的文件

[root@ansible-demo3 ~]# ls /testdir/
copytest  copytest.20579.2018-05-12@16:31:27~  test  testfile1  testfile2
[root@ansible-demo3 ~]# cat /testdir/copytest
123
456
789
[root@ansible-demo3 ~]# cat /testdir/copytest.20579.2018-05-12\@16\:31\:27~ 
123
456

5.拷贝文件时,指定文件的属主,需要注意,远程主机上必须存在对应的用户。

[root@ansible-manager ~]# ansible ansible-demo3 -m copy -a "src=/testdir/copytest dest=/testdir/ owner=ding"
ansible-demo3 | SUCCESS => {
    "changed": true, 
    "checksum": "a8d207d098d939cb0dc9df1f3a2b986d6d4499b2", 
    "dest": "/testdir/copytest", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "ding", 
    "path": "/testdir/copytest", 
    "secontext": "system_u:object_r:default_t:s0", 
    "size": 12, 
    "state": "file", 
    "uid": 1000
}

可以看到,执行前后的变化
18.png

6.拷贝文件时,指定文件的属组,需要注意,远程主机上必须存在对应的组。

[root@ansible-manager ~]# ansible ansible-demo3 -m copy -a "src=/testdir/copytest dest=/testdir/ group=ding"
ansible-demo3 | SUCCESS => {
    "changed": true, 
    "checksum": "a8d207d098d939cb0dc9df1f3a2b986d6d4499b2", 
    "dest": "/testdir/copytest", 
    "gid": 1000, 
    "group": "ding", 
    "mode": "0644", 
    "owner": "ding", 
    "path": "/testdir/copytest", 
    "secontext": "system_u:object_r:default_t:s0", 
    "size": 12, 
    "state": "file", 
    "uid": 1000
}

可以看到执行前后的变化
19.png

7.拷贝文件时,指定文件的权限。

[root@ansible-manager ~]# ansible ansible-demo3 -m copy -a "src=/testdir/copytest dest=/testdir/ mode=0640"
ansible-demo3 | SUCCESS => {
    "changed": true, 
    "checksum": "a8d207d098d939cb0dc9df1f3a2b986d6d4499b2", 
    "dest": "/testdir/copytest", 
    "gid": 1000, 
    "group": "ding", 
    "mode": "0640", 
    "owner": "ding", 
    "path": "/testdir/copytest", 
    "secontext": "system_u:object_r:default_t:s0", 
    "size": 12, 
    "state": "file", 
    "uid": 1000
}

可以看到执行前后的变化
20.png

目录
相关文章
|
运维 Shell Linux
Ansible自动化运维工具之常用模块使用实战(5)
Ansible自动化运维工具之常用模块使用实战(5)
390 0
|
4月前
|
缓存 Shell Linux
[ansible]常用内置模块
[ansible]常用内置模块
|
5月前
|
Shell 应用服务中间件 Linux
Ansible的常用模块
Ansible的常用模块
132 6
|
5月前
|
Shell 数据安全/隐私保护
Ansible Ad-hoc,命令执行模块
Ansible Ad-hoc,命令执行模块
53 1
|
5月前
|
运维 Linux 应用服务中间件
Linux之自动化运维工具ansible、ansible模块(2)
Linux之自动化运维工具ansible、ansible模块(2)
|
5月前
|
运维 Linux Shell
Linux之自动化运维工具ansible、ansible模块(1)
Linux之自动化运维工具ansible、ansible模块(1)
|
7月前
|
算法 安全 Linux
Ansible 中的copy 复制模块应用详解
Ansible 中的copy 复制模块应用详解
491 1
|
运维 Linux
Ansible自动化运维工具之常用模块使用实战(6)
Ansible自动化运维工具之常用模块使用实战(6)
192 0
|
网络安全 数据安全/隐私保护
ansible的get_url模块
ansible的get_url模块
146 1
|
存储 Linux Python
ansible手动添加模块
ansible手动添加模块
104 0