厨师独奏传递习俗 json
chef-solo passing custom json
我拼命想弄清楚如何在 Chef-Solo 中应用一些 节点变量 。否则我必须继续重新配置。
步骤 1,我登录配置框:
$ vagrant ssh
$ sudo chef-solo -o virtualenv::addsite -j /vagrant/resources/attr_test.json
第 2 步,我有一个 JSON 文件传递数据,我试图 运行 在食谱中反对这些数据。 我相信这有 node.normal 比默认优先级更高的模式?
这是我目前在
attr_test.json
{
"username": "vagrant",
"params": {
"vhost": "fake"
},
"user": {
"name": "vagrant"
},
"overwrite_attributes": {
"username": "vagrant"
}
}
这是食谱,但我无法获取要填充的 node.default 数据。
virtualenv/recipes/addsite.rb
bash 'mkvirtualenv' do
cwd "/home/#{node.default['username']}/projects/"
user node.default['username']
environment ({
'HOME' => ::Dir.home(node.default['username']),
'USER' => node.default['username']
})
code <<-EOH
source /usr/local/bin/virtualenvwrapper.sh \
mkvirtualenv --no-site-packages --distribute #{node.default['params']['vhost']}
EOH
end
错误
Chef::Exceptions::ValidationFailed
----------------------------------
Option user must be a kind of [String, Integer]! You passed {}.
Cookbook Trace:
---------------
/var/chef/cookbooks/virtualenv/recipes/addsite.rb:8:in `block in from_file'
/var/chef/cookbooks/virtualenv/recipes/addsite.rb:6:in `from_file'
有人知道怎么做吗?
我是否需要在 JSON 中为 传递 Chef::Environment 或 Chef::Role ]json_type?
更新
这是我用 Chef::Node、Chef::Environment、Chef::Role 等尝试过的另一件事。我仍然得到 "You Passed {}" 并且看不到用户名或其他项目:(
{
"json_class": "Chef::Node",
"chef_type": "node",
"name": "node_test",
"normal": {
"username": "vagrant",
"params": {
"vhost": "fakeit"
}
},
"normal_attributes": {
"username": "vagrant",
"params": {
"vhost": "fakeit"
}
},
"override_attributes": {
"username": "vagrant",
"params": {
"vhost": "fakeit"
}
},
"override": {
"username": "vagrant",
"params": {
"vhost": "fakeit"
}
},
"default": {
"username": "vagrant",
"params": {
"vhost": "fakeit"
}
},
"default_attributes": {
"username": "vagrant",
"params": {
"vhost": "fakeit"
}
},
"automatic": {},
"run_list": [
]
}
解决方案
我勾选了正确答案。这是我的 JSON 所以它可以帮助任何人!问题是食谱:
{
"json_class": "Chef::Node",
"chef_type": "node",
"name": "node_test",
"normal": {
"username": "vagrant",
"params": {
"vhost": "fakeit"
}
},
"override": {},
"default": {},
"automatic": {},
"run_list": [] }
- 到WRITE/SET一个值我就用
node.default["value"]
- 要读取值,我只使用
node["value"]
您是否设置了"node['params']['vhost']"属性?
如果这不是问题,请尝试设置 "default_attributes" 而不是 "overwrite_attributes",因为没有要覆盖的属性。
只有在为配方中的属性设置默认值时才应使用 node.default['whatever']
。
要使用属性只需使用 node['whatever']
我认为错误来自 'USER' 环境变量得到一个空值。
此代码应该可以按预期与您的第一个 json 文件一起使用。
bash 'mkvirtualenv' do
cwd "/home/#{node['username']}/projects/"
user node['username']
environment ({
'HOME' => ::Dir.home(node['username']),
'USER' => node['username']
})
code <<-EOH
source /usr/local/bin/virtualenvwrapper.sh \
mkvirtualenv --no-site-packages --distribute node['params']['vhost']
EOH
end
我认为 node['params']['vhost']
周围不需要 #{}
,因为它不在需要插值的字符串中,但如果它失败,我可能对 HereDoc 语法有误,请重新阅读。
我拼命想弄清楚如何在 Chef-Solo 中应用一些 节点变量 。否则我必须继续重新配置。
步骤 1,我登录配置框:
$ vagrant ssh
$ sudo chef-solo -o virtualenv::addsite -j /vagrant/resources/attr_test.json
第 2 步,我有一个 JSON 文件传递数据,我试图 运行 在食谱中反对这些数据。 我相信这有 node.normal 比默认优先级更高的模式?
这是我目前在 attr_test.json
{
"username": "vagrant",
"params": {
"vhost": "fake"
},
"user": {
"name": "vagrant"
},
"overwrite_attributes": {
"username": "vagrant"
}
}
这是食谱,但我无法获取要填充的 node.default 数据。
virtualenv/recipes/addsite.rb
bash 'mkvirtualenv' do
cwd "/home/#{node.default['username']}/projects/"
user node.default['username']
environment ({
'HOME' => ::Dir.home(node.default['username']),
'USER' => node.default['username']
})
code <<-EOH
source /usr/local/bin/virtualenvwrapper.sh \
mkvirtualenv --no-site-packages --distribute #{node.default['params']['vhost']}
EOH
end
错误
Chef::Exceptions::ValidationFailed
----------------------------------
Option user must be a kind of [String, Integer]! You passed {}.
Cookbook Trace:
---------------
/var/chef/cookbooks/virtualenv/recipes/addsite.rb:8:in `block in from_file'
/var/chef/cookbooks/virtualenv/recipes/addsite.rb:6:in `from_file'
有人知道怎么做吗? 我是否需要在 JSON 中为 传递 Chef::Environment 或 Chef::Role ]json_type?
更新
这是我用 Chef::Node、Chef::Environment、Chef::Role 等尝试过的另一件事。我仍然得到 "You Passed {}" 并且看不到用户名或其他项目:(
{
"json_class": "Chef::Node",
"chef_type": "node",
"name": "node_test",
"normal": {
"username": "vagrant",
"params": {
"vhost": "fakeit"
}
},
"normal_attributes": {
"username": "vagrant",
"params": {
"vhost": "fakeit"
}
},
"override_attributes": {
"username": "vagrant",
"params": {
"vhost": "fakeit"
}
},
"override": {
"username": "vagrant",
"params": {
"vhost": "fakeit"
}
},
"default": {
"username": "vagrant",
"params": {
"vhost": "fakeit"
}
},
"default_attributes": {
"username": "vagrant",
"params": {
"vhost": "fakeit"
}
},
"automatic": {},
"run_list": [
]
}
解决方案
我勾选了正确答案。这是我的 JSON 所以它可以帮助任何人!问题是食谱:
{ "json_class": "Chef::Node", "chef_type": "node", "name": "node_test", "normal": { "username": "vagrant", "params": { "vhost": "fakeit" } }, "override": {}, "default": {}, "automatic": {}, "run_list": [] }
- 到WRITE/SET一个值我就用
node.default["value"]
- 要读取值,我只使用
node["value"]
您是否设置了"node['params']['vhost']"属性?
如果这不是问题,请尝试设置 "default_attributes" 而不是 "overwrite_attributes",因为没有要覆盖的属性。
只有在为配方中的属性设置默认值时才应使用 node.default['whatever']
。
要使用属性只需使用 node['whatever']
我认为错误来自 'USER' 环境变量得到一个空值。
此代码应该可以按预期与您的第一个 json 文件一起使用。
bash 'mkvirtualenv' do
cwd "/home/#{node['username']}/projects/"
user node['username']
environment ({
'HOME' => ::Dir.home(node['username']),
'USER' => node['username']
})
code <<-EOH
source /usr/local/bin/virtualenvwrapper.sh \
mkvirtualenv --no-site-packages --distribute node['params']['vhost']
EOH
end
我认为 node['params']['vhost']
周围不需要 #{}
,因为它不在需要插值的字符串中,但如果它失败,我可能对 HereDoc 语法有误,请重新阅读。