10 Dinge über Ansible, die du (vielleicht) noch nicht kanntest

Auch nach jahrelanger, intensiver Auseinandersetzung mit Ansible, gibt es immer wieder Neues zu entdecken. Im Folgenden liste ich 10 Dinge über Ansible auf, die Du vielleicht noch nicht gewusst hast…

1 – „import“ ist nicht „include“

Du hast vielleicht schon mal „include_tasks“ oder „include_roles“ verwendet, wenn du ein Playbook oder eine Rolle geschrieben hast. Dabei entdecktest du vielleicht auch, dass es „import_tasks“ und „import_roles“ gibt? Aus der Ansible Dokumentation wissen wir:

- All import* statements are pre-processed at the time playbooks are parsed.
- All include* statements are processed as they are encountered during the execution of the playbook.

Was heisst das konkret? Wo liegen die Stolpersteine?

Wenn ich einen Task mit „import_tasks“ habe, diesen tagge und ausführe (mit `-t ansible_user`), werden alle Tasks im entsprechenden File (hier ansible_user.yml) ausgeführt, ungeachtet ob diese Tasks im File getagged sind.

- name: Import ansible_user task<
  import_tasks: ansible_user.yml
  tags: ansible_user

Habe ich aber einen Task mit einem „include_tasks“ Statement und der ist getagged, dann geschieht beim Ausführen mit dem Tag-Label ausser dem include_task gar nichts. Das heisst, die Tasks darunter werden nur ausgeführt, wenn diese auch getagged sind…

- name: Import ansible_user task
  include_tasks: ansible_user.yml
  tags: ansible_user

Damit die Tasks trotz dem Einbinden mit `include_tasks` alle ausgeführt werden, müssen Konstrukte mit „apply“ gebraucht werden:

- name: Import ansible_user task
  include_tasks:
    file: ansible_user.yml
    apply:
      tags:
        - ansible_user

2 – Output-Format

Es ist wohl nicht jeder User mit JSON also Output-Format von Ansible glücklich. JSON ist eher schwer zu lesen und eventuell möchte man gar komplett andere Informationen erhalten nach einem Ansible-Run? In der Ansible Konfiguration (Default /etc/ansible/ansible.cfg) lässt sich mit der Option `callback_plugin` ändern, wie Ansible seinen Output formatiert. Mit `callback_plugin = yaml` lässt sich der Output beispielsweise als YAML anzeigen und mit `callback_plugin = timer` werden ausschliesslich Informationen zur Dauer des Runs aufgeführt. `ansible-doc -t callback -l` gibt eine Liste mit den verfügbaren Callback Plugins zurück. Sollen auch Ansible Ad Hoc Commands den Output entsprechend zurückgeben, muss zusätzlich die Option `bin_ansible_callbacks = True` gesetzt werden.

Inhalt von ansible.cfg:

callback_plugin = yaml
bin_ansible_callbacks = True

3 – rhel-system-roles

In den RPM-Repositories von Red Hat sind Pakete zu finden die Ansible-Rollen bereitstellen, um gewisse Services zu konfigurieren. Mit dem Paket „rhel-system-roles“ werden Rollen zur Verfügung gestellt, um beispielsweise NTP zu konfigurieren. Oder mit „ansible-freeipa“ (RHEL 8) erhält man Rollen, um FreeIPA zu konfigurieren. Wie das genau geht, kann hier nachgelesen werden.

4 – Templates vererben

Mit Jinja2 können Templates vererbt werden. In einem Base-Template können allgemeingültige Elemente definiert werden. In sogenannten „Blocks“ können Teile von Child-Templates überschrieben werden. Anhand eines Beispiels wird der kompliziert klingende Sachverhalt klar:

Base-Template „base.txt.j2“:

Name: {{ superhero_name }}
Occupation: {{ superhero_occupation }}
Vehicle: {{ superhero_vehicle }}
{% block superpower %}Base Powers{% endblock %}

Child-Template „child.txt.j2“:

{% extends "base.txt.j2"%}
{% block superpower%} Child's Superpower!{% endblock %}

René Moser zeigt in einem Blogpost, wie damit elegant Bind Zone-Files verwaltet werden können. Mehr über Template-Vererbung gibt es hier zu lesen. Und ja – das hat eigentlich nichts mit Ansible zu tun, sondern mit Jinja2 🙂

5 – Doc is your friend!

Wahrscheinlich kennt jeder User die hervorragende Dokumentation unter docs.ansible.com. Ist dir aber aufgefallen, dass es neben dem Suchfenster oben links auch einen Möglichkeit zum Suchen unten rechts gibt? Versuche doch mal beide Möglichkeiten und lass dich überraschen wie praktisch vor allem die Suche unten rechts ist…

Mit dem Cmdline-Tool `ansible-doc` lässt sich bequem auf der Kommandozeile nach Dokumentation suchen. Wusstest du, dass du mit `ansible-doc -s <modulename>` eine Übersicht über die verfügbaren Argumente des entsprechenden Moduls erhältst? Zudem erhältst du mit `ansible-doc -t <plugintype>` Infos zu anderen Plugintypes.

6 – Ansible on Windows mit SSH

Hast du gewusst, dass mit den neuen Versionen von Windows Server 2019 und Windows 10 über „Manage optional features“ einen SSH Client und Server installieren kannst? Oder noch einfacher über den folgenden Power Shell Command:

Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

Damit wird die (mühsame) Konfiguration von WinRM überflüssig und Windows-Server lassen sich einfach und übereinstimmend wie Linux-Server erreichen. Welcome to the future!

7 – Hostvars!

Hast du schon Mal versucht auf jedem Server ein /etc/hosts-File mit allen Servern, die im Inventory bekannt sind anzulegen? Gar nicht so einfach. Man könnte auf jedem Server einen Task ausführen, der Informationen aus einem Server-Fact auf den Control-Host schreibt (delegate_to: localhost) und diesen weiterverwenden. Nicht wirklich elegant und es geht auch einfacher:
Die Special-Variable „hostvars“ beinhaltet alle Variablen (und damit Facts) aller Server im Inventory. Damit können zum Beispiel /etc/hosts-Files mit den Informationen aus dem Inventory einfach angelegt werden. Mit `{{ hostvars[server1].ansible_default_ipv4.address }}` kann zum Beispiel die IP von Server1 ausgelesen werden und zwar unabhängig davon, auf welchem Server der Task gerade angewandt wird.

8 – ansible_hostname vs inventory_hostname

Die Variable `ansible_hostname` gibt den Hostname des Servers zurück. Dies indem ein DNS-Lookup auf die IP des Servers gemacht wird. Falls nun die dazugehörigen DNS-Konfigurationen falsch sind, kann das zu unerwartetem Verhalten führen. Gibt es zum Beispiel verschiedene Records zur selben IP, dann kann der Wert von `ansible_hostname` von Ansible-Run zu Ansible-Run variieren. Ist das der Fall, kann mit `inventory_hostname` der Hostnamen aus dem Inventory bezogen werden.

9 – Speed up your ansible run!

Ein paar Server, ein paar Rollen und der Ansible-Run kann schnell mal eine Weile dauern. Was kann ich tun um meinen Ansible-Run zu beschleunigen? In der Ansible-Konfiguration kann mit der Option „strategy“ ausgewählt werden, wie Ansible seine Tasks organisiert. Die Strategy kann übrigens auch auf Playbook-Ebene gewählt werden:

- hosts: all
  strategy: debug
  tasks:
    - file:
        path: /tmp/tempfolder/
        state: directory

Ansible bringt von Haus aus die Strategy-Plugins debug, free, host_pinned und linear mit. `ansible-doc -t strategy -l` zeigt übrigens alle verfügbaren Strategy-Plugins an.

Mit ‚Mitogen‘ gibt es in Python eine Library, die es ermöglicht Code verteilt auf remote-Systemen auszuführen („Mitogen is a Python library for writing distributed self-replicating programs.“). Ansible-Mitogen wiederum stellt ein Strategy-Plugin zur Verfügung, um die Performance massiv zu steigern. Alles was dafür gemacht werden muss, ist das Git-Repository zu klonen und anschliessend im `ansible.cfg` die Option „strategy“ und „strategy_plugin“ anzupassen:

strategy_plugins = /path/to/local/mitogen/ansible_mitogen/plugins/strategy
strategy = mitogen_linear</br ></br >

Der beobachtete Performance-Gewinn ist unterschiedlich. Der Ansible-Run kann jedoch durchaus doppelt so schnell werden.

10 – Und was bitte bedeutet „Ansible“?

Schöner Name, nur woher kommt er? Ursula K. LeGuin war eine bedeutende ScienceFiction- und Fantasy-Authorin und hat in ihrem Werk „Rocannon’s World“ aus dem Jahre 1966 ein Instant-Kommunikationsystem mit dem Namen „Ansible“ vorgestellt.

„Only for a moment, when he had located the control room and found the ansible and sat down before it, did he permit his mind-sense to drift over to the ship that sat east of this one. There he picked up a vivid sensation of a dubious hand hovering over a white Bishop. …
As his fingers (left hand only, awkwardly) struck each key, the letter appeared simultaneously on a small black screen in a room in a city on a planet eight lightyears distant.“

From Rocannon’s World, by Ursula LeGuin.

Kommentare sind geschlossen.