我用不同的属性多次包含食谱

时间:2016-04-25 14:05:42

标签: java chef

我以为我可以通过这样的方式安装多个JDK:

node[:mycookbook][:jdk_versions].each do |jdk_version|
  node.set[:java][:jdk_version] = jdk_version
  include_recipe "java::default"
end

但是,这只会安装1个JDK版本:属性中的第1个版本。我猜测是因为属性是在编译阶段确定的,然后从include_recipe安装java只是重新运行相同的属性(并认为自己已经是最新的)。

有关重新使用具有不同属性的配方的任何建议吗?

**编辑**

我刚刚注意到这里https://docs.chef.io/recipes.html#include-recipes

  

如果多次使用include_recipe方法来包含a   配方,只处理第一个包含和任何后续   夹杂物被忽略了。

*编辑2 * 基于@tensibai建议,我现在能够在我自己的食谱中手动使用java cookbook中的资源安装多个JDK。

arch = node[:java][:arch]

node[:mycookbook][:jdk_versions].each do |jdk_version|
    node.set[:java][:java_home] = "/usr/lib/jvm/jdk#{jdk_version}"
    is_default = jdk_version == node[:mycookbook][:default_jdk_version]

    java_ark "jdk#{jdk_version}" do
      url node[:java][:jdk][jdk_version][arch][:url]
      default is_default
      checksum node[:java][:jdk][jdk_version][arch][:checksum]
      app_home node[:java][:java_home]
      bin_cmds node[:java][:jdk][jdk_version][arch][:bin_cmds]
      alternatives_priority node[:java][:alternatives_priority]
      retries node[:java][:ark_retries]
      retry_delay node[:java][:ark_retry_delay]
      action :install
    done
done

之后,我在最初的厨师运行后得到以下内容(发布版本编辑):

- (dir) jdk1.6.0_X
- (dir) jdk1.7.0_Y
- (dir) jdk1.8.0_Z
- (link) jdk6 -> /usr/lib/jvm/jdk1.6.0_X
- (link) jdk7 -> /usr/lib/jvm/jdk1.7.0_Y
- (link) jdk8 -> /usr/lib/jvm/jdk1.6.0_Z

出于某种原因,JDK8(此运行设置为默认值,因此is_default解析为true)链接到jdk 6路径。我还在运行期间获得与set-alternatives相关的克隆资源警告。但是,如果我重新运行chef(设置了相同的属性),它会修复符号链接:

  * java_ark[jdk6] action install (up to date)
....
  * java_ark[jdk7] action install[2016-05-04T07:50:37+00:00] WARN: Cloning resource attributes for java_alternatives[set-java-alternatives] from prior resource (CHEF-3694)
....
  * java_ark[jdk8] action install
- Symlink /usr/lib/jvm/jdk1.8.0_Y to /usr/lib/jvm/jdk8[2016-05-04T07:50:37+00:00] WARN: Cloning resource attributes for java_alternatives[set-java-alternatives] from prior resource (CHEF-3694)

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

来自java食谱自述文件:

  

本食谱包含java_ark LWRP。一般来说这个LWRP   不推荐使用ark cookbook中的ark,但它仍然有效   本烹饪书中用于处理Oracle JDK安装。

来自[方舟] README示例:

ark 'jdk' do
   url 'http://download.example.com/jdk-7u2-linux-x64.tar.gz'
   version '7.2'
   path "/usr/local/jvm/"
   home_dir "/usr/local/jvm/default"
   checksum  '89ba5fde0c596db388c3bbd265b63007a9cc3df3a8e6d79a46780c1a39408cb5'
   append_env_path true
   owner 'foobar'
 end

你可以制作一个你希望安装的jdk风格,并用以下方式调用方舟倍数:

属性(虚拟值):

default['jdk']['open-1.7'] = {
  "url" => "http://download.example.com/jdk-7u2-linux-x64.tar.gz",
  "version" => "7.2",
  "checksum" => "89ba5fde0c596db388c3bbd265b63007a9cc3df3a8e6d79a46780c1a39408cb5"
}

default['jdk']['open-1.6'] = {
  "url" => "http://download.example.com/jdk-6u42-linux-x64.tar.gz",
  "version" => "6.42",
  "checksum" => "89xxxxxxxxxx08cb5"
}

配方:

node['jdk'].each do |jdk,properties|
  ark jdk do
    url properties['url']
       version properties['version']
       path "/usr/local/jvm/"
       home_dir "/usr/local/jvm/default"
       checksum  propertie['checksum']
       append_env_path true
       owner 'foobar'
  end
end

我允许你根据需要扩展哈希值和配方内的值(设置默认的jdk等)。