【问题标题】:Organize recipes inside a Chef cookbook在厨师食谱中组织食谱
【发布时间】:2019-01-29 13:24:48
【问题描述】:

我需要使用 Chef Cookbook 安装 java jdk 1.8 和 tomcat 7。

我正在尝试创建一个简单的食谱,使用 Chef 超市 java 和 tomcat 食谱安装 oracle java jdk 1.8 和 Tomcat 1.7 con CentOS 7。

我在 Windows 10 上使用 Chef DK,我已经从官方网站下载了它(参考 https://downloads.chef.io/chefdk),还使用 ​​Vagrant 和 Oracle Virtualbox 创建我的 CentOS 7 目标节点并使用 @987654322 进行测试@ 和 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

在我的 Berksfile 中

source 'https://supermarket.chef.io'
metadata 

My Kitchen.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:

我的 metadata.rb 是跟随

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"

和它的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 配方..

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 食谱

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: 

关于如何以正确的方式组织我的食谱有什么建议吗?

【问题讨论】:

    标签: ruby chef-infra devops cookbook


    【解决方案1】:
    inst_jdk18['java']['install_flavor'] = 'oracle'
    inst_jdk18['java']['jdk_version'] = '8'
    inst_jdk18['java']['oracle']['accept_oracle_download_terms'] = true
    

    inst_jdk18不是node对象的方法,就是default/override/etc。在属性文件中,它们定义了优先级的属性级别,在配方代码中的 node.default 也是如此。

    只需替换为default 即可。

    如果你在属性文件中定义这些属性,不要在配方中重新定义它们,做一个或另一个,包装食谱的推荐方法是在 include_recipe 之前的配方中使用 node.default 有一个连贯的地方定义事物的地方。

    简而言之,您将文件名 (default.rb) 和 attribute levels(也是默认值)混合在一起,文件的名称不会影响属性级别。

    【讨论】: