meallhour
meallhour

Reputation: 15581

How to assign file content to chef node attribute

I have fingreprint.txt at the location "#{node['abc.d']}/fingreprint.txt"

The contents of the file are as below:
time="2015-03-25T17:53:12C" level=info msg="SHA1 Fingerprint=7F:D0:19:C5:80:42:66"

Now I want to retrieve the value of fingerprint and assign it to chef attribute
I am using the following ruby block

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  

It seems not to be working because of missing escape chars in command = 'grep -Po '(?<=Fingerprint=)[^"]*' path '. Please let me know if there is some other way of assigning file content to node attribute

Upvotes: 1

Views: 1090

Answers (1)

coderanger
coderanger

Reputation: 54211

Two ways to answer this: first I would do the read (IO.read) and parsing (RegExp.new and friends) in Ruby rather than shelling out to grep.

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

Second, don't do this at all because it probably won't behave how you expect. You would have to take in to account both the two-pass loading process and the fact that default attributes are reset on every run. If you're trying to make an Ohai plugin, do that instead. If you're trying to use this data in later resources, you'll probably want to store it in a global variable and make copious use of the lazy {} helper.

Upvotes: 1

Related Questions