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