0

ボックスでchef-clientを実行しても、以前に実行したにもかかわらず、JDKをダウンロードするのに約5分かかります。これを回避する方法はありますか?

[Mon, 22 Oct 2012 13:17:46 -0500] INFO: Processing remote_file[/var/chef/cache/jdk-1.6-u30-linux-amd64.rpm] action create_if_missing (sun_java::default line 18)
[Mon, 22 Oct 2012 13:17:48 -0500] INFO: Processing package[jdk-1.6-u30-linux-amd64.rpm] action install (sun_java::default line 25)
[Mon, 22 Oct 2012 13:21:07 -0500] INFO: package[jdk-1.6-u30-linux-amd64.rpm] installed version 1.6.0_30-fcs
[Mon, 22 Oct 2012 13:21:07 -0500] INFO: package[jdk-1.6-u30-linux-amd64.rpm] sending run action to bash[update-alternatives java] (immediate)
[Mon, 22 Oct 2012 13:21:07 -0500] INFO: Processing bash[update-alternatives java] action run (sun_java::default line 40)

レシピは以下の通りです。

urlVersion = "1."+node["sun_java"]["version"].sub(/[u]/, "-u")
node.default["sun_java"]["rpm_url"] = "http://***/#{urlVersion}/jdk-#{urlVersion}-linux-#{node["sun_java"]["arch"]}.rpm"

#Check that we are using the .rpm file because of the recent change
if File.extname(File.basename(node["sun_java"]["rpm_url"]))!=".rpm"
  raise "You must use the jdk*.rpm file to install the Sun JDK. You can get it from the jdk*-rpm.bin file by running the command './jdk*-rpm.bin -x'"
end

javaRPM = File.basename(node["sun_java"]["rpm_url"])

remote_file "#{Chef::Config[:file_cache_path]}/#{javaRPM}" do
  action :create_if_missing
  source node["sun_java"]["rpm_url"]
  mode "0755"
  backup false
end

package javaRPM do
  action :install
  source "#{Chef::Config[:file_cache_path]}/#{javaRPM}"
  options "--nogpgcheck" # sun/oracle doesn't sign their RPMs o_O
  notifies :run, "bash[update-alternatives java]", :immediately
end

javaHomeFolder = "/usr/java/jdk1.#{node["sun_java"]["version"].sub(/[u]/, ".0_")}"
jdkFolder = "#{javaHomeFolder}/bin"
slaveString = ""

node["sun_java"]["update_slaves"].each do |java_bin|
  slaveString = slaveString + "--slave \"/usr/bin/#{java_bin}\" \"#{java_bin}\" \"#{jdkFolder}/#{java_bin}\" "
end

bash "update-alternatives java" do
  action :nothing
  code <<-EOH
    update-alternatives --install "/usr/bin/java" "java" "#{jdkFolder}/java" 1 #{slaveString}
    update-alternatives --set java #{jdkFolder}/java
  EOH
end

#Remove old environment then notify new environment to be created
ruby_block "delete_environement" do
        block do
            editBashrc = Chef::Util::FileEdit.new("/etc/profile")
                editBashrc.search_file_delete_line(/^.*#JAVA_HOME environment settings.*$/)
                editBashrc.search_file_delete_line(/^.*#Auto-generated by Chef Cookbook sun_java.*$/)
                editBashrc.search_file_delete_line(/^.*export JAVA_HOME=.*$/)
                editBashrc.write_file 
        end
        action :create
end

#create environment of root user
execute "create_environment" do
  user "root"
  command "echo -e '#JAVA_HOME environment settings\n#Auto-generated by Chef Cookbook sun_java\nexport JAVA_HOME=#{javaHomeFolder}' >> /etc/profile"
end
4

1 に答える 1

1

5分かかるのはダウンロードではありません。rpm が毎回パッケージを再インストールしているようです (出力は短縮され、コメントが付けられています)。

[Mon, 22 Oct 2012 13:17:46 -0500] Processing remote_file # Download the file
[Mon, 22 Oct 2012 13:17:48 -0500] Processing package # Install the file 2 secs later
[Mon, 22 Oct 2012 13:21:07 -0500] package installed # 3+ minutes later

についてはわかりませんrpmが、Debian のパッケージ管理はデフォルトでインストール済みのパッケージをスキップします。

だから私はあなたのオプションは次のとおりだと思います:

  1. より詳細になるようにchefを構成します。そうすれば、すべてのオプションを使用して呼び出しを追跡し、シェルから同じコマンドを実行して動作を再現するかどうかを確認できます。
  2. rpmが Debian と同じように動作するかどうかを調べますdpkg(上記を参照)。そうでない場合は、既にインストールされているパッケージをスキップするように指示します。
  3. パッケージのバージョンを確認してください。パッケージのバージョンが毎回同じ場合は、(1) に進みます。rpmそうでない場合は、同様のバージョンをスキップできるかどうかを確認してください。
  4. リソースを使用せずにpackage、手動でパッケージをインストールします (他のすべてのオプションが失敗した場合にのみ使用してください)。たとえば、executeリソースを使用して、パッケージが既にインストールされていることを Chef に知らせるインジケーター ファイルを作成できます。

オプション #4 の疑似コード:

execute "install Java by hand" do
  command "rpm install <pkg> && touch /home/user/java_installed"
  creates "/home/user/java_installed"
end
于 2012-10-23T09:12:56.523 に答える