puppet自動化運維之exec資源

2021-09-20 22:41:25 字數 4960 閱讀 4190

puppet通過exec來執行外部的命令或者指令碼,一般來講是shell指令碼。

這裡面就涉及到乙個重複執行的問題,因為預設的agent一連線上來就會自動執行對應的命令或者指令碼。如果指令碼重複執行對系統沒影響的還無所謂,如果會對系統造成影響呢?

乙個有用的方法是使用像creates引數來,除非達到了某個條件才會執行命令。比如執行之前判斷檔案是否存在等等。你可以使用refreshonly引數限制乙個exec只有收到某個事件才執行。

作用:①、遠端執行系統命令,其實就是shell的呼叫;

②、由於exec是一次性執行資源,在不同類裡面exec名字可相同。

格式:

exec

puppet執行外部命令,多次反覆用這個方式執行命令是有威脅性的,因此建議對執行的命令進行加鎖或者類似的處理.

建議每個exec資源的名字最好是唯一的.

建議屬性值的目錄、命令或檔案,最好是絕對路徑

exec 引數介紹:

command

command => "

執行的命令",

將會被執行的命令,必須為被執行命令的絕對路徑,或者得提供該命令的搜尋路徑。如果命令被成功執行,所有的輸出會被記錄在例項的正常(normal)日誌裡,但是如果命令執行失敗(既返回值與我們所指定的不同),那麼所有的輸出會在錯誤(err)日誌中被記錄。這個是exec資源型別的名變數(namevar)。

creates

creates => "

檔名(絕對路徑)",

指定命令所生成的檔案。如果提供了這個引數,那麼命令只會在所指定的檔案不存在的情況的被執行,下次的時候,該檔案存在了,就不在執行命令。

create屬性表明該exec將建立乙個檔案,當下一次puppet執行的時候,如果發現了這個檔案,就不再執行這個exec資源。

cwdcwd => "

目錄的絕對路徑",

指定命令執行的目錄

。如果目錄不存在,則命令執行失敗。

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

只有在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

上面這段**先用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

exec

要注意的是只有subscribe和notify可以促發行為,而不是require,所以在使用refreshonly時,只有同時使用subscribe或notify才有意義。有效的值為true, false。

returns

指定返回的**。如果被執行的命令返回了其他的**,乙個錯誤(error)會被返回。預設值是0,可以定義為乙個由可以接受的返回**組成的陣列或單值。

timeout

timeout => "

秒數",

命令執行的最長時間。如果命令執行的時間超過了timeout定義的時間,那麼這個命令就會被終止,並作為執行失敗處理。當定義為負值時就會取消執行時間的限制。timeout的值是以秒為單位的。

exec資源在不到萬不得已的時候不要去用,簡單說來exec資源就是在執行puppet的時候,呼叫shell執行一條shell語句

,例如:

exec

exec資源是不太好掌控的資源,如果能用指令碼實現,盡量寫成指令碼通過file資源分發到伺服器上面。然後用其他的方式來呼叫指令碼。例如crontab。或你完全可以用file資源來把crontab任務放到/etc/cron.d目錄下來實現crontab資源的管理。使用puppet的時候,盡量用最簡單的語法,越是花哨的語法也越容易出錯。

例項:

#creates

vi /etc/puppet/manifest/test.pp

#注意命令要使用絕對路徑

exec

exec

#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

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

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

exec

#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

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運維自動化之sshkey管理

puppet運維自動化之sshkey管理 mysqlops 資料庫與運維自動化技術分享 you are here home puppet中文自動化管理 puppet運維自動化之sshkey管理 九月 24,2011 by sky 2 comments ssh key,作為系統管理人員經常會使用ssh...

puppet自動化運維之package資源

package資源管理系統的軟體包安裝,預設是yum源 etc yum.repo.d 的,通過puppet 來自動安裝的軟體包均是通過 yum來安裝的,所以需要先配置好 yum源。作用 管理哪些軟體包被安裝,哪些軟體包被解除安裝 管理軟體包的更新 注 要求系統配置好yum源 redhat系統 格式 ...

Puppet自動化運維排錯案例

近日,自己維護的一組puppet agent機器,出現了如下報錯 12 root client src puppetd test server server.cn7788.com notice run of puppet configuration client alreadyinprogress ...