Ich verwende Ansible, um einige Web- und Datenbankserver zu verwalten, auf denen Websites für mehrere vhosts ausgeführt werden. Für jede Website muss ich der dbservers-Gruppe eine Datenbankrolle und der webservers-Gruppe eine Website-Rolle zuweisen. Mein Spielbuch sieht also ungefähr so aus:
- hosts: dbservers
roles:
- { role: database, vhost: 'host1.com', db: 'customdb' }
- { role: database, vhost: 'other.com' }
- hosts: webservers
roles:
- { role: website, vhost: 'host1.com', db: 'customdb' }
- { role: website, vhost: 'other.com' }
Das funktioniert gut, ist aber hässlich, da ich alles zweimal wiederholen muss. Dies ist besonders fehleranfällig, wenn einige Parameter von den Standardwerten geändert werden (wie z. B. db auf vhost host1.com in diesem Beispiel).
Gibt es eine Möglichkeit, dies zu schreiben, damit ich eine einzelne Liste von vhosts mit allen erforderlichen Parametern haben und die verschiedenen Rollen für jeden vhost-Eintrag automatisch zu den verschiedenen Hostgruppen hinzufügen kann?
with_items
vielleicht verwenden?Antworten:
Die naheliegendste Antwort: Verwenden Sie komplexe Variablen (Wörterbücher), um Ihre Werte zu speichern, und übergeben Sie dann die gesamte Variable:
Verwenden Sie diese dann, um auf Rollen überzugehen:
Ich habe das in der Vergangenheit erfolgreich gemacht. Zum Auffüllen von Layouts können Sie verschiedene Techniken verwenden: Kombinieren von "group_vars / all" mit "vars_files" mit "host_vars" usw.
quelle
Ich erstelle Rollen
apache
, die Apache installieren und einige Konfigurationen für alle vhosts durchführenapache-vhost
, die einen vhost installierenhost1-com
, undother-com
. Dann wäre das Spielbuch so:Nun
host1-com
wird dies haben:(Dies ist ein Implementierungsdetail, aber die
apache-vhost
Rolle bereitet einige wichtige vhost-Konfigurationen basierend auf den an sie übergebenen Variablen vor und fügt dieextras
Variable auch so hinzu , wie sie sich in der vhost-Konfiguration befindet.)Ebenso können Sie für die Datenbanken eine
postgresql
Rolle, einepostgresql-database
Rolle usw. haben.quelle
Anstatt Ihre Hosts nach Funktionen zu gruppieren, können Sie sie nach Rollen gruppieren und Ansible nur dann eine bestimmte Rolle auf einem Host ausführen lassen, wenn dieser Host in der für diese Rolle festgelegten Gruppe gefunden wird.
Sie können sogar Parameter an eine Rolle übergeben, wie anhand des
db
Parameters im folgenden Playbook dargestellt.quelle