厨师 – 独奏传递自定义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 /食谱/ 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_type的JSON中传入 Chef :: EnvironmentChef :: Role

UPDATE

这是我尝试使用Chef :: Node,Chef :: Environment,Chef :: Role等的另一件事。我仍然得到“你通过{}”并且看不到用户名或其他项目:(

 { "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”}},“覆盖”:{},“默认”:{},“自动”:{},“run_list”:[]}

  • 要写入/设置值我只使用node.default["value"]
  • 要读取值,我只使用node["value"]

只有在为配方中的属性设置默认值时,才应使用node.default['whatever']

要使用atrtibute,只需使用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']周围使用#{} ,因为它不在需要插值的字符串中但是如果它失败,我可能会错误地读取它。

你有设置“node [‘params’] [‘vhost’]”属性吗?

如果这不是问题,请尝试设置“default_attributes”而不是“overwrite_attributes”,因为没有要覆盖的属性。