puppet自動化運維之exec資源

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資源的學習,請聽下回分解!!!

相關文章
相關標籤/搜索