一、概述
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"