Neuerungen in Ansible ab Version 2.8
Ansible ist ein sehr beliebtes Open-Source-Tool zur Orchestrierung und Konfiguration von Systemen. Am 16. Mai 2019 wurde die neue Version 2.8 auf Github veröffentlicht. Die Nachfolgeversion 2.9 wurde am 31. Oktober 2019 herausgegeben. Einige der Neuerungen werden hier vorgestellt.
Neu ist eine experimentelle Unterstützung für Ansible Collections und Namespaces. Ansible-Rollen können in einen Namespace importiert werden und auf Ansible Galaxy veröffentlicht werden. Eine Rolle oder Collection kann dann mit namespace.[role | collection]_name genutzt werden. Dies ermöglicht einfacheres Teilen und Installieren von gebündelten Modulen, Rollen und Plugins.
Wenn nicht anders konfiguriert, nutzte Ansible bisher den Python Interpreter /usr/bin/python. Ab Version 2.8 bestimmt Ansible den Python Interpreter beim erstmaligen ausführen von Python Scripts anhand von Betriebssystemplattform, Distribution und Version. Dieses Verhalten kann aber durch die Variable ansible_python_interpreter beeinflusst werden.
Das Plugin become wird in Ansible genutzt, um erhöhte Rechte auf dem Zielsystem zu erlangen. In Version 2.8 wurden die veralteten CLI-Argumente --sudo, --sudo-user, --ask-sudo-pass, --su, --su-user und --ask-su-pass entfernt. Stattdessen wurden die generischen Optionen --become, --become-user, --become-method und --ask-become-pass eingeführt.
Mit Version 2.8 gibt es in Ansible eine experimentelle Unterstützung, um per SSH auf Windows Hosts zuzugreifen. Dies kann sehr hilfreich sein, da WinRM wesentlich umständlicher zu konfigurieren ist.
Mit der neuen Version wurden auch einige veraltete Module entfernt: azure, cs_nic, ec2_remote_facts, netscaler und win_msi. Diese Module wurden durch andere, neuere Module ersetzt.
Wichtige Änderungen gibt es auch bei Schleifen in Ansible 2.8:
Es gibt neue Variablen, die innerhalb der Schleife genutzt werden können. Dafür muss die neue Option extended gesetzt sein:
loop_control: extended: yes
Variable | Beschreibung |
ansible_loop.allitems | Liste mit allen Variablen der Schleife |
ansible_loop.index | Aktueller Index der Schleife bei 1 beginnend |
ansible_loop.index0 | Aktueller Index der Schleife bei 0 beginnend |
ansible_loop.revindex | Aktueller Index der Schleife von hinten bei 1 beginnend |
ansible_loop.revindex0 | Aktueller Index der Schleife von hinten bei 0 beginnend |
ansible_loop.first | True bei der ersten Iteration der Schleife |
ansible_loop.last | True bei der letzten Iteration der Schleife |
ansible_loop.length | Anzahl der Elemente der Schleife |
ansible_loop.previtem | Vorheriges Element der Schleife |
ansible_loop.nextitem | Nächstes Element der Schleife |
ansible_loop_var | Name der Schleifenvariable |
Zu beachten ist, dass ansible_loop.previtem und ansible_loop.nextitem in der ersten bzw. letzten Iteration nicht definiert sind. Daher darf in diesen Fällen nicht auf die Variable zugegriffen werden, sonst kommt es zu einem Fehler.
Beispiel:
- name: "Alle Items ausgeben: ansible_loop.allitems" debug: msg: "Aktuelles Element: {{ element }}, komplette Liste: {{ ansible_loop.allitems }}" loop: "{{ elementList }}" loop_control: extended: yes loop_var: element - name: "Aktuellen Index mit 1 beginnend ausgeben: ansible_loop.index" debug: msg: "Aktuelles Element: {{ element }}, Index: {{ ansible_loop.index }}" loop: "{{ elementList }}" loop_control: extended: yes loop_var: element
Dieses Beispiel erzeugt folgende Ausgabe:
TASK [Alle Items ausgeben: ansible_loop.allitems] *************************************************************************** ok: [localhost] => (item=element1) => { "msg": "Aktuelles Element: element1, komplette Liste: ['element1', 'element2', 'element3']" } ok: [localhost] => (item=element2) => { "msg": "Aktuelles Element: element2, komplette Liste: ['element1', 'element2', 'element3']" } ok: [localhost] => (item=element3) => { "msg": "Aktuelles Element: element3, komplette Liste: ['element1', 'element2', 'element3']" } TASK [Aktuellen Index mit 1 beginnend ausgeben: ansible_loop.index] *************************************************************************** ok: [localhost] => (item=element1) => { "msg": "Aktuelles Element: element1, Index: 1" } ok: [localhost] => (item=element2) => { "msg": "Aktuelles Element: element2, Index: 2" } ok: [localhost] => (item=element3) => { "msg": "Aktuelles Element: element3, Index: 3" }
Auch in der Version 2.9 gibt es einige neue Module, vor allem aus dem Bereich des Cloud Computing für AWS und Azure. Zusätzlich wurden einige Module umbenannt: Alle _facts-Module wurden in _info umbenannt. Zum Beispiel heißt das Modul vmware_vm_facts jetzt vmware_vm_info. Diese Umbenennungen wurden gemacht, um den Namenskonventionen mehr zu entsprechen.
Damit ist die Entwicklung von Ansible natürlich noch nicht abgeschlossen: Ansible 2.10.0 steht bereits in den Startlöchern und soll am 22. September 2020 veröffentlicht werden. Auch an Ansible 2.11 wird schon gearbeitet.
Seminarempfehlung
Sie haben Interesse an einer Weiterbildung oder Fragen zum Thema Ansible? Sprechen Sie uns an oder besuchen Sie einen unserer Kurse aus unserem Seminarshop:
Zu unseren Rechenzentrum Seminaren
Consultant bei ORDIX.
Bei Updates im Blog, informieren wir per E-Mail.
Kommentare