2016-04-24 11 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"' 

それは私がnode.eachの内側にそれを宣言するときにレシピの方法である「only_if」と考えて、なぜ私は理解していませんブロック。

これを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をチェックするか、シェフがtemplateリソースを通じてファイル全体を管理することを検討してください。

+0

おかげさまで、テンプレートが適切でないようにJDKを更新した後、このレシピが呼び出されます。私は大いに助けとリンクに感謝します。 – user3481957

+0

標準のシェルinitテンプレートを用意しておき、 '〜/ .env.d /'のようなものを作成して、そのすべてがそのメインテンプレートのソースとなる余分なファイルを削除したいと思うでしょう。 – coderanger

関連する問題