Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make chef check for RPM package and then install?

Tags:

rpm

chef-infra

I am currently using chef to install the RPM JDK package but the problem is that it does it every single time even if the package is already downloaded and installed. I tried finding an option for checking before installing but there wasn't any. Is there a way to get around this such that I can skip packages that are already installed? Debian's package management skips already installed packages by default, but RPM package manager doesn't seem to do that.

[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)

The recipe is show below:

    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
like image 830
noMAD Avatar asked Oct 23 '12 15:10

noMAD


People also ask

How do I test an rpm before installation?

To test the rpm package before installation we will use the --test option with rpm command. The command will not install rpm but it will only test the package. Syntax: Replace the PACKAGE-NAME.

What is the command to install RPM packages?

We can install the RPM package with the following command: rpm -ivh <package name> . Note the -v option will show verbose output and the -h will show the hash marks, which represents action of the progress of the RPM upgrade. Lastly, we run another RPM query to verify the package will be available.

Can you use yum to install rpm?

Install RPM File with Yum Alternately, you can use the yum package manager to install . rpm files. The localinstall option instructions yum to look at your current working directory for the installation file. Note: YUM stands for Yellowdog Updater Modified.


1 Answers

Chef provide a resource for rpm_packages. and you can find a lot numbers of examples that show how chef verify if a package is installed

like image 192
Robert Avatar answered Sep 30 '22 06:09

Robert