Puppet, Arrays & Iteratoren

Endlich, endlich, endlich kommt in Puppet 3.2 die Möglichkeit, Schleifen zu bauen. Dann könnte ich eventuell folgende Aufgabenstellung ein klein wenig einfacher realisieren (aktuell arbeite ich bis zur endgültigen Umstellung unserer Systeme mit Puppet 2.7):

Fasse alle im Rechner befindlichen Blockdevices der Form “/dev/sd*” – aber außer /dev/sda – in einer LVM volume group zusammen.

Das Herausfinden der Blockdevices erledigt ein Fact aus Facter … naja, nicht ganz – ein in Facter 2.0 verfügbarer Fact, den ma aber dankenswerterweise zurückportieren kann. Dieser liefert uns $blockdevices – eine Komma-getrennte Liste der gefundenen devices, allerdings ohne “/dev/”, also nur “sda,sdb,sdc”.

Das hinzufügen, und dann … ja, was dann? In Ruby kein Thema, aber jetzt möchte ich von “sda,sdb,sdc” zu [“/dev/sda”, “/dev/sdb”, “/dev/sdc”].

Und das geht so:

# next line broken up for readability
$devices_tmp    = inline_template( '
    <%= devs=scope.lookupvar("::blockdevices")
        .split(",")
        .select{|f| ! f.include? "sda" }
        .select{|f| f.include? "sd" }
        .collect{|f| "/dev/" + f}.join "," %>' )

# here we split the string back to an array. 
$devices_wanted = split($devices_tmp, ",")

# but it works.
# isn't life shit?
notify { $devices_wanted : }

Schön ist anders. Falls jemand eine bessere Idee hat – immer her damit …