Delayed evaluation?

On Wed, Dec 18, 2013 at 4:10 PM, John Alberts john.m.alberts@gmail.comwrote:

On Wed, Dec 18, 2013 at 10:17 AM, Dan Razzell danr@activestate.comwrote:

Isn't the issue only that %x[ls /tmp] is being evaluated at compile
time? Avoid that notation and you'll be able to do what you intend. Use
"system" instead and it will be evaluated as part of the ruby block.

I thought any ruby code inside a ruby block will not be evaluated during
compile time and instead during the normal order of the execution phase. I
haven't tested this yet, but does it really matter if inside that ruby
block I've used, %x[ls /tmp] or ls /tmp or system("ls /tmp") ?

Testing it would be a good idea. :wink:

Hi. You probably want:

content lazy{ do some stuff and return string }
On Dec 16, 2013 9:19 PM, "John Alberts" john.m.alberts@gmail.com 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

On Thu, Dec 19, 2013 at 9:11 AM, Chris Roberts
chrisroberts.code@gmail.comwrote:

Hi. You probably want:

content lazy{ do some stuff and return string }

I think I tried that but I I guess I didn't get the syntax correct. Every
variation I tried kept returning errors, so I assumed I was using 'lazy' in
a place where it shouldn't be. I'll give this a try again.

Thanks

--
John Alberts

It was introduced in 11.6 and 10.20-something. And the delayed evaluator
cookbook will back port it to earlier 11 versions (and maybe 10 too. I
can't remember off the top of my head)
On Dec 19, 2013 9:15 AM, "John Alberts" john.m.alberts@gmail.com wrote:

On Thu, Dec 19, 2013 at 9:11 AM, Chris Roberts <
chrisroberts.code@gmail.com> wrote:

Hi. You probably want:

content lazy{ do some stuff and return string }

I think I tried that but I I guess I didn't get the syntax correct. Every
variation I tried kept returning errors, so I assumed I was using 'lazy' in
a place where it shouldn't be. I'll give this a try again.

Thanks

--
John Alberts