FaiTemplates
Abstract: i've coded a proof of concept on how to use Template-Toolkit, YAML and Hash::Merge. The code in the attachment should demonstrate what i mean. Download it and type
aptitude install libclone-perl libyaml-perl libtemplate-perl tar xzf FaiTS-0.01.tar.gz cd FaiTS-0.01/ perl Makefile.PL make test
If you get lots of errors and a final "All tests successful" then the code should work ...
To see something happen, you can set CLEANUP to 0 in line 27 of the file t/FaiTS.t and then run
make test
again
If you then type
find -ls
and you'll see the .yml' (YAML) files with config data, .tt ( Template-Toolkit) templates and a target directory with a freshly created etc/network/interfaces file.
Long Version in German, sorry ...
Ich hab diese Woche mal ein wenig gebastelt und drei Ideen in ein kleines Programm eingebaut. Ist im Moment noch mehr ein proof-of-concept, aber ich bin von meiner Idee völlig begeistert ;-)
1. Template-Toolkit:
========================================================
Templates zu schreiben geht einfacher als Configdateien mit perl & co nachzubearbeiten. Beispiel /etc/network/interfaces:
# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8) # The loopback interface auto lo iface lo inet loopback [% FOREACH name = interfaces.keys.sort %] [% i = interfaces.$name -%] auto [% name %] iface [% name %] inet static address [% i.address %] netmask [% i.netmask %] [% IF i.network %] network [% i.network %] [% END %] [% IF i.broadcast %] broadcast [% i.broadcast %] [% END %] [% IF i.gateway %] gateway [% i.gateway %] [% END %] [% END %]
2. YAML:
========================================================
Über Shell-Variablen kann man nur flache Datenstrukturen transportieren. Das engt manchmal etwas ein. Z.B. wenn ich die Daten für eine /etc/network/interfaces eines Routers in /class/KLASSE.var unterbringen möchte, muß ich ganz schön Klimmzüge machen. Wahrscheinlich löst man es besser, in dem man dann doch für jeden Router eine eigene Datei /files/etc/network/interfaces/* schreibt.
Mit YAML gibt es ein Dateiformat, für das es in jeder gängigen Skriptsprache einen Parser gibt. Die Informationen für die interfaces Datei könnten dann so aussehen:
interfaces: eth0: address: 172.16.240.5 netmask: 255.255.255.0 network: 172.16.240.0 broadcast: 172.16.240.255 eth1: address: 192.168.1.5 netmask: 255.255.255.0 network: 192.168.1.0 broadcast: 192.168.1.255 eth2: address: 192.168.1.5 netmask: 255.255.255.0 network: 192.168.1.0 broadcast: 192.168.1.255 gateway: 212.202.236.177
3. Config-Daten klassenbasiert zusammenführen
==================================
Bei den Variablen in class/*.var ist es einfach sie klassenbasiert zusammenzuführen. Später definierte Klassen überschreiben Variablen von früher definierten Klassen.
Ich dachte erst, bei tiefer strukturierten Daten sei das kompliziert. Isses wahrscheinlich auch, aber das Perl Modul Hash::Merge hat mir die Arbeit abgenommen.