天天看點

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
}
           

可以看到,執行前後的變化

09-copy子產品Ansible常用子產品

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
}
           

可以看到執行前後的變化

09-copy子產品Ansible常用子產品

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
}
           
09-copy子產品Ansible常用子產品
上一篇: 檔案權限

繼續閱讀