Ruby 在厨师食谱中组织食谱

Ruby 在厨师食谱中组织食谱,ruby,chef-infra,devops,cookbook,Ruby,Chef Infra,Devops,Cookbook,我需要使用厨师烹饪手册安装JavaJDK1.8和Tomcat7 我试图创建一个简单的食谱,使用Chef supermarket java和Tomcat cookbook安装OracleJavaJDK1.8和Tomcat1.7Concentos7 我在Windows 10上使用Chef DK,我从官方网站(参考)下载了它,还使用Vagrant和Oracle Virtualbox创建CentOS 7目标节点,并使用kitchen create和kitchen converge命令进行测试 我试着给你

我需要使用厨师烹饪手册安装JavaJDK1.8和Tomcat7

我试图创建一个简单的食谱,使用Chef supermarket java和Tomcat cookbook安装OracleJavaJDK1.8和Tomcat1.7Concentos7

我在Windows 10上使用Chef DK,我从官方网站(参考)下载了它,还使用Vagrant和Oracle Virtualbox创建CentOS 7目标节点,并使用
kitchen create
kitchen converge
命令进行测试

我试着给你一些关于我的食谱配置的细节

我的环境是

Chef Development Kit Version: 3.1.0
chef-client version: 14.2.0
delivery version: master (6862f27aba89109a9630f0b6c6798efec56b4efe)
berks version: 7.0.4
kitchen version: 1.22.0
inspec version: 2.1.72
在我的伯克斯档案里,我

source 'https://supermarket.chef.io'
metadata 
我的厨房。yml如下

---
driver:
  name: vagrant

provisioner:
  name: chef_zero
  # You may wish to disable always updating cookbooks in CI or other testing environments.
  # For example:
  #   always_update_cookbooks: <%= !ENV['CI'] %>
  always_update_cookbooks: true

verifier:
  name: inspec

platforms:
  - name: centos-7

suites:
  - name: default
    run_list:
      - recipe[test::default]
    verifier:
      inspec_tests:
        - test/integration/default
    attributes:
name 'test'
maintainer 'The Authors'
maintainer_email 'you@example.com'
license 'All Rights Reserved'
description 'Installs/Configures test'
long_description 'Installs/Configures test'
version '0.1.0'
chef_version '>= 12.14' if respond_to?(:chef_version)

depends 'java', '~> 2.2.0'
depends 'tomcat', '~> 3.0.0'
我的食谱/default.rb

node.default["java"]["install_flavor"] = "oracle"
node.default["java"]["jdk_version"]    = "8"
node.default['java']['oracle']['accept_oracle_download_terms'] = true

include_recipe "java"

tomcat_install 'tomcat7' do
  version '7.0.90'
  verify_checksum false
  exclude_examples false
  exclude_docs false
end

tomcat_service 'tomcat7' do
  action :start
end
及其属性/recipe.rb

default['java']['install_flavor'] = 'oracle'
default['java']['jdk_version'] = '8'
default['java']['oracle']['accept_oracle_download_terms'] = true
在这个食谱组织中,一切都很好

我想尝试“重构”这个划分java和tomact安装的结构:我尝试做什么

使用此内容创建一个
recipes/inst_jdk18.rb
配方

node.inst_jdk18["java"]["install_flavor"] = "oracle"
node.inst_jdk18["java"]["jdk_version"]    = "8"
node.inst_jdk18['java']['oracle']['accept_oracle_download_terms'] = true

include_recipe "java"
tomcat_install 'tomcat7' do
  version '7.0.90'
  verify_checksum false
  exclude_examples false
  exclude_docs false
end

tomcat_service 'tomcat7' do
  action :start
end
以及包含此内容的
attributes/inst_jdk18.rb
属性文件

inst_jdk18['java']['install_flavor'] = 'oracle'
inst_jdk18['java']['jdk_version'] = '8'
inst_jdk18['java']['oracle']['accept_oracle_download_terms'] = true
使用此内容创建一个
recipes/inst_tomcat7.rb
配方

node.inst_jdk18["java"]["install_flavor"] = "oracle"
node.inst_jdk18["java"]["jdk_version"]    = "8"
node.inst_jdk18['java']['oracle']['accept_oracle_download_terms'] = true

include_recipe "java"
tomcat_install 'tomcat7' do
  version '7.0.90'
  verify_checksum false
  exclude_examples false
  exclude_docs false
end

tomcat_service 'tomcat7' do
  action :start
end
然后我用这种方式修改了我的
recipes/default.rb
recipe

include_recipe "inst_jdk18"
include_recipe "inst_tomcat7"
现在,当我尝试
kitchen converge
命令时,我得到了错误

 ================================================================================
 Recipe Compile Error in /tmp/kitchen/cache/cookbooks/geoserver/attributes/inst_jdk18.rb
 ================================================================================

 NoMethodError
 -------------
 undefined method `inst_jdk18' for #<Chef::Node::Attribute:0x000000000383e318>

 Cookbook Trace:
 ---------------
   /tmp/kitchen/cache/cookbooks/geoserver/attributes/inst_jdk18.rb:1:in `from_file'

 Relevant File Content:
 ----------------------
 /tmp/kitchen/cache/cookbooks/geoserver/attributes/inst_jdk18.rb:

   1>> inst_jdk18['java']['install_flavor'] = 'oracle'
   2:  inst_jdk18['java']['jdk_version'] = '8'
   3:  inst_jdk18['java']['oracle']['accept_oracle_download_terms'] = true
   4: 
================================================================================
/tmp/kitchen/cache/cookbooks/geoserver/attributes/inst_jdk18.rb中的配方编译错误
================================================================================
命名者
-------------
未定义的方法“inst_jdk18”#
食谱跟踪:
---------------
/tmp/kitchen/cache/cookbooks/geoserver/attributes/inst_jdk18.rb:1:in'from_file'
相关文件内容:
----------------------
/tmp/kitchen/cache/cookbooks/geoserver/attributes/inst_jdk18.rb:
1> >inst_jdk18['java']['install_flavor']='oracle'
2:inst_jdk18['java']['jdk_version']='8'
3:inst_jdk18['java']['oracle']['accept_oracle\u download\u terms']=true
4: 
关于如何以正确的方式构建我的食谱,有什么建议吗

inst_jdk18['java']['install_flavor'] = 'oracle'
inst_jdk18['java']['jdk_version'] = '8'
inst_jdk18['java']['oracle']['accept_oracle_download_terms'] = true
inst_jdk18不是节点对象的方法,这是默认值/覆盖值/etc。在属性文件中,它们定义了属性优先级,在配方代码中的node.default也是如此

只要用
default
替换即可

如果在属性文件中定义了这些属性,则不要在配方中重新定义它们,而是执行其中一项或另一项操作,建议包装烹饪书使用配方中的node.default,然后在include_recipe中使用node.default,以便在其中定义内容

简而言之,您混合了文件名(default.rb)和(也默认),文件名不会影响属性级别