Tag 18/2016: Python-Repräsentation einer YAML-Datei ausgeben

Zur Zeit kodifiziere ich das Setup einiger alter Server in Ansible-Skripte. Dank Virtualisierung und Cloud ist es mittlerweile einfach, Migrationen auf neue Betriebssysteme und Versionsstände im Vorfeld durchzuspielen. Die neuen Setups profitieren auch vom Know-how aus zahlreichen anderen Ansible-Scripten, z.B. auf Github, weil man immer wieder auf nützliche Vorgehensweisen und Module stößt.

Bei den Core-Modulen copy, file, lineinfile und template setze ich nach Möglichkeit immer explizit group, owner und mode so restriktiv wie möglich – der SuSE-Paranoid-Mode bei den Dateirechten fehlt mir bei Debian/Ubuntu einfach 🙂 Ansonsten Tags setzen mindestens für Packages und Services. Und vor dem Schreiben eigener Rollen lohnt es sich immer, nach bereits erprobten und universellen Rollen Ausschau zu halten.

Zwar ist die Struktur eines YAML-Dokuments leicht zu verstehen, aber trotzdem ist manchmal ein schneller Blick auf die Python-Repräsentation hilfreich. Das kann man beispielsweise mit ein paar Zeilen Python selbst erledigen.

#!/usr/bin/env python
"""
Pretty-print a YAML document.
"""

import sys
import os
from pprint import pprint
from yaml import safe_load

if len(sys.argv) < 2:
  sys.exit('Usage: %s yaml-file' % sys.argv[0])

if not os.path.exists(sys.argv[1]):
  sys.exit('yaml-file %s not found!' % sys.argv[1])

stream = file(sys.argv[1], 'r')
pprint(safe_load(stream))

Die letzte Zeile enthält die eigentlichen Anweisungen – safe_load aus dem PyYAML-Package und pprint aus der Standard-Bibliothek.

So kann man sich beispielsweise die Datenstruktur aus dem Task-File zur Munin-Rolle ausgeben lassen:

[{'include_vars': '{{ ansible_os_family }}.yml',
 'name': 'Include OS-specific variables.'},
 {'name': 'Ensure munin-node is installed (RedHat).',
 'when': "ansible_os_family == 'RedHat'",
 'yum': 'pkg=munin-node state=installed enablerepo=epel'},
 {'apt': 'pkg=munin-node state=installed',
 'name': 'Ensure munin-node is installed (Debian).',
 'when': "ansible_os_family == 'Debian'"},
 {'name': 'Copy munin-node configuration.',
 'notify': 'restart munin-node',
 'template': 'src=munin-node.conf.j2 dest=/etc/munin/munin-node.conf owner=root group=root mode=644\n'},
 {'name': 'Generate plugin configuration.',
 'notify': 'restart munin-node',
 'template': 'src=plugin-conf.j2 dest=/etc/munin/plugin-conf.d/ansible.conf owner=root group=root mode=644\n'},
 {'file': 'path={{ munin_plugin_dest_path }}{{ item.name }} src={{ munin_plugin_src_path }}{{ item.plugin | default( item.name ) }} state=link\n',
 'name': 'Enable additional plugins.',
 'notify': 'restart munin-node',
 'with_items': 'munin_node_plugins'},
 {'name': 'Ensure munin-node is running.',
 'service': 'name=munin-node state=started enabled=yes'}]

Da fühlt man sich doch gleich wieder wie zu Hause.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.