Verifying YAML

Wer Puppet mit Hiera und einem YAML Backend nutzt weiß das einfache Format sicherlich zu schätzen. Listen, Maps und Einzelwerte lassen sich schnell, einfach und leserlich abbilden:

Liste1: ["a", "b", "c"]
Liste2:
  - d
  - e
MapEins:
  eins: 1
  zwei: 2
  drei:
    drei: 3
key: value

Zur Interpretation der Datenstrukturen verlässt sich YAML auf eine fehlerfreie Einrückung der einzelnen Elemente, z.B. müssen in Liste2 die Element e und d mit gleich vielen Leerzeichen eingerückt werden. Im Prinzip eine sehr einfach Regel, allerdings ist vermutlich auch schon jeder in solch kleine Stolperfallen des YAML-Formats gelaufen. In Verbindung mit Puppet führt dies manchmal zu unklaren bzw. ungenauen Fehlermeldungen. Oftmals werden Fehler durch zu viele oder zu wenige Leerzeichen, Tabs, unsichtbare Sonderzeichen bzw. falsche Zeilenumbrüche verursacht. Aber soweit muss es nicht kommen, da es viele Möglichkeiten gibt die YAML-Syntax zu prüfen. In der Regel bietet jede Skript Sprache einen YAML-Parser, welche mehr oder weniger klare Fehlermeldungen ausgeben. Für ein kleines Beispiel habe ich ein Element falsch eingerückt und in verschiedenen Skript Sprachen geladen:

$ python -c "import yaml; yaml.load( open('my.yaml', 'r'), Loader=yaml.CLoader  )"
yaml.scanner.ScannerError: mapping values are not allowed in this context
  in "my.yaml", line 8, column 8
$ ruby -e "require 'yaml'; YAML.load_file('my.yaml')"
/usr/share/ruby/psych.rb:370:in 'parse': (my.yaml): mapping values are not allowed in this context at line 8 column 8 (Psych::SyntaxError)
$ js-yaml my.yaml
JS-YAML: bad indentation of a mapping entry at line 8, column 8:
       zwei: 2
           ^

Ihr seht selbst, dass js-yaml den Fehler wohl am besten und klarsten darstellt. Natürlich will keiner immer wieder auf der Command-Line überprüfen ob die verwendeten YAML Dateien korrekt formatiert sind. Am besten soll dies der Editor bereits beim speichern der Datei anzeigen. Wer vim mit Syntastic verwendet muss nur dafür sorgen, dass js-yaml vorhanden ist. Dies installiert man am besten über den Node.js Paket Manager npm.

$ apt-get/yum/dnf install npm
$ npm install -g js-yaml

Wie man Syntastic für vim installiert könnt ihr hier nachlesen.

Achim Ledermüller
Achim Ledermüller
Lead Senior Systems Engineer

Der Exil Regensburger kam 2012 zu NETWAYS, nachdem er dort sein Wirtschaftsinformatik Studium beendet hatte. In der Managed Services Abteilung ist unter anderem für die Automatisierung des RZ-Betriebs und der Evaluierung und Einführung neuer Technologien zuständig.

Encrypted YAML als Hiera Backend

yamlHeute auch von mir etwas zum Thema Hiera. Möchte man gewisse Informationen in seinem Hieradata-Store nicht lesbar ablegen, bietet sich die Verwendung von eYaml an. Die Verschlüsselung macht besonders Sinn, wenn ein Versionierungstool zur Ablage verwendet wird.

# gem install hiera-eyaml
# eyaml createkeys

Nach Installation des Backend und dem Erzeigen der Schlüssel, müssen noch die Berechtigungen angepasst werden.

# cp -a ~/keys /etc/puppet/keys
# chown -R root:puppet /etc/puppet/keys
# chmod 0750 /etc/puppet/keys
# chmod 0640 /etc/puppet/keys/*.pem

Die Hiera-Konfiguration könnte wie folgt aussehen:

---
:backends:
  - eyaml
  - yaml
:hierarchy:
  - secure
  - "%{fqdn}
  - defaults
:yaml:
  :datadir: "/etc/puppet/hieradata"
:eyaml:
  :datadir: "/etc/puppet/hieradata"
:pkcs7_private_key: /etc/puppet/keys/private_key.pkcs7.pem
:pkcs7_public_key: /etc/puppet/keys/public_key.pkcs7.pem

Die Datei secure wird nicht komplett verschlüsselt, sondern nur Werte, die als zu verschlüsseln gekennzeichnet werden.

  • eyaml edit /etc/puppet/hieradata/secure.eyaml
  • password mit Encryption Marker einschließen
  • password: DEC::PKCS7[strenggeheim]!

Beim verlassen von eyaml edit wird dann die Verschlüsselung der Werte vorgenommen.

Lennart Betz
Lennart Betz
Senior Consultant

Der diplomierte Mathematiker arbeitet bei NETWAYS im Bereich Consulting und bereichert seine Kunden mit seinem Wissen zu Icinga, Nagios und anderen Open Source Administrationstools. Im Büro erleuchtet Lennart seine Kollegen mit fundierten geschichtlichen Vorträgen die seinesgleichen suchen.