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: [r...@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 [r...@buildtest network-scripts]# The device name is not what I want, but with that template code it's what I expect: [r...@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 [r...@buildtest network-scripts]# And I think I understand why the IP addresses are mangled: [r...@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 [r...@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+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en -~----------~----~----~----~------~----~------~--~---