Gajillion
2009-Jul-09 15:23 UTC
[Puppet Users] Help! Templates, definitions, and arrays, oh my!
Hi all,
This little exercise is pointing out huge gaps in my Puppet/Ruby
knowledge and I''m not sure how to get around it. I''m working
on a
module for writing interface files and everything works fine except
for my "vlan" interface creation. Here''s the snippet
that''s passed to
my definition:
vlan: {
network::interface::nic { $name:
my_type => "vlan_primary",
nic_type => $nic_type,
}
network::interface::nic { $vlans:
my_type => "vlan_secondary",
master => $name,
ip => $ip,
netmask => $netmask,
gateway => $gateway,
nic_type => $nic_type,
}
$name is the name of the parent nic (eth6 for an eth6.101 tagged
vlan). $vlans is an array with one or more vlan tags
([ "100","101","200"]), and $ip is an array with
the associated ip
addresses ["1.2.3.7","1.2.3.8","1.2.3.9"].
network::interface::nic is defined as
define network::interface::nic($my_type, $ip = "", $netmask =
"",
$master = "", $nic_type = "Ethernet", $gateway =
"",$vlan = ""){
file { $name:
path => $my_type ? {
"vlan_secondary" =>
"/etc/sysconfig/network-
scripts/ifcfg-$master.$name",
default => "/etc/sysconfig/network-
scripts/ifcfg-$name",
},
owner => root,
group => root,
mode => 755,
content => template("network/ifcfg"),
}
The relevant part of the ifcfg template is this:
# Puppet managed.
DEVICE=<%=name %>
<% if ip != "" %>IPADDR=<%=ip %>
Now, when I call this definition:
network::interface::setup { "eth6":
ensure => "present",
ip =>
["1.2.3.7","1.2.3.8","1.2.3.9"],
netmask => "255.255.255.0",
config_type => "vlan",
nic_type => "Ethernet",
vlans => [ "100","101","200"],
}
as I hope, I get the correct 4 separate files:
[root@buildtest network-scripts]# ls -l ifcfg-eth6*
-rwxr-xr-x 1 root root 83 Jul 9 11:06 ifcfg-eth6
-rwxr-xr-x 1 root root 141 Jul 9 11:06 ifcfg-eth6.100
-rwxr-xr-x 1 root root 141 Jul 9 11:06 ifcfg-eth6.101
-rwxr-xr-x 1 root root 141 Jul 9 11:06 ifcfg-eth6.200
[root@buildtest network-scripts]#
The device name is not what I want, but with that template code it''s
what I expect:
[root@buildtest network-scripts]# grep DEVICE ifcfg-eth6*
ifcfg-eth6:DEVICE=eth6
ifcfg-eth6.100:DEVICE=100
ifcfg-eth6.101:DEVICE=101
ifcfg-eth6.200:DEVICE=200
[root@buildtest network-scripts]#
And I think I understand why the IP addresses are mangled:
[root@buildtest network-scripts]# grep IPADDR ifcfg-eth6*
ifcfg-eth6.100:IPADDR=1.2.3.71.2.3.81.2.3.9
ifcfg-eth6.101:IPADDR=1.2.3.71.2.3.81.2.3.9
ifcfg-eth6.200:IPADDR=1.2.3.71.2.3.81.2.3.9
[root@buildtest network-scripts]#
However, here''s what I don''t get. I want device name to be
DEVICE$master.$name. However, adding the code
<% if my_type == "vlan_secondary" then
name = master.concat(''.''.concat(name))
end %>
to my template gives me an error "Failed to parse template network/
ifcfg: can''t convert nil into String"
Changing the code to
<% if my_type == "vlan_secondary" then
myname = master
myname.concat(''.''.concat(name))
end %>
gives me the even more bizarre error:
err: Could not create eth6.101.100.200: 200 already exists with name /
etc/sysconfig/network-scripts/ifcfg-eth6.101.100.200
It''s as if some times name equals one slice of an array and other
times its the whole array. How does puppet iterate over the arrays
passed to it? Is the only one processed the name variable? Is there
a way to get an argument and the name variable parsed at the same
index?
--~--~---------~--~----~------------~-------~--~----~
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+unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/puppet-users?hl=en
-~----------~----~----~----~------~----~------~--~---
Gajillion
2009-Jul-09 16:08 UTC
[Puppet Users] Re: Help! Templates, definitions, and arrays, oh my!
I fixed the first issue of the DEVICE name by modifying my template like so: <% if my_type == "vlan_secondary"%>DEVICE=<%=master + ''.'' + name%> <%else -%> DEVICE=<%=name %> <% end -%> (I could have sworn I tried that before and it didn''t work). Now, how do I map my IP addresses? Do I have to create some internal map inside the array? On Jul 9, 10:23 am, Gajillion <gajill...@gmail.com> wrote:> Hi all, > This little exercise is pointing out huge gaps in my Puppet/Ruby > knowledge and I''m not sure how to get around it. I''m working on a > module for writing interface files and everything works fine except > for my "vlan" interface creation. Here''s the snippet that''s passed to > my definition: > > vlan: { > network::interface::nic { $name: > my_type => "vlan_primary", > nic_type => $nic_type, > } > network::interface::nic { $vlans: > my_type => "vlan_secondary", > master => $name, > ip => $ip, > netmask => $netmask, > gateway => $gateway, > nic_type => $nic_type, > } > > $name is the name of the parent nic (eth6 for an eth6.101 tagged > vlan). $vlans is an array with one or more vlan tags > ([ "100","101","200"]), and $ip is an array with the associated ip > addresses ["1.2.3.7","1.2.3.8","1.2.3.9"]. > > network::interface::nic is defined as > > define network::interface::nic($my_type, $ip = "", $netmask = "", > $master = "", $nic_type = "Ethernet", $gateway = "",$vlan = ""){ > file { $name: > path => $my_type ? { > "vlan_secondary" => "/etc/sysconfig/network- > scripts/ifcfg-$master.$name", > default => "/etc/sysconfig/network- > scripts/ifcfg-$name", > }, > owner => root, > group => root, > mode => 755, > content => template("network/ifcfg"), > } > > The relevant part of the ifcfg template is this: > > # Puppet managed. > DEVICE=<%=name %> > <% if ip != "" %>IPADDR=<%=ip %> > > Now, when I call this definition: > > network::interface::setup { "eth6": > ensure => "present", > ip => ["1.2.3.7","1.2.3.8","1.2.3.9"], > netmask => "255.255.255.0", > config_type => "vlan", > nic_type => "Ethernet", > vlans => [ "100","101","200"], > } > > as I hope, I get the correct 4 separate files: > > [root@buildtest network-scripts]# ls -l ifcfg-eth6* > -rwxr-xr-x 1 root root 83 Jul 9 11:06 ifcfg-eth6 > -rwxr-xr-x 1 root root 141 Jul 9 11:06 ifcfg-eth6.100 > -rwxr-xr-x 1 root root 141 Jul 9 11:06 ifcfg-eth6.101 > -rwxr-xr-x 1 root root 141 Jul 9 11:06 ifcfg-eth6.200 > [root@buildtest network-scripts]# > > The device name is not what I want, but with that template code it''s > what I expect: > > [root@buildtest network-scripts]# grep DEVICE ifcfg-eth6* > ifcfg-eth6:DEVICE=eth6 > ifcfg-eth6.100:DEVICE=100 > ifcfg-eth6.101:DEVICE=101 > ifcfg-eth6.200:DEVICE=200 > [root@buildtest network-scripts]# > > And I think I understand why the IP addresses are mangled: > > [root@buildtest network-scripts]# grep IPADDR ifcfg-eth6* > ifcfg-eth6.100:IPADDR=1.2.3.71.2.3.81.2.3.9 > ifcfg-eth6.101:IPADDR=1.2.3.71.2.3.81.2.3.9 > ifcfg-eth6.200:IPADDR=1.2.3.71.2.3.81.2.3.9 > [root@buildtest network-scripts]# > > However, here''s what I don''t get. I want device name to be DEVICE> $master.$name. However, adding the code > > <% if my_type == "vlan_secondary" then > name = master.concat(''.''.concat(name)) > end %> > > to my template gives me an error "Failed to parse template network/ > ifcfg: can''t convert nil into String" > > Changing the code to > > <% if my_type == "vlan_secondary" then > myname = master > myname.concat(''.''.concat(name)) > end %> > > gives me the even more bizarre error: > > err: Could not create eth6.101.100.200: 200 already exists with name / > etc/sysconfig/network-scripts/ifcfg-eth6.101.100.200 > > It''s as if some times name equals one slice of an array and other > times its the whole array. How does puppet iterate over the arrays > passed to it? Is the only one processed the name variable? Is there > a way to get an argument and the name variable parsed at the same > index?--~--~---------~--~----~------------~-------~--~----~ 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+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en -~----------~----~----~----~------~----~------~--~---
Joel Heenan
2009-Jul-10 00:53 UTC
[Puppet Users] Re: Help! Templates, definitions, and arrays, oh my!
I think you are trying to use a multidimensional array within puppet. I
don''t know the best way to do this, but I have used the following hack:
$ips_vlans = [''1.2.3.7/100'', ''1.2.3.8/200'']
then within the template doing:
<% ips_vlans.each do |ipv| -%>
<% ip = ipv.split("/")[0] -%>
<% vlan = ipv.split("/")[1] -%>
<% end -%>
Yes - it is horrible. Hopefully someone has something better :-)
Joel
On Fri, Jul 10, 2009 at 2:08 AM, Gajillion <gajillion@gmail.com> wrote:
>
> I fixed the first issue of the DEVICE name by modifying my template
> like so:
>
> <% if my_type == "vlan_secondary"%>DEVICE=<%=master +
''.'' + name%>
> <%else -%>
> DEVICE=<%=name %>
> <% end -%>
>
> (I could have sworn I tried that before and it didn''t work).
>
> Now, how do I map my IP addresses? Do I have to create some internal
> map inside the array?
>
> On Jul 9, 10:23 am, Gajillion <gajill...@gmail.com> wrote:
> > Hi all,
> > This little exercise is pointing out huge gaps in my Puppet/Ruby
> > knowledge and I''m not sure how to get around it.
I''m working on a
> > module for writing interface files and everything works fine except
> > for my "vlan" interface creation. Here''s the
snippet that''s passed to
> > my definition:
> >
> > vlan: {
> > network::interface::nic { $name:
> > my_type => "vlan_primary",
> > nic_type => $nic_type,
> > }
> > network::interface::nic { $vlans:
> > my_type => "vlan_secondary",
> > master => $name,
> > ip => $ip,
> > netmask => $netmask,
> > gateway => $gateway,
> > nic_type => $nic_type,
> > }
> >
> > $name is the name of the parent nic (eth6 for an eth6.101 tagged
> > vlan). $vlans is an array with one or more vlan tags
> > ([ "100","101","200"]), and $ip is an
array with the associated ip
> > addresses
["1.2.3.7","1.2.3.8","1.2.3.9"].
> >
> > network::interface::nic is defined as
> >
> > define network::interface::nic($my_type, $ip = "", $netmask
= "",
> > $master = "", $nic_type = "Ethernet", $gateway =
"",$vlan = ""){
> > file { $name:
> > path => $my_type ? {
> > "vlan_secondary" =>
"/etc/sysconfig/network-
> > scripts/ifcfg-$master.$name",
> > default =>
"/etc/sysconfig/network-
> > scripts/ifcfg-$name",
> > },
> > owner => root,
> > group => root,
> > mode => 755,
> > content => template("network/ifcfg"),
> > }
> >
> > The relevant part of the ifcfg template is this:
> >
> > # Puppet managed.
> > DEVICE=<%=name %>
> > <% if ip != "" %>IPADDR=<%=ip %>
> >
> > Now, when I call this definition:
> >
> > network::interface::setup { "eth6":
> > ensure => "present",
> > ip =>
["1.2.3.7","1.2.3.8","1.2.3.9"],
> > netmask => "255.255.255.0",
> > config_type => "vlan",
> > nic_type => "Ethernet",
> > vlans => [
"100","101","200"],
> > }
> >
> > as I hope, I get the correct 4 separate files:
> >
> > [root@buildtest network-scripts]# ls -l ifcfg-eth6*
> > -rwxr-xr-x 1 root root 83 Jul 9 11:06 ifcfg-eth6
> > -rwxr-xr-x 1 root root 141 Jul 9 11:06 ifcfg-eth6.100
> > -rwxr-xr-x 1 root root 141 Jul 9 11:06 ifcfg-eth6.101
> > -rwxr-xr-x 1 root root 141 Jul 9 11:06 ifcfg-eth6.200
> > [root@buildtest network-scripts]#
> >
> > The device name is not what I want, but with that template code
it''s
> > what I expect:
> >
> > [root@buildtest network-scripts]# grep DEVICE ifcfg-eth6*
> > ifcfg-eth6:DEVICE=eth6
> > ifcfg-eth6.100:DEVICE=100
> > ifcfg-eth6.101:DEVICE=101
> > ifcfg-eth6.200:DEVICE=200
> > [root@buildtest network-scripts]#
> >
> > And I think I understand why the IP addresses are mangled:
> >
> > [root@buildtest network-scripts]# grep IPADDR ifcfg-eth6*
> > ifcfg-eth6.100:IPADDR=1.2.3.71.2.3.81.2.3.9
> > ifcfg-eth6.101:IPADDR=1.2.3.71.2.3.81.2.3.9
> > ifcfg-eth6.200:IPADDR=1.2.3.71.2.3.81.2.3.9
> > [root@buildtest network-scripts]#
> >
> > However, here''s what I don''t get. I want device
name to be DEVICE> > $master.$name. However, adding the code
> >
> > <% if my_type == "vlan_secondary" then
> > name = master.concat(''.''.concat(name))
> > end %>
> >
> > to my template gives me an error "Failed to parse template
network/
> > ifcfg: can''t convert nil into String"
> >
> > Changing the code to
> >
> > <% if my_type == "vlan_secondary" then
> > myname = master
> > myname.concat(''.''.concat(name))
> > end %>
> >
> > gives me the even more bizarre error:
> >
> > err: Could not create eth6.101.100.200: 200 already exists with name /
> > etc/sysconfig/network-scripts/ifcfg-eth6.101.100.200
> >
> > It''s as if some times name equals one slice of an array and
other
> > times its the whole array. How does puppet iterate over the arrays
> > passed to it? Is the only one processed the name variable? Is there
> > a way to get an argument and the name variable parsed at the same
> > index?
> >
>
--~--~---------~--~----~------------~-------~--~----~
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+unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/puppet-users?hl=en
-~----------~----~----~----~------~----~------~--~---