【问题标题】:How print or debug Chef attributes如何打印或调试 Chef 属性
【发布时间】:2015-02-11 00:27:57
【问题描述】:

我创建了一个带有属性的 Chef 食谱,然后尝试将代码引导到节点并传递额外的属性和/或覆盖默认值。

是否可以打印一个属性树来查看哪些属性被加载,哪些被覆盖?

【问题讨论】:

  • @Tensibai 问题很公平,Cherry 正在尝试解决厨师引导程序的问题。您提供的链接是基本的链接,如果我是厨师的初学者,我会发现很难找到答案。这不是一个新的 SO 用户,所以如果你不喜欢这个问题,请直接投反对票。
  • 同一主题的 4 个问题是相当垃圾的 IMO
  • 查看完现在只剩下一个问题,我的第一条评论兴趣不大,但是围绕属性优先级的链接仍然有效。所以我对删除它有疑问。周一会看到重写所有@markoconnor(不确定“戳”,因为我正在打电话但没有完成)

标签: ruby attributes chef-infra


【解决方案1】:

要从融合的 Chef 内部获取整个属性树,而不是通过 Chef 服务器中的刀,这在单独的环境中是无用的,请以有用的形式查看 node.to_hash。更多信息在“Chef::Node”中。

要获得漂亮的打印日志,您可以使用 Chef 的 JSON 库的漂亮打印机:

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]"
  ]
}

How do you create pretty json in CHEF (ruby)”有漂亮的打印机指针。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    【解决方案3】:

    通过@keen 分叉答案,这会以 YAML 格式生成更易于阅读的输出。

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

    【讨论】:

      【解决方案4】:

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

      knife node edit <hostname-here> -a
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-15
        • 2020-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-30
        • 2016-02-10
        • 1970-01-01
        相关资源
        最近更新 更多