2012-10-23 11 views
10

Obecnie używam szefa kuchni do zainstalowania pakietu RPM JDK, ale problemem jest to, że robi to za każdym razem, nawet jeśli pakiet jest już pobrany i zainstalowany. Próbowałem znaleźć opcję sprawdzania przed instalacją, ale nie było żadnych. Czy istnieje sposób na obejście tego, że mogę pominąć pakiety, które są już zainstalowane? Zarządzanie pakietami Debiana domyślnie pomija już zainstalowane pakiety, ale menedżer pakietów RPM nie wydaje się tego robić.Jak sprawić, by szef kuchni sprawdził pakiet RPM, a następnie zainstalował?

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

Przepis jest pokazana poniżej:

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 
+0

można pokazać część swojej recepturze, gdzie nazywają te elementy? – jstim

+0

@jstim Dodałem przepis. – noMAD

Odpowiedz

14

wiem, że to jest stary, ale wierzę, że chcesz:

remote_file "your-remote-file" do 
    ... 
    not_if "rpm -qa | grep -qx 'your-package'" 
end 
2

nie jestem zaznajomiony z RPM, ale można sprawdzić, jak chef learns if the package is already installed (metoda load_current_resource). Można zaimplementować coś podobnego w swojej recepturze i dodać ten warunek do plik_zdalny:

remote_file "#{Chef::Config[:file_cache_path]}/#{javaRPM}" do 
    not_if { [your_code_that_checks_if_package_installed] } 
    ... 
end 
0

Chef zapewnienie zasobów dla rpm_packages. można znaleźć numery wiele przykładów, które pokazują, w jaki sposób chef verify jeśli pakiet jest zainstalowany

1

Można najpierw usunąć pakiet używając ignore_failure a następnie zainstalować go

package 'package_name' 
    ignore_failure true 
    action   :remove 
end 

Następnie chwycić plikowi

remote_file localPath do 
    source packageUrl 
    mode 0644 
    checksum checkSum 
end 

Następnie zainstalować pakiet

package packageName do 
     source localPath 
     action :install 
     allow_downgrade true 
end 

To będzie działać z dowolnym typem paczki. Dla rpm idealnie nie trzeba usuwać paczki. allow_downgrade powinno działać. Ale nie zadziałało to dla mnie.

Do stosowania sumy kontrolnej curl packageUrl | shasum -a 256

Powiązane problemy