Das Problem
Ansible Inventorys sind eine tolle Sache. Man hat die Möglichkeit externe Datenbanken als Quelle zu nutzen, aber dazu etwas später. Gerade wenn man anfängt mit Ansible zu arbeiten ist es häufig nicht das erste Ziel die zentrale CMDB oder ähnliches anzubinden.
Jedoch existieren häufig innerhalb einer Gruppe von Servern bestimmte Namenskonventionen, die man dafür nutzen kann zusätzliche Attribute zu erzeugen.
Die Lösung
In meinem Fall möchte ich gerne mittels Ansible die vorhandenen ESX Server im Fibre-Channel Netzwerk zonen. Die Server werden abhängig von ihrem Standort gezoned, sprich abhängig vom RZ.
Das Inventory vom Ansible sieht wie folgt aus:
[esxserver]
esx01.example.org
esx02.example.org
esx03.example.org
Glücklicherweise haben wir eine einfache Namenskonvention um direkt zu erkennen wo ein ESX Server verbaut ist. Ist die Nummer ungerade, ist es RZ1 - ist sie ungerade RZ2 (wie bei Hausnummern)
Um nun anhand des Hostnames eine Variable festzulegen muss ein bisschen Jinja2 Magie innerhalb Ansible verwendet werden:
- name: Set RZ Location based on Hostname
set_fact:
rz: "{{ 'rz2' if inventory_hostname_short[-2:] | int is divisibleby 2 else 'rz1' }}"
In diesem Beispiel wird nicht der FQDN, sondern die spezielle Variable invetory_hostname_short
genutzt. Somit wird aus esx01.example.org
- esx01
.
Im zweiten Schritt wird mittels Substring die Nummer des ESX Server aus dem Hostname extrahiert.
Als letztes wird mittels Jinja2 Conditionals und Filter geprüft, ob die Nummer gerade durch zwei geteilt werden kann. Abhängig vom Ergebnis, ob true
oder false
wird die Variable auf RZ1
oder RZ2
gesetzt.
Das Prinzip kann für etliche Bedindungen verwendet werden, zum Beispiel könnte abhängig vom Hostname eine Applikationsvariable gesetzt werden oder welcher Umgebung (Prod, Test, Dev) der Server angehört.
Header Credit: CC-BY-SA Erik Wilde