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
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.
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.
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With