覆盖Vagrantfile自定义JSON数据中的Cookbook属性

时间:2014-04-21 16:18:00

标签: maven chef vagrantfile berkshelf

如何在Vagrant文​​件中使用chef.json访问node.override?

例如,使用vagrant-berkshelf,我正在尝试根据Vagrantfile中的自定义JSON数据安装特定的Maven版本:

  chef.json = {
  'maven' => {
    'version' => '3.0.5'    
    }
  }

食谱\ maven_custom \属性\ default.rb

default['maven']['version'] = "3.2.1" 

食谱\ maven_custom \食谱\ default.rb

Chef::Log.info(node['maven']['version'])

当我运行vagrant provision时,会打印出以下内容:

3.2.1

此外,我尝试vagrant reload --provision,但仍看到“3.2.1”打印出来。

我会期待3.0.5,因为我(我认为)已经在Vagrantfile中覆盖了它。

如何正确提取Vagrantfile's JSON值为“3.0.5”?

1 个答案:

答案 0 :(得分:1)

不完全清楚问题是什么,但我会假设您正在尝试编写一个包装器,以安装更现代版本的Maven。

诀窍是在包装器食谱中设置“普通”属性,该属性将覆盖maven cookbook的“默认”属性。有关厨师attribute precedence

的详细信息,请参阅

这比提供运行时参数更好,原因如下:

  1. 您正在编写包装器食谱,因此属性文件将是设置值的自然场所
  2. “maven”食谱需要设置4 attributes以指定新的Maven版本。
  3. 希望这有帮助。

    实施例

    ├── attributes
    │   └── maven.rb
    ├── Berksfile
    ├── Berksfile.lock
    ├── metadata.rb
    ├── recipes
    │   └── default.rb
    └── Vagrantfile
    

    metadata.rb

    name             'maven_custom'
    maintainer       'YOUR_NAME'
    maintainer_email 'YOUR_EMAIL'
    license          'All rights reserved'
    description      'Installs/Configures maven_custom'
    long_description 'Installs/Configures maven_custom'
    version          '0.1.0'
    
    depends "apt"
    depends "maven"
    

    属性/ maven.rb

    normal['maven']['version'] = 3
    normal['maven']['3']['version'] = '3.2.1'
    normal['maven']['3']['url'] = 'http://www.eu.apache.org/dist/maven/maven-3/3.2.1/binaries/apache-maven-3.2.1-bin.tar.gz'
    normal['maven']['3']['checksum'] = 'cdee2fd50b2b4e34e2d67d01ab2018b051542ee759c07354dd7aed6f4f71675c'
    

    配方/ default.rb

    #
    # Cookbook Name:: maven_custom
    # Recipe:: default
    #
    include_recipe "apt"
    include_recipe "maven"