Seite wählen

Custom Datatypes in Puppet

von | Nov 3, 2017 | Puppet, Foreman

Puppet Logo
Eine der größten Neuerungen mit Puppet 4 waren wohl die Typisierung von Variablen, so dass nun direkt bei der Parametrisierung einer Klasse oder definierten Resource ein Datentyp für die Parameter festgelegt werden kann. Da der Wert dann automatisch gegen diese Typisierung geprüft, entfallen damit auch die Validierungsfunktionen aus der Stdlibs. Neben den einfachen Datentypen wie Integer und String können hier auch komplexere Vorgaben gemacht werden. Das einfachste Beispiel wäre die Länge eines Strings einzuschränken indem Mindest- und Maximallänge angegeben werden wie String[1,10] für einen String mit mindestens einem, maximal zehn Zeichen Länge. Etwas komplexer wird eine Werteliste wie Enum['running','stopped'], wenn ein Wert auch undefiniert sein darf also Optional[String] oder ein Pattern[] um einen Vergleich mit einem regulären Ausdruck zu machen, aber auch dies stößt irgendwann an die Grenzen und man landet bei den abstrakten Datentypen.
Der abstrakteste Datentyp ist Struct, welcher es erlaubt eine komplett eigene Struktur als Hash festzulegen. Und hier kommt nun eine Neuerung von Puppet 4.8 ins Spiel, die es erlaubt Custom Datatypes als Aliasses zu erstellen. Diese landen im Unterordner types des Modules und müssen sich wie gewohnt an eine Namenskonvention halten damit das Autoloading funktioniert. Ein sehr gutes Beispiel findet sich im Systemd-Module von Camptocamp auf welches mich Ewoud Kohl van Wijngaarden dankenswerterweise aufmerksam gemacht hat.

Da dieses Beispiel allerdings auch etwas umfangreicher ist, möchte ich zum Erklären auf ein Beispiel zurückgreifen, dass ich im Rahmen des Puppet-Modules für Foreman erstellt habe. Ziel war es das Column_View-Plugin einzubinden, welches für jede zusätzlich eingeblendete Column 3 Pflicht- und 5 optionale Konfigurationswerte benötigt. Diese wollte ich als Hash übergeben um es dann in einer For-Each-Schleife im Template umzusetzen. Damit dies sauber funktioniert dürfen die Werte keine Leerstrings sein, somit sieht meine Definition des Custom Datatypes in der Datei types/column_view_column.pp folgendermaßen aus.

type Foreman::Column_view_column = Struct[
  {
    title => String[1],
    after => String[1],
    content => String[1],
    Optional['conditional'] => String[1],
    Optional['eval_content'] => String[1],
    Optional['view'] => String[1],
    Optional['width'] => String[1],
    Optional['custom_method'] => String[1],
  }
]

Verwendung findet dies dann einfach als Datentyp für den Klassenparameter. In meinem Fall allerdings nochmal innnerhalb eines Hashes, der als Key einen String entgegennimmt und als Wert die definierte Struktur.

class foreman::plugin::column_view (
  Hash[String, Foreman::Column_view_column] $columns = {},
){
  foreman::plugin { 'column_view':
    config => template('foreman/foreman_column_view.yaml.erb'),
  }
}

Damit kann dann ein Hash von einzublendenden Columns übergeben werden.

class { 'foreman::plugin::column_view':
  columns => {
    'architecture' => {
      'title' => 'Architecture',
      'after' => 'last_report',
      'content' => 'facts_hash["architecture"]'
    },
    'console' => {
      'title' => 'Console',
      'after' => '0',
      'content' => 'link_to(_("Console"), "https://#{host.interfaces.first.name}.domainname", { :class => "btn btn-info" } )',
      'conditional' => ':bmc_available?',
      'eval_content' => 'true',
      'view' => ':hosts_properties',
    }
  }
}

Es bietet sich natürlich an für so ein Konstrukt entsprechende Tests zu schreiben, sowohl für den Positiv- als auch Negativ-Fall. Insbesondere da eventuell davon abhängige Software noch nicht sauber mit umgehen kann, da dieses Konstrukt noch relativ neu ist. Leider hatte ich genau so einen Fall getroffen, weshalb ich für denjenigen, der das gesamte Beispiel sehen will nur auf den Pull-Request und noch nicht auf das Modul verweisen kann.

Dirk Götz
Dirk Götz
Principal Consultant

Dirk ist Red Hat Spezialist und arbeitet bei NETWAYS im Bereich Consulting für Icinga, Puppet, Ansible, Foreman und andere Systems-Management-Lösungen. Früher war er bei einem Träger der gesetzlichen Rentenversicherung als Senior Administrator beschäftigt und auch für die Ausbildung der Azubis verantwortlich wie nun bei NETWAYS.

0 Kommentare

Trackbacks/Pingbacks

  1. Monthly Snap November > OSMC 2017, OSDC 2018, Puppet, GitLab EE, Icinga 2, NETWAYS Startupdays, Visual Studio 2017 › NETWAYS Blog - […] In November, we had our international Open Source Monitoring Conference where Markus announced the last tickets for. Julia blogged…

Einen Kommentar abschicken

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Mehr Beiträge zum Thema Puppet | Foreman

Kritischer Fehler in Puppet Version 7.29.0 und 8.5.0

Eine Warnung an alle Nutzer von Puppet, aber auch Foreman oder dem Icinga-Installer, die Version 7.29.0 und 8.5.0 von Puppet enthält einen kritischen Fehler, der die Erstellung eines Katalogs und somit die Anwendung der Konfiguration verhindert. Daher stellt bitte...

Foreman Birthday Event 2023 – Recap

Two years ago I started my recap of the event with "Last week on Thursday we had the Foreman Birthday event and I can proudly say it was a big success." and I can do the same for this one. At the beginning of the year planning for the event started in the background...

Foreman Birthday Event 2023 – Save the date

I can happily announce we will have a Birthday event on 27.07. this year again. I will be our host again, supported by my colleagues from NETWAYS, ATIX and the Foreman Project. When I talked to people at Cfgmgmtcamp, I was told by many that they really liked the...

Leap(p) to Red Hat Enterprise Linux 9

Ich muss mich direkt für das Wortspiel im Titel entschuldigen, aber es lag so nahe als ich mich für das Thema entschieden hatte, denn ich möchte einen neuen Blick auf Leapp werfen mit dem Upgrades von Red Hat Enterprise Linux (RHEL) durchgeführt werden können. Der...