2016-04-24 84 views
0

我試圖在安裝JDK後更新某些用戶.bashrc JAVA_HOME環境變量。我得到這個我不明白的奇怪錯誤。這是有問題的代碼塊。廚師更新某些用戶的.bashrc

node['etc']['passwd'].each do |user, data| 
    only_if {data['uid'] > 9000} 
    jdk_dir_array = Dir.entries('/usr/java/').select {|entry| File.directory? File.join('/usr/java/',entry) and !(entry =='.' || entry == '..') } 
    jdk_dir_name = jdk_dir_array.shift 
    file = Chef::Util::FileEdit.new("#{data['dir']}/.bashrc") 
    file.search_file_replace(/JAVA_HOME=.*/,"JAVA_HOME=/usr/java/#{jdk_dir_name}") 
    file.write_file 
end 

我得到的錯誤是這樣的:

NoMethodError 
------------- 
No resource or method named `only_if' for `Chef::Recipe "install_jdk"' 

我不明白爲什麼它認爲「only_if」是配方的方法,當我宣佈它node.each內塊。

我應該指出,如果我把它放在一個ruby_block中並且硬編碼到單個用戶的主目錄的路徑,代碼將按預期工作。我試圖更新多個用戶,這就是我陷入困境的地方。

回答

1

only_if是您在資源上使用的方法,不是在配方中,也不在ruby_block的塊內。你需要的是更多的東西一樣一樣:

node['etc']['passwd'].each do |user, data| 
    ruby_block "edit #{user} bashrc" do 
    only_if { data['uid'] > 9000 } 
    block do 
    jdk_dir_array = Dir.entries('/usr/java/').select {|entry| File.directory? File.join('/usr/java/',entry) and !(entry =='.' || entry == '..') } 
    jdk_dir_name = jdk_dir_array.shift 
    file = Chef::Util::FileEdit.new("#{data['dir']}/.bashrc") 
    file.search_file_replace(/JAVA_HOME=.*/,"JAVA_HOME=/usr/java/#{jdk_dir_name}") 
    file.write_file 
    end 
end 

我真的不建議這樣做,雖然。查看line cookbook以獲得更加精細的解決方法,或者考慮讓Chef通過template資源管理整個文件。

+0

謝謝,事情是,我更新了JDK後調用了這個配方,所以模板看起來不合適。我非常感謝幫助和鏈接。 – user3481957

+0

你可能想要一個標準的shell init模板,然後創建一些類似'〜/ .env.d /'的地方,你可以在其中放入所有源於該主模板的額外文件。 – coderanger