exec簡介:mysql
Puppet經過exec來執行外部的命令或者腳本,通常來說是shell腳本。sql
這裏面就涉及到一個重複執行的問題,由於默認的agent一鏈接上來就會自動執行對應的命令或者腳本。若是腳本重複執行對系統沒影響的還無所謂,若是會對系統形成影響呢?shell
一個有用的方法是使用像creates參數來,除非達到了某個條件纔會運行命令。好比執行以前判斷文件是否存在等等。你可使用refreshonly參數限制一個exec只有收到某個事件才執行。數組
做用:服務器
①、遠程執行系統命令,其實就是shell的調用;less
②、因爲exec是一次性執行資源,在不一樣類裏面exec名字可相同。ssh
格式:學習
exec {"title": #通常寫上要執行的命令,如不寫,則須要指定commandui cwd => "目錄的絕對路徑", #在那個目錄下執行,也可不要this path => "/bin:/sbin:...", #命令執行的搜索路徑,如不要,需指定命令的絕對路徑 command => "執行的命令", #寫上要執行的命令,通常不須要,可在title中寫上 creates => "文件名(絕對路徑)",#當且僅當,該文件名不存在,命令才被執行,可不要 user => "用戶名", #定義運行命令的用戶。 注意若是你使用了這個參數,那麼任何的錯誤輸出不會在當下被捕捉 logoutput => "true|false", #是否記錄輸出,可取的值爲:true,false和其餘合法的日誌等級。 onlyif => "命令", #如onlyif中命令的執行結果爲0(執行正確),才執行title或command中的目錄,與unless相反 unless => "命令", #如unless中命令的執行結果不爲0(執行出錯),才執行title或command中的目錄,與onlyif相反 }
|
puppet執行外部命令,屢次反覆用這個方式執行命令是有威脅性的,所以建議對執行的命令進行加鎖或者相似的處理.
建議每一個exec資源的名字最好是惟一的.
建議屬性值的目錄、命令或文件,最好是絕對路徑
exec 參數介紹:
command command => "執行的命令",
將會被執行的命令,必須爲被執行命令的絕對路徑,或者得提供該命令的搜索路徑。若是命令被成功執行,全部的輸出會被記錄在實例的正常(normal)日誌裏,可是若是命令執行失敗(既返回值與咱們所指定的不一樣),那麼全部的輸出會在錯誤(err)日誌中被記錄。這個是exec資源類型的名變量(namevar)。
creates creates => "文件名(絕對路徑)",
指定命令所生成的文件。若是提供了這個參數,那麼命令只會在所指定的文件不存在的狀況的被執行,下次的時候,該文件存在了,就不在執行命令。
create屬性代表該exec將建立一個文件,當下一次puppet執行的時候,若是發現了這個文件,就再也不執行這個exec資源。
cwd cwd => "目錄的絕對路徑",
指定命令執行的目錄。若是目錄不存在,則命令執行失敗。
user user => "用戶名",
定義運行命令的用戶。 注意若是你使用了這個參數,那麼任何的錯誤輸出不會在當下被捕捉,這是Ruby的一個bug。
If you are using Puppet to create this user, the exec will automatically require the user, as long as it is specified by name
onlyif onlyif => "命令",
如onlyif中命令的執行結果爲0(執行正確),才執行title或command中的目錄,與unless相反。例如:
exec { "logrotate": path => "/usr/bin:/usr/sbin:/bin", onlyif => "test `du /var/log/messages | cut -f1` -gt 100000" }
只有在test返回true的時候logrotate纔會被運行。
須要注意的是onlyif定義的命令跟主命令遵循一樣的規則,也就是說若是path沒有被設置的話,須要使用絕對路徑。
除此以外,onlyif還能夠接受數組作爲其值,例如:
onlyif => ["test -f /tmp/file1", "test -f /tmp/file2"]
上面的代碼限定了只有在全部數組中的條件返回true時exec纔會被執行。
unless unless => "命令",
如unless中命令的執行結果不爲0(執行出錯),才執行title或command中的目錄,與onlyif相反。例如:
exec { "/bin/echo root >> /usr/lib/cron/cron.allow":
path => "/usr/bin:/usr/sbin:/bin",
unless => "grep root /usr/lib/cron/cron.allow 2>/dev/null"
}
上面這段代碼先用grep在cron.allow文件(Solaris系統中)中找root,若是沒有找到,就寫入root。
要注意的是這個參數裏的命令跟主命令遵循一樣的規則,也就是說若是path沒有被設置的話,須要使用絕對路徑。
path path => "/bin:/sbin:...",
命令執行的搜索路徑。若是path沒有被定義,命令須要使用絕對路徑。路徑能夠以數組或以冒號分隔的形式來定義。
logoutput logoutput => "true|false|on_failure",
是否記錄輸出。默認會根據exec資源的日誌等級(loglevel) 來記錄輸出。若定義爲on_failure,則僅在命令返回錯誤的時候記錄輸出。可取的值爲:true,false和其餘合法的日誌等級。
env:
咱們不建議使用這個參數,請使用‘environment’。這一部分還未完成。
environment
爲命令設定額外的環境變量。要注意的是若是你用這個來設定PATH,那麼PATH的屬性會被覆蓋。多個環境變量應該以數組的形式來設定。
group
定義運行命令的用戶組。在不一樣的平臺下的運行的結果沒法肯定,因爲不一樣用戶運行命令的時候,變量是不變的,因此這是平臺的問題,而不是Ruby或Puppet的問題。
refresh
定義如何更新命令。當exec收到一個來自其餘資源的事件時,默認只會從新執行一次命令。不過這個參數容許你定義更新時執行不一樣的命令。
refreshonly
該屬性可使命令變成僅刷新觸發的,也就是說只有在一個依賴的對象被改變時,命令纔會被執行。僅當命令與其餘對象有依賴關係時,這個參數纔有意義。當你要觸發某個行爲時,會顯得頗有用:
file { "/etc/aliases": source => "puppet://server/module/aliases" } exec { newaliases: path => ["/usr/bin", "/usr/sbin"], subscribe => File["/etc/aliases"], refreshonly => true } |
要注意的是隻有subscribe和notify能夠促發行爲,而不是require,因此在使用refreshonly時,只有同時使用subscribe或notify纔有意義。有效的值爲true, false。
returns
指定返回的代碼。若是被執行的命令返回了其餘的代碼,一個錯誤(error)會被返回。默認值是0,能夠定義爲一個由能夠接受的返回代碼組成的數組或單值。
timeout timeout => "秒數",
命令運行的最長時間。若是命令運行的時間超過了timeout定義的時間,那麼這個命令就會被終止,並做爲運行失敗處理。當定義爲負值時就會取消運行時間的限制。timeout的值是以秒爲單位的。
exec資源在不到萬不得已的時候不要去用,簡單說來exec資源就是在執行puppet的時候,調用shell執行一條shell語句,例如:
exec {"delete config":
path => "/bin:/usr/bin",
command => "rm /etc/ssh/ssh_config";
}
exec資源是不太好掌控的資源,若是能用腳本實現,儘可能寫成腳本經過file資源分發到服務器上面。而後用其餘的方式來調用腳本。例如crontab。或你徹底能夠用file資源來把crontab任務放到/etc/cron.d目錄下來實現crontab資源的管理。使用puppet的時候,儘可能用最簡單的語法,越是花哨的語法也越容易出錯。
實例:
#creates vi /etc/puppet/manifest/test.pp #注意命令要使用絕對路徑 Exec { path => [ "/bin/", "/sbin/" , "/usr/bin/", "/usr/sbin/" ] }
exec { "/tmp/test1": command => "touch /tmp/exec_test1", creates => "/tmp/exec_test1"; }
#check [root@client ~]# ll /tmp/exec_test1 ls: cannot access /tmp/exec_test1: No such file or directory [root@client ~]# [root@client ~]# puppet agent --test -v --server master.perofu.com info: Caching catalog for client.perofu.com info: Applying configuration version '1395071830' notice: /Stage[main]//Exec[/tmp/test1]/returns: executed successfully notice: Finished catalog run in 0.32 seconds [root@client ~]# [root@client ~]# ll /tmp/exec_test1 -rw-r--r-- 1 root root 0 Mar 17 23:58 /tmp/exec_test1 [root@client ~]# #此時creates的參數已知足,就不會再執行了 [root@client ~]# puppet agent --test -v --server master.perofu.com info: Caching catalog for client.perofu.com info: Applying configuration version '1395071830' notice: Finished catalog run in 0.23 seconds [root@client ~]# [root@client ~]# ll /tmp/exec_test1 -rw-r--r-- 1 root root 0 Mar 17 23:58 /tmp/exec_test1 [root@client ~]#
#onlyif Exec { path => [ "/bin/", "/sbin/" , "/usr/bin/", "/usr/sbin/" ] }
exec {"rm -rf /var/log/mysqld.log.bak": logoutput => "on_failure", onlyif => "[ $(cat /var/log/mysqld.log.bak |wc -l) -gt 10 ]";
}
#check [root@client ~]# cat /var/log/mysqld.log.bak |wc -l 21 [root@client ~]# [ `cat /var/log/mysqld.log.bak |wc -l` -gt 10 ] [root@client ~]# echo $? 0 [root@client ~]# puppet agent --test -v --server master.perofu.com info: Caching catalog for client.perofu.com info: Applying configuration version '1395072287' notice: /Stage[main]//Exec[rm -rf /var/log/mysqld.log.bak]/returns: executed successfully notice: Finished catalog run in 0.38 seconds [root@client ~]# ll /var/log/mysqld.log.bak ls: cannot access /var/log/mysqld.log.bak: No such file or directory |
至此,puppet的exec資源就結束了,接下來的是cron資源的學習,請聽下回分解!!!