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

I including a recipe multiple times with different attributes

我认为我可以通过执行以下操作来安装多个 JDK:

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

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

对于重新使用具有不同属性集的配方有什么建议吗?

** 编辑 **

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

If the include_recipe method is used more than once to include a recipe, only the first inclusion is processed and any subsequent inclusions are ignored.

* 编辑 2 * 根据@tensibai 的建议,我现在可以安装多个 JDKs,在我自己的食谱中手动使用 java 食谱中的资源。

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

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

- (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 相关的克隆资源警告。但是,如果我重新 运行 厨师(具有相同的属性集),它会修复符号链接:

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

知道为什么会这样吗?

来自 java 食谱自述文件:

This cookbook contains the java_ark LWRP. Generally speaking this LWRP is deprecated in favor of ark from the ark cookbook, but it is still used in this cookbook for handling the Oracle JDK installation.

并且来自 [ark] 自述文件示例:

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,等等)。