2016-04-25 82 views
1

fingreprint.txt在位置"#{node['abc.d']}/fingreprint.txt"如何分配的文件内容厨师节点属性

该文件的内容如下:
time="2015-03-25T17:53:12C" level=info msg="SHA1 Fingerprint=7F:D0:19:C5:80:42:66"

现在我想要检索指纹的价值和分配它厨师属性
我使用下面的红宝石块

ruby_block "retrieve_fingerprint" do 
    block do 
     path="#{node['abc.d']}/fingreprint.txt" 
     Chef::Resource::RubyBlock.send(:include, Chef::Mixin::ShellOut) 
     command = 'grep -Po '(?<=Fingerprint=)[^"]*' path ' 
     command_out = shell_out(command) 
     node.default['fingerprint'] = command_out.stdout 
    end 
    action :create 
end 

它似乎并没有被工作因为在command = 'grep -Po '(?<=Fingerprint=)[^"]*' path '中缺少转义字符。 请让我知道,如果有指定的文件内容节点属性

回答

1

两种方式来回答这个的一些其他的方式:在Ruby中首先我会做的读取(IO.read)和解析(RegExp.new和朋友),而不是脱壳而出到grep

if IO.read("#{node['abc.d']}/fingreprint.txt") =~ /Fingerprint=([^"]+)/ 
    node.default['fingerprint'] = $1 
end 

其次,不要这样做,因为它可能不会表现出您的期望。您将不得不考虑两次加载过程以及每次运行时重置默认属性的事实。如果你正在尝试制作一个Ohai插件,那就改为做。如果你想在后面的资源中使用这些数据,你可能需要将它存储在一个全局变量中,并且大量使用帮助器lazy {}

+0

我从未使用Ohai Plugin。请建议如何将上述ruby_block转换为OHAI插件。也。与IO.read我得到编译错误,因为文件不存在,直到运行时间。 – meallhour

+1

你知道Google的事吗? – StephenKing