【问题标题】:chef-solo passing custom jsonchef-solo 传递自定义 json
【发布时间】:2015-04-21 06:10:09
【问题描述】:

我正在拼命想弄清楚如何在 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_type 的 JSON 中传入 Chef::EnvironmentChef::Role 吗?

更新

这是我用 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", “厨师类型”:“节点”, “名称”:“节点测试”, “普通的”: { “用户名”:“流浪者”, “参数”:{ “虚拟主机”:“假冒” } }, “覆盖”:{}, “默认”: {}, “自动的”: {}, "run_list": [] }

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

【问题讨论】:

    标签: ruby chef-infra chef-solo


    【解决方案1】:

    你是否设置了“node['params']['vhost']”属性?

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

    【讨论】:

    • 感谢您的回复!我在食谱node.default['params']['template'] = "django.erb" 中设置了这些参数,效果很好。但我什至无法加载设置为 node.default["username"] = "vagrant" 的用户名——我会更新我的 JSON 以显示我再次尝试的内容
    • 这无关。默认、正常和覆盖是优先级,不需要在较低级别有一个来定义覆盖级别的属性。
    • tnx @Tensibai 很高兴知道,最后覆盖尚未设置的东西很奇怪
    • @rastasheep 实际上默认/正常和覆盖是优先级。就像在 ruby​​ 访问未知变量时将其设置为 nil 一样,您仍然在覆盖某些东西。 More details here 如何在厨师运行中进行管理
    【解决方案2】:

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

    要使用属性,只需使用node['whatever']

    我认为错误来自“用户”环境变量获得空值。

    此代码应该可以在您的第一个 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 语法失败,我可能会出错,请阅读。

    【讨论】:

    • 我会试试这个。我正在使用 gem "foodcritic" 来验证代码,它说你应该使用默认值(这对我来说没有多大意义)所以我试试这种方式。
    • 哦,查看了 -j 的文档,此文件中的任何属性都被视为正常级别,这解释了为什么调用 node.default 时什么也得不到
    • 是的,你是对的,非常感谢。这让我发疯了。所以要设置一个值node.default['something'] = 1,并获取一个值node['something']——这样json就可以工作了!类似于:{ "json_class": "Chef::Node", "chef_type": "node", "name": "node_test", "normal": { "username": "vagrant", "params": { "vhost": "fakeit" } }, }
    • @Tensibal 我不记得我已经搞砸了这么多,但我知道 node[:username] 是它说不要使用的。
    • 是的,不鼓励方法访问符号,使用字符串,如果不需要插值(无变量),则使用单引号(无变量),如果需要插值,则使用双引号(这是一个准则,没有强制性)跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多