Ansible benötigt Python 2.x. Bei neueren OS wie Ubuntu 16.04 ist aber Python 3.x per Default installiert.
Sagt Ubuntu:
Python2 is not installed anymore by default on the server, cloud and the touch images, long live Python3! Python3 itself has been upgraded to the 3.5 series.
Die Lösung liegt darin, vor dem eigentlichen Lauf des Playbooks ein adhoc-Kommando abzusetzen, das die benötigten Pakete für den Ansible-Lauf installiert:
ansible myhost --sudo -m raw -a "apt-get install python2.7 python-simplejson"
Hat man ein größeres Inventar (z.B. in Datei „my_inventory“), kann man diese Aktion natürlich auch für alle Server einer Gruppe machen, nennen wir diese z.B. „cluster“:
ansible -i my_inventory cluster -m raw -a "apt-get install python2.7 python-simplejson"
Die Core-Module von Ansible sollten damit dann laufen. Die eigenen Rollen bzw. Tasks müssen aber ggf. noch an das neue Betriebssystem-Release angepasst werden, d.h. mit ein paar „when“-Konditionen kann man die notwendigen Abweichungen konfigurieren:
- name: Do something specific on 16.04 machine ... Modul/Kommando ... when: (ansible_distribution == 'Ubuntu' and ansible_distribution_release == 'xenial')
Das Distribution-Release lässt sich auf der Konsole mit „lsb_release -a“ herausfinden (Ubuntu 16.04 „Xenial Xerus“, englisch für gastfreundliches Borstenhörnchen). ansible_distribution und ansible_distribution_release sind Variablen, die Ansible je Host zu Beginn im SETUP-Task setzt.
Oder gleich mehrere Tasks in einer Datei ausgelagert, indem die Abfrage mit dem include-Statement kombiniert wird:
- include: setup-Ubuntu1604.yml when: (ansible_distribution == 'Ubuntu' and ansible_distribution_release == 'xenial')
Finde ich stabiler, als den Namen der Include-Datei gleich aus den Variablen interpolieren zu lassen.