Ansible Inventar erstellen

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.

Leave a Reply

Your email address will not be published. Required fields are marked *