Neuerungen in Ansible ab Version 2.8

black-and-white-roller-coaster-106155

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.indexAktueller Index der Schleife bei 1 beginnend
ansible_loop.index0Aktueller Index der Schleife bei 0 beginnend
ansible_loop.revindexAktueller Index der Schleife von hinten bei 1 beginnend
ansible_loop.revindex0Aktueller Index der Schleife von hinten bei 0 beginnend
ansible_loop.firstTrue bei der ersten Iteration der Schleife
ansible_loop.lastTrue bei der letzten Iteration der Schleife
ansible_loop.lengthAnzahl der Elemente der Schleife
ansible_loop.previtemVorheriges Element der Schleife
ansible_loop.nextitemNächstes Element der Schleife
ansible_loop_varName 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.

By accepting you will be accessing a service provided by a third-party external to https://blog.ordix.de/