厨师独奏传递习俗 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::EnvironmentChef::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": [] }

您是否设置了"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 语法有误,请重新阅读。