Argh, I'll have to take that back.  The docs are right, the quotes are in
fact necessary.  Without them has_variable will always return false.

Here's the rub: If a variable is never declared then has_variable returns
false.  If it's set to 'undef' then it returns true. That wouldn't be so bad
if you could use the comparison operators to check for 'undef' but you
can't.  I worked around it by using the string value "none" as my class
default value so that the != operator would work in the template.  The
problem with that is that it breaks the 'if $variable { do stuff }'
construct which is so widely used.  IMHO the current functionality should
either be changed or specifically called out in the templating docs so users
aren't caught by surprise.

On Tue, May 24, 2011 at 8:30 AM, Aaron Grewell <aaron.grew...@gmail.com>wrote:

> Yup, that works.  FYI there's a bug in the docs.  The example shown here:
> http://docs.puppetlabs.com/guides/templating.html#undefined-variables
>
> Looks like so:
> <% if has_variable?("myvar") then %>
> myvar has <%= myvar %> value
> <% end %>
>
>
> On Mon, May 23, 2011 at 4:59 PM, Nan Liu <n...@puppetlabs.com> wrote:
>
>> On Mon, May 23, 2011 at 4:09 PM, Aaron Grewell <aaron.grew...@gmail.com>
>> wrote:
>> > I've got a conditional statement that isn't working the way I expect.
>> I've
>> > created a define() for building network interfaces, but two of the
>> entries
>> > (master & slave) are only appropriate for bonded interfaces.  I would
>> like
>> > them to be completely excluded from regular interfaces.  This seems easy
>> > enough according to the docs, set master & slave to 'undef' and use the
>> 'if
>> > has_variable' syntax in the template.  It doesn't work though.  I also
>> tried
>> > using 'if variable != "undef"' but this also does not work.
>> Interestingly
>> > the results of the two are exactly the same.  I'm clearly missing
>> > something.  How do I get the template to skip these lines?
>> >
>> > The results end up looking like this:
>> > ### This file is being managed by Puppet
>> > ### DO NOT EDIT
>> > DEVICE=eth0
>> > BOOTPROTO=none
>> > ONBOOT=yes
>> > IPADDR=192.168.1.1
>> > NETMASK=255.255.255.0
>> > HWADDR=eth0
>> > MASTER=undef
>> > SLAVE=undef
>> >
>> > The define is built like so:
>> >     define network_interface (
>> >         $bootproto,
>> >         $onboot,
>> >         $ipaddr  = undef,
>> >         $netmask = undef,
>> >         $hwaddr  = undef,
>> >         $master  = undef,
>> >         $slave   = undef
>> >     ){  <SNIP> }
>> >
>> > And the template looks like:
>> > ### This file is being managed by Puppet
>> > ### DO NOT EDIT
>> > DEVICE=<%= name %>
>> > BOOTPROTO=<%= bootproto %>
>> > ONBOOT=<%= onboot %>
>> > <% if ipaddr != "undef" -%>
>> > IPADDR=<%= ipaddr %>
>> > <% end -%>
>> > <% if netmask != "undef" -%>
>> > NETMASK=<%= netmask %>
>> > <% end -%>
>> > <% if final_hwaddr != "undef" -%>
>> > HWADDR=<%= final_hwaddr %>
>> > <% end -%>
>> > <% if master != "undef" -%>
>> > MASTER=<%= master %>
>> > <% end -%>
>> > <% if slave != "undef" -%>
>> > SLAVE=<%= slave %>
>> > <% end -%>
>> >
>> > Or I also tried:
>> > ### This file is being managed by Puppet
>> > ### DO NOT EDIT
>> > DEVICE=<%= name %>
>> > BOOTPROTO=<%= bootproto %>
>> > ONBOOT=<%= onboot %>
>> > <% if has_variable?("ipaddr") then -%>
>> > IPADDR=<%= ipaddr %>
>> > <% end -%>
>> > <% if has_variable?("netmask") then -%>
>> > NETMASK=<%= netmask %>
>> > <% end -%>
>> > <% if has_variable?("final_hwaddr") then -%>
>> > HWADDR=<%= final_hwaddr %>
>> > <% end -%>
>> > <% if has_variable?("master") then -%>
>> > MASTER=<%= master %>
>> > <% end -%>
>> > <% if has_variable?("slave") then -%>
>> > SLAVE=<%= slave %>
>> > <% end -%>
>>
>> Don't quote it, has_variable?(slave).
>>
>> Nan
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Puppet Users" group.
>> To post to this group, send email to puppet-users@googlegroups.com.
>> To unsubscribe from this group, send email to
>> puppet-users+unsubscr...@googlegroups.com.
>> For more options, visit this group at
>> http://groups.google.com/group/puppet-users?hl=en.
>>
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Users" group.
To post to this group, send email to puppet-users@googlegroups.com.
To unsubscribe from this group, send email to 
puppet-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/puppet-users?hl=en.

Reply via email to