Ansible KIT Grundlagen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

Ansible Grundlagen

Ansible ist ein agentenloses Automatisierungswerkzeug. Es verbindet sich per SSH auf die Zielsysteme und führt dort Aufgaben aus – ohne dass auf den Zielsystemen Software installiert werden muss.

Begriffe

Begriff Bedeutung
Control-Node Der Rechner von dem Ansible ausgeführt wird
Managed Node Die Zielsysteme die Ansible konfiguriert
Inventory Liste der Managed Nodes
Playbook YAML-Datei mit den auszuführenden Aufgaben
Task Eine einzelne Aufgabe in einem Playbook
Modul Ansible-Baustein der eine Aufgabe erledigt (z.B. template, systemd)
Rolle (Role) Wiederverwendbare Sammlung von Tasks, Templates und Handlers
Handler Task der nur ausgeführt wird wenn er durch notify ausgelöst wurde
Template Konfigurationsdatei mit Jinja2-Variablen
Vault Verschlüsselter Speicher für Passwörter und Secrets

Installation

Ansible wird nur auf dem Control-Node installiert.

apt update
apt install ansible -y

Version prüfen:

ansible --version

Inventory

Das Inventory definiert welche Hosts Ansible verwalten soll.

Einfaches Inventory

[webserver]
web01 ansible_host=192.168.1.10
web02 ansible_host=192.168.1.11

[webserver:vars]
ansible_user=admin

Variablen pro Host

Jeder Host kann eigene Variablen bekommen:

[firewalls]
fw01 ansible_host=192.168.1.20 fw_xx=201
fw02 ansible_host=192.168.1.21 fw_xx=202

Inventory testen

ansible all --list-hosts
ansible webserver --list-hosts

ansible.cfg

Die Datei ansible.cfg im Projektverzeichnis setzt Standardwerte:

[defaults]
inventory         = inventory/hosts.ini
remote_user       = admin
host_key_checking = False

[privilege_escalation]
become        = True
become_method = sudo
host_key_checking = False
Deaktiviert die SSH-Fingerprint-Prüfung – sinnvoll im Lab, nicht für Produktion
become = True
Führt Befehle mit sudo aus

Ad-hoc-Befehle

Ad-hoc-Befehle sind Einzeiler für schnelle Aufgaben ohne Playbook.

Erreichbarkeit prüfen
  • ansible all -m ping
Befehl ausführen
  • ansible all -m command -a "uptime"
Paket installieren
  • ansible webserver -m apt -a "name=vim state=present" -b
Datei kopieren
  • ansible all -m copy -a "src=foo.txt dest=/tmp/foo.txt"

Playbook

Ein Playbook ist eine YAML-Datei die beschreibt was auf welchen Hosts ausgeführt werden soll.

Aufbau

---
- name: Webserver einrichten
  hosts: webserver
  gather_facts: false

  tasks:
    - name: nginx installieren
      apt:
        name: nginx
        state: present

    - name: nginx starten
      systemd:
        name: nginx
        state: started
        enabled: true

Playbook ausführen

ansible-playbook site.yml
Nur bestimmte Hosts
  • ansible-playbook site.yml --limit fw212,fw213
Nur bestimmte Tags
  • ansible-playbook site.yml --tags nftables
Trockenlauf (nichts wird verändert)
  • ansible-playbook site.yml --check
Verbose-Ausgabe
  • ansible-playbook site.yml -v (mehr v = mehr Details, bis -vvvv)

Tags

Mit Tags kann man gezielt einzelne Tasks ausführen.

tasks:
  - name: nftables konfigurieren
    template:
      src: nftables.conf.j2
      dest: /etc/nftables.conf
    tags: nftables

  - name: Hostname setzen
    hostname:
      name: "fw.example.int"
    tags: hostname

Ausführen:

ansible-playbook site.yml --tags nftables
ansible-playbook site.yml --skip-tags reboot

Templates

Templates sind Konfigurationsdateien mit Jinja2-Variablen. Ansible befüllt die Variablen beim Ausführen pro Host.

Templates liegen in roles/<rolle>/templates/ und haben die Endung .j2.

Beispiel

Template resolv.conf.j2:

search it2{{ fw_xx }}.int
nameserver 192.168.{{ fw_y }}.88

Task der das Template einsetzt:

- name: resolv.conf konfigurieren
  template:
    src: resolv.conf.j2
    dest: /etc/resolv.conf
    owner: root
    group: root
    mode: '0644'

Jinja2-Grundlagen

Syntax Bedeutung
Vorlage:Variable Variablenwert einsetzen
{% if bedingung %} ... {% endif %} Bedingung
{% for item in liste %} ... {% endfor %} Schleife

Rollen (Roles)

Rollen sind wiederverwendbare Einheiten die Tasks, Templates und Handler bündeln.

Struktur

roles/
└── meine-rolle/
    ├── tasks/
    │   └── main.yml      ← Tasks
    ├── handlers/
    │   └── main.yml      ← Handler
    ├── templates/
    │   └── config.j2     ← Templates
    ├── files/
    │   └── script.sh     ← Statische Dateien
    └── defaults/
        └── main.yml      ← Standardwerte für Variablen

Rolle im Playbook verwenden

---
- name: Firewall konfigurieren
  hosts: firewalls
  roles:
    - fw

Handler

Handler werden nur ausgeführt wenn ein Task sie mit notify ausgelöst hat – und das nur einmal am Ende des Plays, egal wie oft sie ausgelöst wurden.

tasks:
  - name: nftables.conf konfigurieren
    template:
      src: nftables.conf.j2
      dest: /etc/nftables.conf
    notify: nftables reload

handlers:
  - name: nftables reload
    systemd:
      name: nftables
      state: reloaded

Typische Anwendung: Konfigurationsdatei ändern → Dienst neu starten.

Vault

Mit Ansible Vault können Passwörter und Secrets verschlüsselt gespeichert werden.

Datei verschlüsseln
  • ansible-vault encrypt secrets.yml
Datei entschlüsseln
  • ansible-vault decrypt secrets.yml
Datei ansehen ohne entschlüsseln
  • ansible-vault view secrets.yml
Playbook mit Vault-Datei ausführen
  • ansible-playbook site.yml --ask-vault-pass
Passwort aus Datei lesen
  • ansible-playbook site.yml --vault-password-file .vault_pass

Verschlüsselte Variable in einer normalen YAML-Datei:

db_password: !vault |
  $ANSIBLE_VAULT;1.1;AES256
  61383034346134653831...

Siehe auch