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.

Weekly Snap: NOSE for Python, Syntastic for Puppet & InGraph 1.0.1 for Icinga / Nagios

12 – 16 November offered tools and best practice advice for Python testing, Puppet coding, and of course monitoring with a new inGraph version to boot.
Eric began the week with by releasing InGraph 1.0.1 – our addon for Nagios and Icinga for performance charts, fixing a couple of bugs and adding Icinga Web 1.8 support.
Achim then introduced a vim plugin called Syntastic to check the syntax of Puppet and Puppet-lint code to see if it is inline with the official style guide.
Finally, Johannes recommended the NOSE testing framework for Python unit tests and Dirk considered the pros and cons of agent-based and agent-less monitoring methods.

vim, puppet-lint und syntastic

Der letzte Blogpost von mir zeigte wie schnell und einfach man mit pathogen, tabular und vim-puppet die Konfigurationsdateien einheitlich formatieren kann. Von dem Puppet Style Guide ist das Ganze leider noch weit entfernt. Es wird eigentlich ja nur korrekt eingerückt und Syntaxhighlighting macht alles bunter. Mit Hilfe von syntastic, puppet und puppet-lint kann auch noch die Syntax überprüft werden (gemäß des Puppet Style Guides) und es kommt sofort Feedback wenn z.B. eine Variable in einfachen Hochkommas steht (z.B. bla => ‘$blubb’).
syntastic ist ein Vim-Plugin zum überprüfen der Syntax verschiedenster Programmiersprachen (und Ähnliches). Im Fall von Puppet-Konfigurationsdateien greift es auf puppet-lint und puppet zurück, parsed die Ausgabe und zeigt uns durch kleine Spitze Klammern und Fehlermeldungen an was genau in unserem Code noch schief läuft. Jeder kennt das ganze aus halbwegs modernen IDEs wie Eclipse und Co.
Dank pathogen ist die Installation von syntastic mit Hilfe eines einfach git clone erledigt:

$ cd ~/.vim/bundle
$ git clone git://github.com/scrooloose/syntastic.git

Puppet und puppet-lint kann man über den Paketmanager installieren.

# apt-get install puppet puppet-lint

Wer eine aktuellere Version von puppet-lint bevorzugt kann dies auch über rubygems installieren:

$ gem install puppet-lint

Ob nun wirklich alles installiert ist und ob das ganze auch wirklich gut ist kann man ganz leicht mit einem kleinem Beispiel testen:

$ vim test.pp
   class test {
     file { '/tmp/test':
       ensure => present,
         owner  => 'root',
       group => 'root',
       mode   => "0440"
       source => 'puppet:///test/etc/test',
       force  => true,
     }
   }

Speichert man nun die Datei ab (:w), wird im Hintergrund puppet-lint gestartet und syntastic zeigt uns die Fehler. In der Statuszeile werden immer die Fehler der aktuellen Zeile angezeigt. Links am Rand werden Warnungen gelb und Errors mit rot dargestellt, aber seht selbst.
Die meisten von euch denken sich vermutlich: “Für was soll das ganze gut sein? Fehler? Mach ich doch keine!”
sytastic with vim

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.