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 -~----------~----~----~----~------~----~------~--~---