Inhalt

Ansible Facts: Verwendung in Playbooks und Tasks

Ansible Facts sind ein mächtiges Werkzeug, das es Administratoren und Entwicklern ermöglicht, Informationen über entfernte Systeme effizient abzurufen und zu nutzen. In diesem Beitrag werden wir uns ansehen, wie du Ansible Facts in Playbooks und Tasks für fortgeschrittene Anwendungen verwenden kannst.

Was sind Ansible Facts?

Ansible Facts sind eine Sammlung von Systeminformationen, die Ansible automatisch von entfernten Hosts sammelt. Sie beinhalten Daten wie Betriebssystem, Netzwerkkonfiguration, verfügbare Speicherplatzkapazität und vieles mehr. Ansible verwendet diese Facts, um Entscheidungen bei der Ausführung von Playbooks und Tasks zu treffen.

Info

Du kannst dir die Ansible Facts in einen Ordner exportieren lassen, indem du folgende Zeile in deine ansible.cfg einfügst:

1
2
fact_caching = jsonfile
fact_caching_connection = /var/cache/ansible/facts

Verwendung von Ansible Facts in Playbooks

Um Ansible Facts in Playbooks zu verwenden, musst du zuerst sicherstellen, dass das Modul setup in deinem Playbook aufgerufen wird. Dieses Modul sammelt die Facts über die Zielhosts. Du kannst es entweder explizit aufrufen oder implizit durch die Verwendung der gather_facts-Option in deinem Playbook:

1
2
3
- name: Gather facts from target hosts
  hosts: all
  gather_facts: yes

Sobald die Facts gesammelt wurden, kannst du sie in deinen Playbooks verwenden, indem du die {{ ansible_facts }}-Variable verwendest. Du kannst auf spezifische Facts zugreifen, indem du sie als Teil der Variable angibst, zum Beispiel {{ ansible_facts['os_family'] }}.

Beispiel: Installation von Paketen basierend auf dem Betriebssystem

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
- name: Install packages based on OS
  hosts: all
  gather_facts: yes
  tasks:
    - name: Install package for Debian-based systems
      apt:
        name: my_package
        state: present
      when: ansible_facts['os_family'] == "Debian"

    - name: Install package for Red Hat-based systems
      yum:
        name: my_package
        state: present
      when: ansible_facts['os_family'] == "RedHat"
Tipp
Du kannst die Ansible Facts für dein System mit dem Befehl ansible -m setup localhost anzeigen lassen.

Verwendung von Ansible Facts in Tasks

Du kannst Ansible Facts auch in einzelnen Tasks verwenden, indem du sie direkt als Bedingungen oder in Jinja2-Templates einfügst.

Beispiel: Erstellen von Dateien basierend auf der Netzwerkkonfiguration

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
- name: Create files based on network configuration
  hosts: all
  gather_facts: yes
  tasks:
    - name: Create a file with the primary IP address
      ansible.builtin.template:
        src: templates/ip_address.j2
        dest: /etc/my_app/ip_address.conf
      vars:
        ip_address: "{{ ansible_facts['default_ipv4']['address'] }}"

In diesem Beispiel wird eine Datei erstellt, die die primäre IP-Adresse des Hosts enthält. Die IP-Adresse wird aus den gesammelten Facts extrahiert und der ip_address-Variable zugewiesen, die dann im Jinja2-Template verwendet wird.

Eklärung der Notation

In Ansible kannst du auf einzelne Facts aus einem Dictionary zugreifen, indem du den Namen des Dictionarys und den Schlüssel des gewünschten Facts angibst. Du kannst dies entweder mit der Standardnotation dictionary['key'] oder der verkürzten Dot-Notation dictionary.key tun.

Hier ist ein Beispiel, wie du auf einzelne Facts in einem Dictionary zugreifen kannst:

Angenommen, du hast ein Dictionary mit dem Namen server_info, das die folgenden Informationen enthält:

1
2
3
4
server_info:
  hostname: myserver
  os: ubuntu
  version: "20.04"

Um auf die einzelnen Facts in diesem Dictionary zuzugreifen, kannst du die folgenden Ansible-Variablen verwenden:

1
2
3
{{ server_info['hostname'] }}  # Zugriff auf den Hostnamen
{{ server_info['os'] }}        # Zugriff auf das Betriebssystem
{{ server_info['version'] }}   # Zugriff auf die Version

Alternativ kannst du die Dot-Notation verwenden, um auf die Facts zuzugreifen:

1
2
3
{{ server_info.hostname }}   # Zugriff auf den Hostnamen
{{ server_info.os }}         # Zugriff auf das Betriebssystem
{{ server_info.version }}    # Zugriff auf die Version
Tipp
Tipp: Wenn du die Dot-Notation verwenden möchtest, musst du sicherstellen, dass der Schlüssel keine Sonderzeichen enthält. Wenn der Schlüssel Sonderzeichen enthält, musst du die Standardnotation verwenden.

Beide Notationen führen zum gleichen Ergebnis und können je nach persönlicher Vorliebe verwendet werden. In ähnlicher Weise kannst du auf Ansible Facts aus einem Dictionary zugreifen, indem du die ansible_facts-Variable zusammen mit dem gewünschten Fact-Schlüssel verwendest:

1
2
{{ ansible_facts['distribution'] }}       # Zugriff auf die Distribution
{{ ansible_facts['default_ipv4']['address'] }} # Zugriff auf die Standard-IPv4-
Info

Je nach Ansible Version, kannst du auch auf die Facts mit der folgenden Notation zugreifen:

1
2
{{ ansible_distribution }}       # Zugriff auf die Distribution
{{ ansible_default_ipv4.address }} # Zugriff auf die Standard-IPv4-

Fazit

Ansible Facts bieten eine enorme Flexibilität und ermöglichen es dir, deine Playbooks und Tasks intelligent und systematisch auf entfernten Hosts auszuführen. Sie erlauben dir, auf spezifische Systeminformationen zuzugreifen ohne das du sie davor kennst.

Ich hoffe ich konnte dir das Thema verständlich näher bringen.

Viel Erfolg auf deiner Automatisierungsreise!


Hier kannst du dir auch mein Cheat-Sheet für Anfänger kaufen (1 €):

Ansible Beginner Cheat-Sheet


Gefällt dir der Post?

PS:

Schau auch gerne in meinem GitHub Repo vorbei.