2012-10-23 39 views
10

Tôi hiện đang sử dụng đầu bếp để cài đặt gói RPM JDK nhưng vấn đề là nó thực hiện nó mỗi lần ngay cả khi gói đã được tải xuống và cài đặt. Tôi đã cố gắng tìm một tùy chọn để kiểm tra trước khi cài đặt nhưng không có bất kỳ. Có cách nào để có được xung quanh này như vậy mà tôi có thể bỏ qua các gói đã được cài đặt? Quản lý gói của Debian bỏ qua các gói đã được cài đặt theo mặc định, nhưng trình quản lý gói RPM dường như không làm điều đó.Làm thế nào để kiểm tra đầu bếp cho gói RPM và sau đó cài đặt?

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

Các công thức là hiển thị bên dưới:

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

Bạn có thể hiển thị một phần công thức của bạn nơi bạn gọi những mục đó không? – jstim

+0

@jstim Tôi đã thêm công thức. – noMAD

Trả lời

14

Tôi biết điều này là cũ, nhưng tôi tin rằng bạn muốn:

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

Tôi không quen với RPM, nhưng bạn có thể kiểm tra như thế nào chef learns if the package is already installed (phương pháp load_current_resource). Bạn có thể thực hiện điều gì đó tương tự như trong công thức của bạn và thêm điều kiện này để remote_file:

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

Chef cung cấp một nguồn lực cho rpm_packages. và bạn có thể tìm thấy một số rất nhiều ví dụ cho thấy cách chef verify nếu một gói được cài đặt

1

Trước tiên, bạn có thể loại bỏ các gói sử dụng ignore_failure và sau đó cài đặt nó

package 'package_name' 
    ignore_failure true 
    action   :remove 
end 

Sau đó lấy các tập tin

remote_file localPath do 
    source packageUrl 
    mode 0644 
    checksum checkSum 
end 

Sau đó cài đặt gói

package packageName do 
     source localPath 
     action :install 
     allow_downgrade true 
end 

Điều này sẽ hoạt động với bất kỳ loại gói nào. Đối với vòng quay lý tưởng, bạn không cần phải tháo gói. allow_downgrade sẽ hoạt động. Nhưng nó không hiệu quả với tôi.

Để sử dụng tổng kiểm tra curl packageUrl | shasum -a 256

Các vấn đề liên quan