一、概述
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
}
可以看到,執行前後的變化

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
}
可以看到執行前後的變化
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
}