beyonddc.storage@gmail.com
2013-Oct-28 16:43 UTC
[Puppet Users] inline_template private method `gets'' called for false:FalseClass
Hi, I am new to Ruby ERB and inline_template. Can anyone spot what''s wrong with this inline_template? $moddedContent = inline_template("<%= puts gets(nil).gsub(/one two three/,\"\") /tmp/blah %>") exec { "/bin/echo ''${moddedContent}'' > /tmp/blah" : } When I try to apply it, I got the following error. Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Failed to parse inline template: private method `gets'' called for false:FalseClass at foo.pp:33 on node testnode Thanks! David -- You received this message because you are subscribed to the Google Groups "Puppet Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to puppet-users+unsubscribe@googlegroups.com. To post to this group, send email to puppet-users@googlegroups.com. Visit this group at http://groups.google.com/group/puppet-users. For more options, visit https://groups.google.com/groups/opt_out.
jcbollinger
2013-Oct-29 14:33 UTC
[Puppet Users] Re: inline_template private method `gets'' called for false:FalseClass
On Monday, October 28, 2013 11:43:29 AM UTC-5, beyonddc...@gmail.com wrote:> > Hi, > > I am new to Ruby ERB and inline_template. Can anyone spot what''s wrong > with this inline_template? > > $moddedContent = inline_template("<%= puts gets(nil).gsub(/one > two three/,\"\") /tmp/blah %>") > exec { > "/bin/echo ''${moddedContent}'' > /tmp/blah" : > } > > When I try to apply it, I got the following error. > Error: Could not retrieve catalog from remote server: Error 400 on SERVER: > Failed to parse inline template: private method `gets'' called for > false:FalseClass at foo.pp:33 on node testnode > >The purpose of an ERB template is to generate strings consisting of zero or more static parts and one or more dynamic parts. They are otherwise a poor vehicle for embedding general-purpose Ruby code in your manifests. In particular, you do not normally want to perform explicit I/O in a template. You certainly don''t want to perform I/O to or from the standard streams, as these should not be connected/open when the template is evaluated. It''s not clear to me whether the I/O you are doing is your actual objective (in which case a template is the wrong tool -- use generate() or a custom function instead) or whether it''s just your attempt at implementing what you''re really after. Also, it is essential to understand that all Puppet DSL functions, including inline_template(), are executed on the master during catalog compilation, whereas resources, including Execs, are applied to client nodes. As such, if a DSL function drops a file on the local file system, resources cannot normally expected to consume that file because their local file system at application time is normally a different one. Here''s a trivial example of how an inline template might be used: $foo = ''one two three four five'' $moddedContent = inline_template("<%= @foo.gsub(/one two three/,'''') %>") notify { ''inline_template demo'': message => "The modified content is $moddedContent" } # Yields "The modified content is four five" Of course, an experienced Puppeteer would never do that particular job via inline_template(), because the regsubst() function can more clearly, succinctly, and cheaply express the same thing: $moddedContent = regsubst($foo, ''one two three'', '''') John -- You received this message because you are subscribed to the Google Groups "Puppet Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to puppet-users+unsubscribe@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/puppet-users/fbf67d73-3204-4e33-b0a1-4166266e22db%40googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.