Ruby 如何将Chef default.rb值打印到标准输出?
我想从这个Chef默认属性文件中读取一些URL和版本号: 我知道我可以使用Ruby 如何将Chef default.rb值打印到标准输出?,ruby,chef-infra,devops,chef-recipe,Ruby,Chef Infra,Devops,Chef Recipe,我想从这个Chef默认属性文件中读取一些URL和版本号: 我知道我可以使用grep、sed、awk解决方案,但这些解决方案通常更脆弱,我无法控制此文件。我只想能够下载它并解析出我需要的值 一个示例解决方案可以是将default.rb作为JSON打印到stdout,并使用jq对其进行解析,或者创建一个ruby脚本将其打印出来 提前谢谢 更新: 我想要一种从default.rb文件中读取数据的方法,即我想要从default.rb中获取版本数据/URL,并以编程方式将其用于其他用途 能做到这一点会很
grep
、sed
、awk
解决方案,但这些解决方案通常更脆弱,我无法控制此文件。我只想能够下载它并解析出我需要的值
一个示例解决方案可以是将default.rb
作为JSON打印到stdout,并使用jq
对其进行解析,或者创建一个ruby脚本将其打印出来
提前谢谢
更新:
我想要一种从default.rb文件中读取数据的方法,即我想要从default.rb中获取版本数据/URL,并以编程方式将其用于其他用途
能做到这一点会很好
require('default.rb')
puts default['cfncluster']['nvidia']['driver_version']
这将打印出从第68行到标准输出的值,然后我可以用它做任何我想做的事情。以上是我尝试使用ruby的失败尝试。此方法失败,表示未定义默认值。我不是一个喜欢ruby的人,也许有一种方法可以在没有收到错误信息的情况下加载它
如有任何建议,我们将不胜感激。如果您可以使用chef cli将所有内容打印为JSON,那也很好。我可以从中解析我需要的内容。您没有指定是否要在chef client期间执行此操作 虽然不推荐使用,但您可以通过使用
eval()
来实现。例如:
#foo.rb
默认值['foo']['bar']=“baz”
#read.rb
默认值=Hash.new{| Hash,key{124; Hash[key]={}
eval(File.read(“./foo.rb”))
放置默认值['foo']['bar']
$ruby test.rb
巴兹
是否将打印标准输出作为烹饪书执行的一部分?感谢您的回答,感谢您抽出时间回答此问题。我需要一种从default.rb
文件中提取值的方法。我不在乎这是什么方法。我试过你的例子(使用default.rb
)我得到了这个错误消息:未定义的局部变量或main:Object的方法'node'。我在这一行添加了node=Hash.new{| Hash,key{Hash[key]={},它通过了错误,现在给我这个错误:未定义的方法'[]='对于nil:NilClass,它来自eval行。@jlonganecker:如果仔细查看您共享的文件,您会发现它的变量比默认值多。我的代码片段涉及Simples案例。在最初的问题中,我直接共享了指向该文件的链接。您可以下载它并尝试解决方案。这就是我分享它的原因。如果你没有时间想清楚,不用担心。我可能需要学习一些ruby:)。