Nachdem ein Kollege bei einem Saltstack Vortrag gewesen ist, meinte er, dass der Vortragende unser Rollenprinzip nicht so recht nachvollziehen konnte und es gleich abgetan hat. Da ich aber recht überzeugt davon bin und vor allem da wir es aktiv nutzen, möchte ich es kurz vorstellen.
Grundsätzlich ist SaltStack eine Infrastruktur-Verwaltung mit der man ganze Serverfarmen verwalten kann. Mit Salt ist es möglich eine virtuelle Maschine zu klonen, diese mit Software und Konfigurationsdateien zu bestücken und sofort in Betrieb zu nehmen. Der große Vorteil dabei ist, dass man mehrere Server mit bestimmten Paketen (Rollen) ausstatten kann, die dann an einer zentralen Stelle gepflegt werden. So dass man dann nicht überlegen muss, welcher Versionsstand hat eine Software auf dem Server oder habe ich bestimmte Einstellungen in der php.ini vorgenommen.
Laut der Dokumentation von Salt soll auf dem Client die Rolle festgelegt werden, die dieser gern haben möchte. Dies entspricht aber so gar nicht der Philosophie von „alles von einem Server managen“. Deshalb haben wir uns einfach überlegt, dass man die Rollen doch gleich in den Pillar-Daten der jeweiligen Maschinen festlegen kann. Dann werden diese direkt beim deployen ausgelesen und automatisch angewandt.
In der top.sls wird die eigentliche SLS für alle Maschinen verknüpft:
'*': - roles
In dem Pillar top.sls (oder einem Unterordner) wird dann der Host und dessen Rollen festgelegt:
hosts: webserver1: roles: - sslLogin - webserver - php56
In der roles/init.sls wird dann geschaut, welche Rollen eine Maschine hat, diese werden dann in die Grains-Liste übernommen und dann dementsprechend angewendet:
# ermittle roles aus host-spezifischem pillar # und trage diese in die grains.roles Liste {% if grains['id'] in pillar['hosts'] %} grains_roles: grains.list_present: - name: roles - value: {% for role in pillar['hosts'][grains['id']]['roles'] %} - {{ role }} {% endfor %} {% endif %} # wende roles an # 'roles' kann bei nicht vorhandenen Rollen auch 'None' sein {% if 'roles' in grains and grains['roles'] != None %} include: {% for role in grains['roles'] %} - roles.{{ role }} {% endfor %} {% endif %}
Durch diesen einfachen Trick ist es möglich Rollen per Pillar anzulegen bzw. sogar hinzuzufügen. Einzig das entfernen muss per CLI gemacht werden:
salt webserver1 grains.set roles '[sslLogin, webserver]' force=True
Damit werden die Rollen in der Grains-Liste geändert. Sinnvoller weise sollte man diese Änderung in der Pillar Datei anpassen, damit beim einem Neuaufsetzen des Servers die Rollen wie gewünscht appliziert werden.