【问题标题】:How do I print out Chef default.rb values to stdout?如何将 Chef default.rb 值打印到标准输出?
【发布时间】:2020-06-25 19:15:43
【问题描述】:

我想从这个 Chef 默认属性文件中读出一些 url 和版本号:

https://github.com/aws/aws-parallelcluster-cookbook/blob/develop/attributes/default.rb

我知道我可以使用grepsedawk 解决方案,但这些解决方案通常更脆弱,我无法控制此文件。我只是希望能够下载它并解析出我需要的值。

一个示例解决方案可以将 default.rb 作为 JSON 打印到标准输出并使用 jq 解析它,或者创建一个 ruby​​ 脚本来打印它。

提前致谢!

更新:

我想要一种从 default.rb 文件中读取数据的方法,即我想从 default.rb 中获取版本数据/url,并以编程方式将其用于其他用途。

能够做到就好了

require('default.rb')

puts default['cfncluster']['nvidia']['driver_version']

这会将第 68 行的值打印到标准输出,然后我可以用它做任何我想做的事情。以上是我对我们 ruby​​ 的失败尝试。此方法失败,它表示未定义默认值。我不是 ruby​​ 人,也许有一种方法可以在不收到错误消息的情况下加载它。

感谢任何建议。如果您可以使用一些厨师 cli 将所有内容打印为 JSON,那也很好。我可以从中解析出我需要的东西。

【问题讨论】:

  • 您想打印标准输出作为说明书执行的一部分吗?

标签: ruby chef-infra devops chef-recipe


【解决方案1】:

您没有在 chef-client 期间指定是否要这样做。

虽然不推荐,但是可以通过usuineval()来实现。例如:

# foo.rb
default['foo']['bar'] = "baz"
# read.rb
default = Hash.new {|hash,key| hash[key]={}}
eval(File.read("./foo.rb"))
puts default['foo']['bar']
$ ruby test.rb
baz

【讨论】:

  • 感谢您的回答,感谢您抽出宝贵时间回答这个问题。我需要一种从default.rb 文件中提取值的方法。我不在乎它是什么方法。只要它有效。
  • 我试过你的例子(使用来自default.rb 的值键)我收到了这个错误消息:未定义的局部变量或方法'node' for main:Object。
  • 我在这一行添加了 node = Hash.new {|hash,key| hash[key]={}} 让它过去了错误,现在它给了我这个错误:Undefined method `[]=' for nil:NilClass it is come from the eval line.
  • @jlong​​anecker:如果你仔细查看你共享的文件,你会发现它比default 有更多的变量。我的 sn-p 处理简单的情况。
  • 在最初的问题中,我直接分享了文件的链接。您可以下载它并尝试解决方案。这就是我分享它的原因。如果你没有时间弄清楚,不用担心。我可能需要学习一些红宝石:)。
猜你喜欢
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 2015-08-31
  • 1970-01-01
相关资源
最近更新 更多