Optimieren von Ansible Playbooks mit ansible-lint

Datum

Lint (englisch für „Fussel“) ist eine Software zur statischen Code-Analyse. Davon abgeleitet hat sich das Verb linten (englisch to lint) für das Durchführen der statischen Code-Analyse etabliert.

Quelle: de.wikipedia.org

Grundlagen

Das Tool ansible-lint prüft ein (oder mehrere) Ansible Playbooks auf die Einhaltung bestimmter Regeln.
Die entsprechenden Regeln findet man hier: Default Rules

Beispielsweise wird geprüft ob die richtige Dateiendung verwendet wird, unnötige Leerzeichen vorhanden sind oder auch ob jeder Task einen entsprechenden Namen hat.
Somit kann ein einheitlicher Stand bei den Playbooks erreicht werden.

Installation

Github: ansible-lint
pypi.org Projektseite: pypi.org

ansible-lint lässt sich per pip-Paket installieren:
pip install ansible-lint

oder auch direkt vom Quellcode:

$ pip install git+https://github.com/ansible/ansible-lint.git
Collecting git+https://github.com/ansible/ansible-lint.git
  Cloning https://github.com/ansible/ansible-lint.git to /tmp/pip-dw6cAL-build
Requirement already satisfied: ansible in /usr/local/lib/python2.7/dist-packages (from ansible-lint==4.1.0a1.dev9+ge44d2aa)                                                                                       
Requirement already satisfied: pyyaml in /usr/local/lib/python2.7/dist-packages (from ansible-lint==4.1.0a1.dev9+ge44d2aa) 
...                                                           
Requirement already satisfied: cffi>=1.4.1 in /usr/local/lib/python2.7/dist-packages (from pynacl>=1.0.1->paramiko->ansible->ansible-lint==4.1.0a1.dev9+ge44d2aa)                                                 
Requirement already satisfied: pycparser in /usr/local/lib/python2.7/dist-packages (from cffi>=1.4.1->pynacl>=1.0.1->paramiko->ansible->ansible-lint==4.1.0a1.dev9+ge44d2aa)                                      
Installing collected packages: ansible-lint
  Found existing installation: ansible-lint 4.1.0
    Uninstalling ansible-lint-4.1.0:
      Successfully uninstalled ansible-lint-4.1.0
  Running setup.py install for ansible-lint ... done
Successfully installed ansible-lint-4.1.0a1.dev9+ge44d2aa

Anschließend sollte ansible-lint aufzurufen sein:

$ ansible-lint --version
ansible-lint 4.1.0a1.dev9+ge44d2aa

Verwenden von ansible-lint

ansible-lint wird mit dem zu prüfenden Playbook(s) aufgerufen:
ansible-lint test.yml
Es können auch mehrere Playbooks angegeben werden.

Nun prüft ansible-lint das Playbook auf die Einhaltung der oben erwähnten Regeln und zeigt entsprechende Probleme anschließend an:

$ ansible-lint test.yml
...
ANSIBLE0010 Package installs should not use latest
test.yml:22
Task/Handler: mysql : install dependencies

ANSIBLE0016 Tasks that run when changed should likely be handlers
test.yml:59
Task/Handler: DB-Dump erzeugt

ANSIBLE0002 Trailing whitespace
test.yml:84
    find: 

Die angezeigten Unstimmigkeiten können anschließend korrigiert werden.

Regeln ausschließen

Möchte man, dass bestimmte Regeln bei der Prüfung mit ansible-lint ausgeschloßen sind, so kann man diese per -x <REGEL> angeben.

Bsp.: ansible-lint -x ANSIBLE0011 playbook.yml

Man kann auch direkt im Playbook bestimmte Abschnitte entsprechend markieren, damit diese nicht von ansible-lint geprüft werden.
Dies ist z.B. sinnvoll wenn es sich um False Positives handelt.

Die entsprechende Markierung ist hierbei: # noqa <Regel>
Bsp.: # noqa 501 201

Dies sieht dann im Playbook beispielsweise so aus:

- name: this would typically fire GitHasVersionRule 401 and BecomeUserWithoutBecomeRule 501
  become_user: alice  # noqa 401 501
  git: src=/path/to/git/repo dest=checkout

Man kann auch eigene Regel definieren, entsprechende Infos dazu findet man in der Dokumentation

weitere Infos

weiterführende Informationen findet man in der Ansible Lint Documentation

Autor
Kategorien Ansible, Automatisierung

PRTG Map