如何在 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
这比提供运行时参数更好,原因如下:
- 您正在编写包装器说明书,因此属性文件自然是设置值的地方
- “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"