2016-01-05 65 views
0

我有一個自定義puppet的事實(用ruby編寫),它執行一個簡單的bash腳本。腳本檢查文件系統中的所有文件以獲得世界可讀的權限並相應地返回結果。傀儡事實檢查腳本的輸出,如果腳本輸出不爲空,則返回「失敗」。如何安排木偶自定義事實每隔X小時執行一次?

問題是腳本是資源密集型的,我不希望它每30分鐘執行一次(客戶端'puppet.conf:runinternval = 1800)。

我試過使用「日程表」資源,但由於傀儡工作方式,它隻影響我用來評估事實的輸出的類。無論其他事情如何,木偶運行中都會對木偶事實進行評估。 (從而使它們可用於資源)

我也嘗試將執行bash腳本的代碼從事實移到puppet類中,但它看起來無法評估bash腳本的輸出(使用「 exec「類型)並將其存儲在一個變量中(再次,因爲木偶的工作方式)。

我現在正在嘗試應用某種使用Ruby語言的調度機制,並在實際中實現它。我已經閱讀了一些PStore,現在看來這是一個很好的方向。

有誰知道我可以如何使一個紅寶石腳本只在夜間執行?我不能使用crontab,因爲代碼將由puppet運行。從木偶類

代碼段:從木偶事實

if $::myfact == 'fail' { 
    notify { "warning blah blah...": 
    loglevel => err, 
    schedule => 'night', 
    } 
} 

代碼片段:

require 'facter' 
Facter.add(:myfact) do 
    setcode do 
    if File.exists? '/usr/local/puppet/scripts/myscript.sh' 
     result = Facter::Util::Resolution.exec("/usr/local/puppet/scripts/myscript.sh") 
     if result != '' 
     puts "Result of myfact is: \n #{result}" 
     'fail' 
    end 
    end 
end 

回答

1

您的自定義其實可以在一個文件某處紀念它的結果系統。評估時,它可以將該文件的時間戳與當前系統時間進行比較,並且可以回讀該值或根據情況重新進行計算。這也允許您推遲更新(例如,通過文件的touch)或手動請求重新評估(通過刪除文件)。

但是,考慮將昂貴的評估與事實收集分離是否合理。即使Facter只是偶爾需要從頭開始重新評估這個事實,Facter - 因此Puppet - 將花費很長時間來執行這些運行。您可以考慮改爲使用預定作業以您喜歡的任何時間間隔執行評估,並且自定義事實總是依賴於來自最新評估的緩存結果。

+0

「...使用預定作業執行評估......」這意味着我需要使用crontabs和本地緩存來使我的puppet代碼複雜化,不是嗎? – amirb

+1

@amirb而不是使你的事實代碼複雜化,是的。是的,你應該這樣做。 –

相關問題