SaltStack: Verteilte Konfiguration am Beispiel von munin
In den vorangegangenen Artikeln wurden ja bereits einige Beispiele für Konfigurationen mit Hilfe von Salt gegeben, (mind.) ein Beispiel fehlt aber noch. Gerade bei Tools zur Serverüberwachung, wie zum Beispiel Icinga oder Munin, müssen Konfigurationsdateien auf verschiedenen Rechnern gepflegt werden. Der Client (also der zu überwachende Rechner) muss z.B. wissen welche Daten er erheben soll und an wen er sie weitergeben darf. Der Monitorrechner muss wissen bei welchen Rechnern er Daten abholen soll.
Bei Salt ergibt sich hier ein Problem. Die Konfiguration gilt immer nur für den jeweiligen Minion. Der Minion der als Monitor dient weiß nichts von den anderen Rechnern und der zu überwachende Rechner weiß nichts über den Monitorrechner.
Abhilfe schafft hier salt-mine
. Mit Saltmine ist es möglich den Minions untereinander Informationen über andere Minions zukommen zu lassen. Hierzu muss Saltmine in der Konfiguration der Minions aktiviert werden:
/etc/salt/minion:
mine_functions:
test.ping: []
grains.items: []
Nach einem Neustart des Salt-Minion-Dienstes stehen allen anderen Minions die Rückgabewerte von test.ping
und grains.items
zur Verfügung. Nun können wir uns daran machen die munin.conf
des Monitorrechners zu schreiben, hierzu erstellen wir folgenden State:
/srv/salt/munin/init.sls:
munin:
pkg:
– installed
/etc/munin/munin.conf:
file:
– managed
– source: salt://munin/munin.conf
– template: jinja
– user: root
– group: root
– mode: 644
– require:
– pkg: munin
Bisher noch kein Voodoo zu erkennen. Die eigentliche Arbeit wird in /srv/salt/munin/munin.conf
erledigt:
…
{% for hostinfo in salt[‘mine.get’](‘*’, ‘grains.items’).items() -%}
{% if hostinfo[‘ip_interfaces’][‘eth0’] -%}
[{{ hostinfo[‘fqdn’] }}]
address {{ hostinfo[‘ip_interfaces’][‘eth0’][0] }}
use_node_name yes
{% endif %}
{%- endfor %}
Über salt[‘mine.get’](‘*’, ‘grains.items’)
werden die Grain-Daten aller erreichbaren Minions abgefragt. Mit der if
-Abfrage wird dann geprüft ob das Grain für die IP des Netzwerkinterfaces eth0
einen Wert enthält. Falls ja wird noch der FQDN des Minions ausgelesen und in die Munin-Konfiguration aufgenommen. Das -
bei -%}
in der if
-Abfrage bzw. im endif
sorgt dafür dass Jinja keine unnötigen Leerzeilen erzeugt.
Resultat ist eine wunderschöne munin.conf
.
Nachteil dieses Verfahrens: Ist ein Minion aus irgendeinen Grund nicht erreichbar während der State angewendet wird, wird er aus der Munin-Überwachung entfernt. Daher sollte der Output immer genau kontrolliert werden.