如何打印或调试厨师属性?

时间:2014-12-12 10:04:30

标签: java ruby attributes chef

我创建了带有属性的厨师食谱。然后我尝试将代码提升到节点并在addidition中传递其他属性和/或覆盖默认值。是否可以打印属性树以查看哪些属性被加载,哪些被覆盖?

4 个答案:

答案 0 :(得分:12)

以一种有用的形式获取整个属性树(来自融合厨师的内部,而不是来自厨师服务器的刀 - 这在单独的环境中是无用的......):

您正在寻找node.to_hash - 请参阅http://www.rubydoc.info/gems/chef/Chef%2FNode%3Ato_hash

其他一些选项 - http://www.rubydoc.info/gems/chef/Chef/Node

要获得漂亮的印刷日志,您可以使用厨师的json libs漂亮的打印机:

output="#{Chef::JSONCompat.to_json_pretty(node.to_hash)}"
log output

或在客户端写一个本地文件:

output="#{Chef::JSONCompat.to_json_pretty(node.to_hash)}"
file '/tmp/node.json' do
  content output
end

请注意,这是融合节点,因此您无法获得node.debug_value可以获得的默认/覆盖/等级 - 但如果您实际上并不知道属性的名称/路径,或者你需要遍历许多属性,这可能是你的朋友。

你会得到一个巨大的结果,看起来像(非常有趣!)

{
  "chef_type": "node",
  "name": "node.example.com",
  "chef_environment": "_default",
  "build-essential": {
    "compile_time": false
  },
  "homebrew": {
    "owner": null,
    "auto-update": true,
  ...
  },
  "recipe": [
    "example"
  ],
  "run_list": [
    "recipe[example]"
  ]
}

感谢this answer用于漂亮的打印机指针

答案 1 :(得分:5)

您可以使用node.debug_value来显示单个属性。这将在每个级别打印出该属性的值。但是,在每个级别为每个属性执行此操作更难(我不确定如何执行此操作)。此外,由于来自ohai的大量属性,我不确定你是否想要这样做。

如果您的厨师运行正确完成,您可以knife node show -l <nodename>(这是一个小写的L)。这将显示实际值,但它提供了大量数据,并且不会告诉您哪些值是默认值,正常值,覆盖值等。

答案 2 :(得分:2)

通过@keen分析答案,这会产生YAML格式的更易读的输出。

output = node.to_yaml
file '/var/node.yaml' do
  content output
end

答案 3 :(得分:0)

有时,在配置节点后,可能很容易从节点读取变量。

knife node edit <hostname-here> -a