Das Inventar, flexibler geht kaum.
Hier mal ein einfaches Beispiel, wie eine Inventardatei in YAML aussieht.
all:
hosts:
localhost:
ansible_connection: local
server01:
ansible_connection: ssh
ansible_host: 172.16.0.148
ansible_user: root
ansible_password: aPassword
server02:
ansible_connection: ssh
ansible_host: 172.16.0.149
ansible_user: root
ansible_password: aPassword
server03:
ansible_connection: ssh
ansible_host: 172.16.0.146
ansible_user: root
ansible_password: aPassword
server04:
ansible_connection: ssh
ansible_host: 172.16.0.145
ansible_user: root
ansible_password: aPassword
Hier definiert sind 5 Hosts, einmal localhost selber und 4 VMs, welche via ssh gesteuert werden. Im File ignorieren wir mal, dass das Passwort im Klartext definiert ist. Dazu kommen wir dann später, wie wir das wegkriegen auf eine sichere Variante. Was man auch sieht, wir haben bei den Clients 4x den gleichen Usernamen und 4x das gleiche Passwort. Es wäre doch schon mal super, wenn man das ein wenig vereinfachen könnte, sollte man mal das Passwort ändern sollte.
all:
vars:
ansible_connection: ssh
ansible_user: root
ansible_password: aPassword
hosts:
localhost:
ansible_connection: local
server01:
ansible_host: 172.16.0.148
server02:
ansible_host: 172.16.0.149
server03:
ansible_host: 172.16.0.146
server04:
ansible_host: 172.16.0.145
Nun sind die ganzen Host eher ‘unsortiert’ unterwegs, sprich wir müssten Befehle mehrmalig aufrufen, um z.B. alle Server in einem Playbook anzusprechen. Das lässt sich nun einfach eine Struktur einbringen.
all:
hosts:
localhost:
ansible_connection: local
children:
dev:
hosts:
server01:
ansible_host: 172.16.0.148
server02:
ansible_host: 172.16.0.149
prod:
hosts:
server03:
ansible_host: 172.16.0.146
server04:
ansible_host: 172.16.0.145
server:
vars:
ansible_connection: ssh
ansible_user: root
ansible_password: aPassword
children:
dev:
prod:
test:
hosts:
server01:
server03:
Hier sind die Hosts nach dev und prod repräsentiert und werden in der Gruppe Server dann zusammengefasst. Hier kann man nun auch eine Variable definieren, die nur auf die entsprechende Gruppe greift, nicht wie vorhin x-mal definieren, sondern da, wo diese gebraucht werden.
Das gleiche Ziel kann man aber auch im INI Format erreichen.
localhost ansible_connection=local
[dev]
server01 ansible_host=172.16.0.148
server02 ansible_host=172.16.0.149
[prod]
server03 ansible_host=172.16.0.146
server04 ansible_host=172.16.0.145
[server:vars]
ansible_connection=ssh
ansible_user=root
ansible_password=aPassword
[server:children]
dev
prod
[test]
server01
server02
Für welche Variante man sich entscheidet, das ist jedem selber überlassen. Hier ist Ansible sehr pflegeleicht. Die Beispieldatei hosts in der Installation ist im INI Format. Ansible selber schreibt die Plays jedoch im YAML. Was man aber doch ein wenig Anmerken muss ist, dass das Inventar in INI lesbarer dargestellt ist, da hier nicht die präzise Verschachtelung eingehalten werden muss. Wird das Inventar aber automatisch generiert, dann ist das YAML wiederum sehr gut geeignet, da sich dies an eine klare Struktur hält.
Was am Inventar auch noch super ist, dass ein Host in mehreren Gruppen sein kann, was bedeuted, mann kann x-beliebige Gruppierungen machen. Dabei ist noch sehr elegant, solange man irgendwo irgendwie die Verbindungsdaten definiert hat, greifen die überall, wo diese benötigt werden. Bei YAML muss man jedoch aufpassen, dass man nicht vergisst, den Hostname immer mit einem : anzugeben. Macht man dies nicht, werden die Server mehrmalig angezeigt. was man nicht möchte.
Um nun mit dem Inventar ein wenig herzumzspielen und seine Gruppierungen zu testen, bedient man sich folgendem Befehl:
ansible GRUPPE -i inventarfile --list-hosts
ansible all -i hosts --list-hosts
ansible test -i inventory.yml --list-hosts
Als Beispiel habe ich mir die hosts im INI Format erstellt und inventory.yml im YAML. Die Ergebnisse sehen beide genau gleich aus.
Ob man nun im obersten Bereich alle Hosts definiert, oder erst in den Subgruppen, das hängt nu ein wenig von der Logik hinter allem zusammen. Es lohnt sich, alle Objekte, die im Inventar abgebildet werden sollen, aufzulisten und die Parameter, welche man benötigt, zu notieren und diesen dann logisch miteinander zu Verknüpfen. Anschliessend bildet man dann das Inventar.