天天看點

10-Ansible常用子產品-file子產品

一、概述

file 子產品可以幫助我們完成一些對檔案的基本操作。比如,建立檔案或目錄、删除檔案或目錄、修改檔案權限等。

二、常用參數

path參數 :必須參數,用于指定要操作的檔案或目錄,在之前版本的ansible中,使用dest參數或者name參數指定要操作的檔案或目錄,為了相容之前的版本,使用dest或name也可以。

state參數 :此參數非常靈活,其對應的值需要根據情況設定。比如,我們想要在遠端主機上建立/testdir/a/b目錄,那麼則需要設定path=/testdir/a/b,但是,我們無法從”/testdir/a/b“這個路徑看出b是一個檔案還是一個目錄,ansible也同樣無法單單從一個字元串就知道你要建立檔案還是目錄,是以,我們需要通過state參數進行說明。當我們想要建立的/testdir/a/b是一個目錄時,需要将state的值設定為directory,”directory”為目錄之意,當它與path結合,ansible就能知道我們要操作的目标是一個目錄。同理,當我們想要操作的/testdir/a/b是一個檔案時,則需要将state的值設定為touch。當我們想要建立軟連結檔案時,需将state設定為link。想要建立硬連結檔案時,需要将state設定為hard。當我們想要删除一個檔案時(删除時不用區分目标是檔案、目錄、還是連結),則需要将state的值設定為absent,”absent”為缺席之意,當我們想讓操作的目标”缺席”時,就表示我們想要删除目标。

src參數 :當state設定為link或者hard時,表示我們想要建立一個軟鍊或者硬鍊,是以,我們必須指明軟鍊或硬鍊連結的哪個檔案,通過src參數即可指定連結源。

force參數 : 當state=link的時候,可配合此參數強制建立連結檔案,當force=yes時,表示強制建立連結檔案。不過強制建立連結檔案分為三種情況。情況一:當要建立的連結檔案指向的源檔案并不存在時,使用此參數,可以先強制建立對外連結接檔案。情況二:當要建立連結檔案的目錄中已經存在與連結檔案同名的檔案時,将force設定為yes,會将同名檔案覆寫為連結檔案,相當于删除同名檔案,建立連結檔案。情況三:當要建立連結檔案的目錄中已經存在與連結檔案同名的檔案,并且連結檔案指向的源檔案也不存在,這時會強制替換同名檔案為連結檔案。

owner參數 :用于指定被操作檔案的屬主,屬主對應的使用者必須在遠端主機中存在,否則會報錯。

group參數 :用于指定被操作檔案的屬組,屬組對應的組必須在遠端主機中存在,否則會報錯。

mode參數:用于指定被操作檔案的權限,比如,如果想要将檔案權限設定為”rw-r-x---“,則可以使用mode=650進行設定,或者使用mode=0650,效果也是相同的。如果想要設定特殊權限,比如為二進制檔案設定suid,則可以使用mode=4700。

recurse參數:當要操作的檔案為目錄,将recurse設定為yes,可以遞歸的修改目錄中檔案的屬性。

三、示例

1.在 ansible-demo3 主機上建立一個名為 testfile1 的檔案,如果 testfile1 檔案已經存在,則會更新檔案的時間戳,與 touch 指令的作用相同。

[root@ansible-manager ~]# ansible ansible-demo3 -m file -a "path=/testdir/testfile1 state=touch"
ansible-demo3 | SUCCESS => {
    "changed": true, 
    "dest": "/testdir/testfile1", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:default_t:s0", 
    "size": 8, 
    "state": "file", 
    "uid": 0
}
           

2.在 ansible-demo3 主機上建立一個名為 /testdir/testdir 的目錄,如果 /testdir/testdir 目錄已經存在,則不進行任何操作。

[root@ansible-manager ~]# ansible ansible-demo3 -m file -a "path=/testdir/testdir state=directory"
ansible-demo3 | SUCCESS => {
    "changed": true, 
    "gid": 0, 
    "group": "root", 
    "mode": "0755", 
    "owner": "root", 
    "path": "/testdir/testdir", 
    "secontext": "unconfined_u:object_r:default_t:s0", 
    "size": 6, 
    "state": "directory", 
    "uid": 0
}
           

3.在 ansible-demo3 上為 testfile1 檔案建立軟連結檔案,軟連結名為 linkfile1,執行下面指令的時候,testfile1 已經存在。

[root@ansible-manager ~]# ansible ansible-demo3 -m file -a "path=/testdir/linkfile1 state=link src=/testdir/testfile1"
ansible-demo3 | SUCCESS => {
    "changed": true, 
    "dest": "/testdir/linkfile1", 
    "gid": 0, 
    "group": "root", 
    "mode": "0777", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:default_t:s0", 
    "size": 18, 
    "src": "/testdir/testfile1", 
    "state": "link", 
    "uid": 0
}
           

4.在 ansible-demo3 上為 testfile2 檔案建立硬連結檔案,硬連結名為 hardfile2,執行下面指令的時候,testfile2 已經存在。

[root@ansible-manager ~]# ansible ansible-demo3 -m file -a "path=/testdir/hardfile2 state=hard src=/testdir/testfile2"
ansible-demo3 | SUCCESS => {
    "changed": true, 
    "dest": "/testdir/hardfile2", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "secontext": "unconfined_u:object_r:default_t:s0", 
    "size": 0, 
    "src": "/testdir/testfile2", 
    "state": "hard", 
    "uid": 0
}
           

5.在建立連結檔案時,如果源檔案不存在,或者連結檔案與其他檔案同名時,強制覆寫同名檔案或者建立連結檔案,參考上述 force 參數的解釋。

[root@ansible-manager ~]# ansible ansible-demo3 -m file -a "path=/testdir/linkfile3 state=link src=/testdir/sourcefile force=yes"
ansible-demo3 | SUCCESS => {
    "changed": true, 
    "dest": "/testdir/linkfile3", 
    "src": "/testdir/sourcefile", 
    "state": "absent"
}
           

傳回的 state 為 absent,表示源檔案不存在。

6.删除遠端機器上的指定檔案或目錄。

[root@ansible-manager ~]# ansible ansible-demo3 -m file -a "path=/testdir/testdir state=absent"
ansible-demo3 | SUCCESS => {
    "changed": true, 
    "path": "/testdir/testdir", 
    "state": "absent"
}
           

7.在建立檔案或目錄的時候指定屬主,或者修改遠端主機上的檔案或目錄的屬主。

ansible ansible-demo3 -m file -a "path=/testdir/abc state=touch owner=ding"
ansible ansible-demo3 -m file -a "path=/testdir/abc owner=ding"
ansible ansible-demo3 -m file -a "path=/testdir/abc state=directory owner=ding"
           

8.在建立檔案或目錄的時候指定屬組,或者修改遠端主機上的檔案或目錄的屬組。

ansible ansible-demo3 -m file -a "path=/testdir/abb state=touch group=ding"
ansible ansible-demo3 -m file -a "path=/testdir/abb group=ding"
ansible ansible-demo3 -m file -a "path=/testdir/abb state=directory group=ding"
           

9.在建立檔案或目錄的時候指定權限,或者修改遠端主機上的檔案或目錄的權限。

ansible ansible-demo3 -m file -a "path=/testdir/abb state=touch mode=0644"
ansible ansible-demo3 -m file -a "path=/testdir/abb mode=0644"
ansible ansible-demo3 -m file -a "path=/testdir/binfile mode=4700"
ansible ansible-demo3 -m file -a "path=/testdir/abb state=directory mode=0644"
           

10.當操作遠端主機中的目錄時,同時遞歸的将目錄中的檔案的屬主屬組都設定為ding。

ansible ansible-demo3 -m file -a "path=/testdir/abd state=directory owner=ding group=ding recurse=yes"           

繼續閱讀