4

を使用してJavaをインストールしようとしてchef-soloいます。問題は、JAVA_HOMEPATH変数を/etc/profileファイルに設定することです。'file'シェフから提供されたリソースを使ってみました。これが私のコードの一部です:

java_home = "export JAVA_HOME=/usr/lib/java/jdk1.7.0_05"
path = "export PATH=$PATH:/usr/lib/java/jdk1.7.0_05/bin"

execute "make_dir" do
  cwd "/usr/lib/"
  user "root"
  command "mkdir java"
end

execute "copy" do
  cwd "/usr/lib/java"
  user "root"
  command "cp -r /home/user/Downloads/jdk1* /usr/lib/java"
end

file "/etc/profile" do
  owner "root"
  group "root"
  action :touch
  content JAVA_HOME
  content PATH
end

しかし、問題はcontentコマンドがファイルのすべてのコンテンツを上書きすることです。chef-soloリソースを使用しながらファイルを更新する方法はありますか。ありがとう!

更新:私はからいくつかのコードを見つけましたが、それが正確に何をするのかわかりchef-recipeません、コードは..

ruby_block  "set-env-java-home" do
  block do
    ENV["JAVA_HOME"] = java_home
  end
end

そのインスタンスに対してのみJAVA_HOME変数を設定しますか、それとも永続的に設定しますか?誰か助けてもらえますか?

4

3 に答える 3

13

Chef::Util::FileEditを使用します。以下は、私が変更する方法の例.bashrcです。ここでのアイデアは、次のように追加することです。

# Include user specific settings
if [ -f ~/.bashrc_user ]; then . ~/.bashrc_user; fi

デフォルトの最後まで、他のすべての変更は私のクックブックの一部で.bashrc行われます。.bashrc_user

cookbook_file "#{ENV['HOME']}/.bashrc_user" do
  user "user"
  group "user"
  mode 00644
end

ruby_block "include-bashrc-user" do
  block do
    file = Chef::Util::FileEdit.new("#{ENV['HOME']}/.bashrc")
    file.insert_line_if_no_match(
      "# Include user specific settings",
      "\n# Include user specific settings\nif [ -f ~/.bashrc_user ]; then . ~/.bashrc_user; fi"
    )
    file.write_file
  end
end
于 2013-02-22T15:59:52.037 に答える
0

ファイル リソースの代わりにテンプレート リソースを使用するか、これら 2 つの変数を追加するだけの場合は、次のようにしてください。

content "#{java_home}\n#{path}"

すでに発見したように、2 番目のコンテンツ行は最初の行を上書きしています。も必要ありませんaction :touch

于 2012-08-23T22:57:31.377 に答える