自動化運維工具——Ansible(七)——文件操作之file模塊
1. file模塊介紹
file模塊可以幫助我們完成一些對文件的基本操作,比如,創建文件或目錄、刪除文件或目錄、修改文件權限等
2. 常用參數
此處我們介紹一些file模塊的常用參數,然後再給出對應示例。
- path參數 :必須參數,用於指定要操作的文件或目錄,在之前版本的ansible中,使用dest參數或者name參數指定要操作的文件或目錄,爲了兼容之前的版本,使用dest或name也可以。
- state參數 :此參數非常靈活,此參數對應的值需要根據情況設定,比如,當我們需要在遠程主機中創建一個目錄的時候,我們需要使用path參數指定對應的目錄路徑,假設,我想要在遠程主機上創建/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,可以遞歸的修改目錄中文件的屬性。
3. 使用示例
3.1 示例一
在testB主機上創建一個名爲testfile的文件,如果testfile文件已經存在,則會更新文件的時間戳,與touch命令的作用相同。
#server4中
mkdir /testdir
cd /testdir/
#server1中
ansible testB -m file -a "path=/testdir/testfile state=touch"
server4中查看:
再次執行:
如果testfile文件已經存在,則會更新文件的時間戳,與touch命令的作用相同
3.2 示例二
在testB主機上創建一個名爲testdir的目錄,如果testdir目錄已經存在,則不進行任何操作。
#server1中
ansible testB -m file -a "path=/testdir/testdir state=directory"
server4中查看:
再次執行:
如果testdir目錄已經存在,則不進行任何操作。
3.3 示例三
在testB上爲testfile文件創建軟鏈接文件,軟鏈接名爲linkfile,執行下面命令的時候,testfile已經存在。
#server1中
ansible testB -m file -a "path=/testdir/linkfile state=link src=/testdir/testfile"
server4中查看:
3.4 示例四
在testB上爲testfile文件創建硬鏈接文件,硬鏈接名爲hardfile,執行下面命令的時候,testfile已經存在。
#server1中
ansible testB -m file -a "path=/testdir/hardfile state=hard src=/testdir/testfile"
server4中查看:
3.5 示例五
在創建鏈接文件時,如果源文件不存在,或者鏈接文件與其他文件同名時,強制覆蓋同名文件或者創建鏈接文件,參考上述force參數的解釋。
#server1中
ansible testB -m file -a "path=/testdir/linkfile state=link src=sourcefile force=yes"
server4中查看:
3.6 示例六
刪除遠程機器上的指定文件或目錄
#server1中
ansible testB -m file -a "path=/testdir/testdir state=absent"
server4中查看:
3.7 示例七
在創建文件或目錄的時候指定屬主,或者修改遠程主機上的文件或目錄的屬主。
touch命令會修改時間戳
#server1中
ansible testB -m file -a "path=/testdir/abc state=touch owner=kaiser"
server4中查看:
#server1中
ansible testB -m file -a "path=/testdir/abc owner=kaiser"
server4中查看:
#server1中
ansible testB -m file -a "path=/testdir/aaa state=directory owner=kaiser"
server4中查看:
3.8 示例八
在創建文件或目錄的時候指定屬組,或者修改遠程主機上的文件或目錄的屬組。
#server1中
ansible testB -m file -a "path=/testdir/abb state=touch group=kaiser"
server4中查看:
#server1中
ansible testB -m file -a "path=/testdir/abb group=kaiser"
server4中查看:
#server1中
ansible testB -m file -a "path=/testdir/bbb state=directory group=kaiser"
server4中查看:
3.9 示例九
在創建文件或目錄的時候指定權限,或者修改遠程主機上的文件或目錄的權限。
#server1中
ansible testB -m file -a "path=/testdir/abb state=touch mode=0666"
server4中查看:
#server1中
ansible testB -m file -a "path=/testdir/abb mode=0666"
server4中查看:
#server1中
ansible testB -m file -a "path=/testdir/abb mode=4700"
server4中查看:
#server1中
ansible testB -m file -a "path=/testdir/abb state=directory mode=0644"
server4中查看:
3.10 示例十
當操作遠程主機中的目錄時,同時遞歸的將目錄中的文件的屬主屬組都設置爲kaiser。
#server1中
ansible testB -m file -a "path=/testdir/123/321 state=directory owner=kaiser group=kaiser recurse=yes"
server4中查看: