[chef] Re: delayed evaluation?


Chronological Thread 
  • From: Chris Roberts < >
  • To:
  • Subject: [chef] Re: delayed evaluation?
  • Date: Thu, 19 Dec 2013 09:11:22 -0800

Hi. You probably want:

content lazy{ do some stuff and return string }

On Dec 16, 2013 9:19 PM, "John Alberts" < "> > wrote:
This seems like such a simple problem and something that everyone should come across at one point or another.

Here's a short snippet of code that illustrates the issue I'm having:

(1..2).each do |count|
  ruby_block "ls /tmp" do
    block do
      node.set['test1']['lsdir'] = %x[ls /tmp]
    end
  end

  file "/tmp/file#{count}.txt" do
    content node['test1']['lsdir']
  end
end


So, at the end of the run, both /tmp/file1.txt and /tmp/file2.txt are empty.  I had hoped for /tmp/file2.txt to show that '/tmp/file1.txt now exists.

I know this is because the value of attributes are evaluated during the compile phase at the beginning of the chef run and at that time, the value of node['test1']['lsdir'] is nil.  Also, this same issue arises when trying to use a variable instead of an attribute.

How can I get something like this to execute as I would have hoped?  This has to be a common pattern; set an attribute, use it, modify the attribute, use the new value.  I know there is the new 'lazy' delayed evaluator, but I can only get that to work when used in a value for a resource attribute.

Thanks


--
John Alberts



Archive powered by MHonArc 2.6.16.

§