puppet
學習之exec資源管理
一、puppet exec
簡介puppet
通過exec來執行外部的命令或者指令碼,一般來講是shell指令碼
。這裡面就涉及到乙個重複執行的問題,因為預設的agent一連線上來就會自動執行對應的命令或者指令碼。如果指令碼重複執行對系統沒影響的還無所謂,如果會對系統造成影響呢?乙個有用的方法是使用像creates引數檢查來避免執行命令,除非達到了某個條件才會指定。比如執行之前判斷檔案是否存在等等。你可以使用refreshonly引數限制乙個exec只有收到某個事件才執行。
二、puppet exec
引數介紹
1.command
指定要執行的命令。如果忽略,這個引數的值預設為資源的標題。必須填寫命令的完整路徑或者提供這個命令的查詢路徑。假如命令執行成功,執行過程的輸出將會記錄到普通(normal)日誌中,但是如果命令執行失敗,任何的輸出都會記錄到錯誤日誌中。
2.creates
命令建立的乙個檔案。加入這個引數設定的話,只有這個檔案不存在的時候命令才會執行,比如下面的例子:
exec
這例子中,只有
/var/tmp/myfile
檔案不存在的時候,tar -xf /volumes/nfs02/important.tar命令才會執行。
3.cwd
命令執行的路徑。假如目錄不存在,命令執行將會失敗。
4.environment
為命令設定附加的環境變數。加入你用這個引數設定path,那麼將會把path引數的值覆蓋。多個環境變數需要使用陣列指定。
5.group
執行命令執行的使用者組。這個看起來在各個平台執行結果不確定,這是平台的問題不是ruby或者puppet的問題。
6.logoutput
是否記錄輸出資訊。缺省會根據exec資源的日誌等級來記錄輸出資訊,使用on_failure只有當命令執行出錯的時候才會記錄輸出資訊。值可以為true、fales、on_failure和任何合法的日誌等級。
7.onlyif
只有onlyif指定命令執行返回為0的時候,命令才會執行。比如下面的例子:
exec
只有當test `du /var/log/messages | cut -f1` -gt 100000
執行的結果返回為0,也就是執行成功才與執行logrotate命令。onlyif中指定的命令加入沒有設定path的話要指定完整路徑。onlyif也可以將陣列作為他的值,比如:
onlyif => ["test -f
/tmp/file1", "test -f /tmp/file2"]
只有當陣列中的所有命令都返回true的時候才會執行命令。
8.path
命令執行搜尋的路徑。如果沒有指定path,命令需要填寫完整的路徑。路徑可以指定為乙個陣列並通過冒號分隔。
9.provider
exec
資源的特定後台。一般很少需要指定這個,puppet一般會自動為你的平台發現合適的provider,可用的provider如下:
øposix ----
不通過shell
解釋或者執行如何插值,直接執行外部的二進位制檔案,這是乙個執行大多數命令都更安全更確定的方式。但是阻止萬用字元和
shell
內建外掛程式的使用
(包括像
for這樣的控制邏輯和
if語句)ø
shell ----
通過/bin/sh
來解釋提供的命令,只在
posix
系統中可用。致個模式允許使用萬用字元和
shell
內建外掛程式,並且不需要為命令的路徑指定完整的路徑。雖然
shell
比posix
更方便,但是同時也意味著在轉譯方面更小心。這個
shell
的exec
型別在puppet 0.25.x.
版本提供。
øwindows ----
在windows
系統上執行外部的二進位制檔案。和
posix
模式一樣,這個模式通過給定的引數直接呼叫命令,不通過
shell
解釋或者執行如何插值。
10.refresh
如何更新命令。預設的當exec收到其他的資源的乙個事件時會重新執行。但是這個引數允許你定義更新不同的命令。
11.refreshonly
作為乙個更新機制當乙個依賴的物件改變的時候命令才會執行。當這個命令依賴其他物件的時候這個選項才會有意義。當需要出發某個行為的時候會非常有用。比如下面的例子:
# pull down the main aliases file
file
# rebuild the database, but only when
the file changes
exec
只有當/etc/aliases檔案改變的時候才會觸發從master中獲取aliases檔案到/etc/
aliases。
備註:只有subscribe和notify才可以觸發行為,而不是require,所以只有使用refreshonly和subscribe或notify一起使用的時候有意義。可用的值為true或false。
12.returns
指定預期的返回**。假如執行的命令返回其他的**那麼將會出現錯誤。預設是0,可以指定乙個單一的值也可以指定乙個包含多個值的陣列。
13.timeout
指定命令執行的最長時間。假如命令執行的時間查過timeout設定的時間,那麼就會認為命令執行失敗了並且會停止該命令。設定為0表示沒有執行時間限制。時間以秒為單位。
14.tries
命令執行重試次數,預設為1。設定這個引數命令將會重試你設定的次數直到合理的**返回。
15.try_sleep
設定命令重試的間隔時間,單位是秒。
16.unless
加入這個引數設定的話,然後exec會執行,除非unless的命令返回為0,例:
exec
這段**將會將root新增到/usr/lib/cron/cron.allow檔案中,除非grep發現root已經在那個檔案裡了。
17.user
指定執行命令的使用者。
備註:加入你使用這個引數,任何錯誤輸出不會在當下撲捉。這是源自
ruby
內部的乙個
bug。
三、puppet exec
實戰1.
如果不存在就建立乙個空檔案,**如下:
exec
這裡沒有指定
path
,命令又沒有寫完整路徑,因此報如下錯誤,解決辦法是加上
path
或者為touch
寫完整路徑。
/tmp/test1' is not qualified and no path was specified. please qualify the
command or specify a path.
更改後**為:
exec
或者:exec
為了方便可以設定乙個預設的
path
,這樣就不會每次都要寫
path
了。exec
2.自動安裝
nagios
客戶端的完整示例,**如下:
node 'node1.zhang.com'
#解壓原始碼包
exec
#執行安裝指令碼
exec }3.
滿足某個條件的時候執行
exec
,**如下:#當
result.log
超過1k
的就刪除該檔案
exec
奇怪的是我將
cut換成
awk:
exec ' ` -gt
1024"}4.
當資源有依賴的時候,如果某個檔案發生變更,
exec
就執行對應的命令,下面是乙個
ftp虛擬帳號管理的觸發條件,**如下:
#設定乙個公共的
path
exec #設定
vftpuser.txt
資源file#當
vftpuser.txt
發生變更的時候進行更
ftp的賬戶資訊
exec
四、參考鏈結
puppet自動化運維之exec資源
puppet通過exec來執行外部的命令或者指令碼,一般來講是shell指令碼。這裡面就涉及到乙個重複執行的問題,因為預設的agent一連線上來就會自動執行對應的命令或者指令碼。如果指令碼重複執行對系統沒影響的還無所謂,如果會對系統造成影響呢?乙個有用的方法是使用像creates引數來,除非達到了某...
puppet 基礎 資源
常用資源 user group package file service exec cron notify 使用者組資源 使用者資源 ensure present,gid 102 allowdupe true,ensure present,uid 501 allowdupe true,當進行使用者管...
Puppet 系統服務資源
puppet自動化 服務資源 service資源 管理系統執行的服務程序 不幸的是不同的系統管理服務的方式是多樣的 有些系統上面對於服務管理很簡單 有些系統提供複雜的強大的服務管理功能 puppet 提供最基本的服務管理 你也可以指定 provider,使用一些特性.引數 binary 執行服務的命...