2016-01-27 17 views
0

我已經構建了一段來從我們的服務器中刪除ruby gem包。問題是ruby gem可執行文件安裝在服務器上的不同路徑中,所以在一臺服務器上,它可能位於/usr/local/rvm/rubies/ruby-2.0中的其他服務器上的/ opt/ruby​​/bin/gem中的3.0 P353 /斌/寶石Puppet:生成語句在嘗試檢索可執行文件的默認路徑時失敗

我節使用生成函數的傀儡拉出默認紅寶石寶石安裝如下:

$ruby_gem_location = generate('which', 'gem') 
exec { "remove-remote_syslog": 
     command => "gem uninstall remote_syslog", 
     path => "$ruby_gem_location:/opt/ruby/bin:/usr/bin:/usr/sbin", 
     onlyif => "$ruby_gem_location list|grep remote_syslog" 
     } 

當我運行木偶代理我得到以下錯誤:

發電機必須完全合格****編輯*

我也試圖爲這些命令提供了一個默認的路徑,如下所示:

$ruby_gem_location = generate('/usr/bin/which', 'gem') 

現在的錯誤說:無法評價:找不到命令「在/ usr/bin中/寶石

我檢查目標服務器和寶石命令是在

/usr/local/rvm/rubies/ruby-2.0.0-p353/bin/gem 

我做錯了什麼?

如何取出我們服務器上的默認ruby gem位置?

預先感謝您

+0

你是通過獨立的Puppet還是master/agent運行? –

回答

1

您的代碼

$ruby_gem_location = generate('/usr/bin/which', 'gem') 

會生成一個完整路徑gem命令(如果成功)。從你描述的結果來看,我認爲它產生'/ usr/bin/gem',這可能是真正的gem命令的符號鏈接。你把它放到你的命令路徑而不是目錄部分,這不會有幫助。但是,它不是您報告的錯誤消息的來源。

這裏真正的問題是generate()與所有DSL功能一樣,在目錄構建過程中運行。我從您的結果推斷出您使用的是主設備/代理設置,因此generate()正在爲您提供gem的完整路徑 - 顯然/usr/bin/gem-在主設備上。由於整個問題是不同的服務器在不同的地方安裝了gem,這是無益的。實際的錯誤信息是由於嘗試執行onlyif命令而導致錯誤路徑爲gem而引起的。

您最好的前進方式可能是創建一個自定義事實,每個節點都可以通過該自定義事實報告gem二進制文件的相應位置。然後,您可以使用這一事實的價值在你Exec的,也許:

exec { "remove-remote_syslog": 
    command => "$::ruby_gem_path uninstall remote_syslog", 
    onlyif => "$::ruby_gem_path list | grep remote_syslog" 
} 

需要注意的是你,如果你給一個完整的路徑,以在第一時間可執行不需要path屬性。

有關創建$::ruby_gem_path定製事實的詳細信息取決於許多因素,並且完全一般,它們對於SO來說太寬泛,但PL提供了good documentation

+0

太棒了!謝謝你這工作完美無瑕! –