10

現在、chefを使用してRPM JDKパッケージをインストールしていますが、問題は、パッケージが既にダウンロードおよびインストールされている場合でも、毎回インストールされることです。インストールする前にチェックするオプションを見つけようとしましたが、何もありませんでした。すでにインストールされているパッケージをスキップできるようにこれを回避する方法はありますか?Debianのパッケージ管理は、デフォルトですでにインストールされているパッケージをスキップしますが、RPMパッケージマネージャーはそれを行わないようです。

[Tue, 23 Oct 2012 10:34:32 -0500] INFO: Processing remote_file[/var/chef/cache/jdk-1.6-u30-linux-amd64.rpm] action create_if_missing (sun_java::default line 18)
[Tue, 23 Oct 2012 10:34:36 -0500] INFO: Processing package[jdk-1.6-u30-linux-amd64.rpm] action upgrade (sun_java::default line 25)
[Tue, 23 Oct 2012 10:37:15 -0500] INFO: Processing bash[update-alternatives java] action nothing (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

5 に答える 5

16

私はこれが古いことを知っていますが、あなたが望むと信じています:

remote_file "your-remote-file" do
  ...
  not_if "rpm -qa | grep -qx 'your-package'"
end
于 2013-07-09T17:30:05.747 に答える
3

私はRPMに精通していませんが、パッケージがすでにインストールされているかどうかをchefがどのように学習するかを確認できます(load_current_resourceメソッド)。レシピに同様の何かを実装して、この条件をremote_fileに追加できます。

remote_file "#{Chef::Config[:file_cache_path]}/#{javaRPM}" do
  not_if { [your_code_that_checks_if_package_installed] }
  ...
end
于 2012-10-24T08:02:44.563 に答える
1

Chefはrpm_packagesのリソースを提供します。パッケージがインストールされているかどうかをシェフが確認する方法を示す多くの例を見つけることができます

于 2014-01-17T17:17:57.467 に答える
1

最初にを使用してパッケージを削除してignore_failureから、インストールすることができます

package 'package_name'
  ignore_failure true
  action         :remove
end

次に、ファイルを取得します

remote_file localPath do
    source packageUrl
    mode 0644
    checksum checkSum
end

次に、パッケージをインストールします

package packageName do
      source localPath
      action :install
      allow_downgrade true
end

これは、どのパッケージタイプでも機能します。rpmの場合、理想的にはパッケージを削除する必要はありません。allow_downgrade動作するはずです。しかし、それは私にはうまくいきませんでした。

チェックサム用curl packageUrl | shasum -a 256

于 2015-07-14T00:17:47.550 に答える
1

not_ifには別の方法があります。以下の例を参照してください

execute 'yum -y install ntp' do
  not_if "rpm -qa | grep 'ntp'"
end
于 2018-09-05T19:55:21.977 に答える