[ruby-de] Ruby und Puppet

Denny Fuchs linuxmail at 4lin.net
Di Apr 18 00:01:37 JST 2017


Hallo,

ich hoffe ich bin nicht zu weit weg vom Thema, da es doch recht Puppet lastig ist, aber am Ende doch eher ein Ruby Problem sein könnte :-)

Es geht im Grunde darum, aus einer Datei mit Textzeilen  ( welches dann glaube ich ein Array ist ) die Werte wieder passend auszulesen um sie dann anderweitig abzulegen.  Der Kern um den sich alles dreht ist:

https://www.netways.de/fileadmin/images/Events_Trainings/Events/OSMC/2015/Slides_2015/The_Road_to_lazy_Monitoring_with_Icinga2_and_Puppet-Tom_De_Vylder.pdf

Da geht es um eine „Automatisierung“ von Puppet und dem Monitoring mittels Icinga2. Mein Problem sind die Seiten ab 36 bis 41:

Dabei geht es darum, dass ein Puppet Fact hinzugefügt werden soll, welches alle (Puppet-) Module und Klassen auflistet. Diese Daten sollten dann als Werte in einer Datei landen (von Icinga2, aber das nur am Rande).

Aus der PDF habe ich folgende Zeilen entnommen und lediglich  „puppet_classes“ in  „classes“  umbenannt, da ich sonst andere Probleme bekam ...

===============

classes_file  = '/var/lib/puppet/state/classes.txt'
classes_hash  = {}
modules_array = []
File.foreach(classes_file) do |l|
   modules_array << l.chomp.gsub(/::.*/, '')
end
modules_array = modules_array.sort.uniq
modules_array.each do |i|
   classes_array = []
     classes_array << i
       File.foreach(classes_file) do |l|
             classes_array << l.chomp if l =~ /^#{i}/
                   classes_array = classes_array.sort.uniq
               end
         classes_hash[i] = classes_array
end

Facter.add(
 :modules, :timeout => 10) do
   confine :kernel => 'Linux'
     setcode do
           modules_array.sort.uniq.join(', ').to_s
             end
 end
Facter.add(
 :classes, :timeout => 10) do
   confine :kernel => 'Linux'
     setcode do
           classes_hash.map { |_k, v| v }.sort.uniq.join(', ').to_s
             end
 end

===============

Führe ich das Kommando „facter -p classes“ aus ( facter ist ein Tool von Puppet, welches den obigen Code auf dem jeweiligen Rechner auswertet und verarbeitet ):

apache, apache::default_confd_files, apache::default_mods, apache::mod::alias, apache::mod::authn_core,[…]

... was auf dem ersten Blick gut aussieht, allerdings sollte bei --yaml auch die korrekte YAML Syntax herauskommen:

---
 classes: "apache, apache::default_confd_files[…]

was dann schon nicht mehr so gut aussieht. Es hätte so aussehen müssen:

---
classes:
  - apache
  - "apache::default_confd_files"
  - "apache::default_mods"
...

Die classes.txt (die, die ausgelesen wird) hat dabei folgenden Inhalt:

$ cat /var/lib/puppet/state/classes.txt

settings
base::root::password
profile::icinga2::agent
icinga2::params
icinga2
icinga2::repo
icinga2::install
icinga2::config
icinga2::service
icinga2::feature::checker
icinga2::feature::mainlog
icinga2::feature::api

Im Puppet Manifest ist dann noch folgendes festgelegt, was diese Werte aufnehmen und verarbeiten soll:


=====
[...]
     vars             => {
       puppet_classes => inline_template (
       '<%= classes.collect { |k, v| v }.sort.join(" ") %>'
       ),
     },
[...]
=====


Am Ende der Prozedur (also Puppet Agent Durchlauf) erhalte ich dann nur:

vars.puppet_classes = "            "

welches dann in die benötigte Datei (für Icinga2) geschrieben werden würde. Das ist natürlich quark. Tausche ich ".collect" durch ein ".each" aus, sieht das Ergebnis so aus:

 vars.puppet_classes = "base::root::password icinga2 icinga2::config icinga2::feature::api icinga2::feature::checker icinga2::feature::mainlog icinga2::install icinga2::params icinga2::repo icinga2::service profile::icinga2::agent settings"

Was seltsam ist:

Es sind bedeutend mehr Zeilen in der classes.txt enthalten, als dort stehen ... Es ergibt daher für mich keinen Sinn ... Selbst wenn ich ".collect" stehen lasse und die Leerzeichen "zähle", komme ich nicht auf die Gleiche Anzahl, wie es sein müssten.

Eventuell kann mir jemand aus der Ruby Gruppe helfen :-)

cu denny








Mehr Informationen über die Mailingliste ruby-de