Besonderheiten von Facts

In Ansible sind Facts eine entscheidende Komponente für das effiziente und dynamische Verwalten von Konfigurationen. Facts sind automatisch gesammelte Informationen über verwaltete Hosts, die von Ansible Playbooks verwendet werden, um Entscheidungen in Echtzeit zu treffen. In diesem Blogbeitrag werde ich die Besonderheiten von Ansible Facts erläutern, wie sie genutzt werden können und welche Fallstricke oder nützlichen Tipps es bei der Verwendung gibt.


Was sind Ansible Facts?

Facts in Ansible sind Daten, die über den Zustand eines Hosts (z.B. Betriebssystem, Netzwerk-Interfaces, Speicherplatz) während der Ausführung von Playbooks ermittelt werden. Diese Informationen können von Modulen wie setup gesammelt und in Variablen gespeichert werden, auf die dann innerhalb eines Playbooks zugegriffen wird.

Ein einfaches Beispiel für den Zugriff auf Facts:

---
- name: Beispiel Playbook zur Anzeige von Ansible Facts
  hosts: all
  tasks:
    - name: Zeige alle Facts für den Host an
      debug:
        var: ansible_facts

Wenn dieses Playbook ausgeführt wird, zeigt es alle gesammelten Facts des Hosts an.


Wichtige Facts und ihre Besonderheiten

Die von Ansible gesammelten Facts decken eine Vielzahl von Systemdetails ab, hier sind einige der wichtigsten Facts, die oft in Playbooks verwendet werden:

  • ansible_distribution: Gibt das Betriebssystem des Hosts an (z.B. „Ubuntu“, „CentOS“).
  • ansible_hostname: Der Hostname des Systems.
  • ansible_default_ipv4.address: Die IP-Adresse des Hosts auf der Standard-IPv4-Schnittstelle.
  • ansible_memtotal_mb: Gesamter verfügbarer Speicher in Megabyte.
  • ansible_processor_cores: Anzahl der Prozessorkerne.

Diese Informationen sind nützlich, um Bedingungen für bestimmte Tasks in Abhängigkeit vom Zustand eines Hosts zu definieren. Ein Beispiel:

---
- name: Installiere Software nur auf Ubuntu-Systemen
  hosts: all
  tasks:
    - name: Installiere Apache auf Ubuntu
      apt:
        name: apache2
        state: present
      when: ansible_distribution == "Ubuntu"

Hier wird Apache nur auf Systemen installiert, die als Betriebssystem Ubuntu verwenden.


Custom Facts (Benutzerdefinierte Facts)

Neben den standardmäßig von Ansible gesammelten Facts, können auch eigene, benutzerdefinierte Facts erstellt werden. Diese können in JSON, YAML oder INI-Dateien auf dem verwalteten Host abgelegt und von Ansible automatisch geladen werden.

Beispiel für benutzerdefinierte Facts:

  1. Erstellen einer JSON-Datei auf dem verwalteten Host unter /etc/ansible/facts.d/mein_custom_fact.fact:
{
  "my_custom_variable": "Hello World",
  "server_role": "web"
}

Anschließend kann dieses Fact in einem Playbook wie folgt verwendet werden:

---
- name: Verwendung von benutzerdefinierten Facts
  hosts: all
  tasks:
    - name: Zeige den benutzerdefinierten Fact an
      debug:
        var: ansible_local['mein_custom_fact']['my_custom_variable']

Diese benutzerdefinierten Facts werden automatisch durch das setup-Modul geladen und stehen so zur Verfügung, als wären sie systemeigene Facts.


Performanceoptimierung mit minimalen Facts

Standardmäßig sammelt Ansible eine sehr große Menge an Facts. In großen Infrastrukturen kann dies zu Performanceproblemen führen. Um dies zu vermeiden, kann man die Anzahl der gesammelten Facts reduzieren, indem nur bestimmte Facts gesammelt werden.

Dies kann durch die Nutzung des gather_facts Parameters und spezifischen Filtern erreicht werden:

---
- name: Playbook mit minimalen Facts
  hosts: all
  gather_facts: yes
  gather_subset:
    - "network"
    - "hardware"
  tasks:
    - name: Zeige nur Netzwerk- und Hardware-Facts
      debug:
        var: ansible_facts

Hier werden nur Netzwerk- und Hardware-bezogene Facts gesammelt, was die Geschwindigkeit des Playbooks erheblich verbessert.


Nützliche Tipps bei der Arbeit mit Facts

  1. Facts Caching: Ansible unterstützt das Zwischenspeichern von Facts, um wiederholte Abfragen zu vermeiden und die Ausführungszeit zu verkürzen. Dies kann in der ansible.cfg aktiviert werden:
[defaults]
fact_caching = jsonfile
fact_caching_connection = /tmp/ansible_facts
fact_caching_timeout = 7200

2. Fact-Verwendung in Hostvariablen: Facts können auch in der hosts-Datei oder in Host-Variablen genutzt werden. Beispiel:

[webserver]
server1 ansible_host=192.168.1.10 ansible_user=ubuntu

3. Verwendung von Filtern: Man kann Facts in Playbooks mit Filtern verarbeiten. Ein Beispiel ist das Extrahieren einer spezifischen Netzwerk-Interface-IP:

- name: Zeige die IP-Adresse des eth0 Interfaces
  debug:
    msg: "{{ ansible_facts['ansible_eth0']['ipv4']['address'] }}"

Fazit

Ansible Facts sind ein mächtiges Werkzeug, um Playbooks dynamisch und flexibel zu gestalten. Durch die Verwendung von vordefinierten und benutzerdefinierten Facts lassen sich Automatisierungsaufgaben gezielt auf spezifische Hostbedingungen abstimmen. Gleichzeitig sollte man darauf achten, dass die Menge an gesammelten Facts bei großen Infrastrukturen optimiert wird, um die Ausführungszeiten von Playbooks nicht unnötig zu verlängern.

Mit diesen Grundlagen und Tipps sind Sie bestens gerüstet, um das Beste aus Ansible Facts herauszuholen und Ihre Infrastruktur effizient zu verwalten.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert