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

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

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

Recipe\maven_custom\attributes\default.rb

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

cookbooks\maven_custom\recipes\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 “3.0.5”的 JSON 值?

请您参考如下方法:

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

诀窍是在 wrapper cookbook 中设置“normal”属性,这将覆盖 maven cookbook 的“default”属性。有关更多详细信息,请阅读关于 Chef 的 attribute precedence

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

  1. 您正在编写包装器说明书,因此属性文件自然是设置值的地方
  2. “maven” Recipe 需要设置 4 attributes指定新的 Maven 版本。

希望这对您有所帮助。

例子

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

元数据.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' 

Recipe/default.rb

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


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!