Ansible automatisiert Server-Konfiguration und Software-Deployment. Im Gegensatz zu anderen Tools benötigt es keine Agenten auf den Zielservern.

Warum Ansible?

  • Agentless: Nur SSH erforderlich
  • Einfach: YAML-Syntax, leicht lesbar
  • Idempotent: Mehrfache Ausführung sicher
  • Erweiterbar: Tausende Module verfügbar
  • Kostenlos: Open Source

Installation

Ubuntu/Debian

apt update
apt install ansible

Mit pip (aktuellste Version)

pip install ansible

Version prüfen

ansible --version

Inventar (Hosts-Datei)

Das Inventar definiert, welche Server verwaltet werden.

/etc/ansible/hosts

[webservers]
web1.example.com
web2.example.com
192.168.1.100

[databases]
db1.example.com
db2.example.com

[all:vars]
ansible_user=admin
ansible_python_interpreter=/usr/bin/python3

Eigenes Inventar

# hosts.ini
[webservers]
web1 ansible_host=192.168.1.10 ansible_user=admin
web2 ansible_host=192.168.1.11 ansible_user=admin

[databases]
db1 ansible_host=192.168.1.20

Nutzung:

ansible -i hosts.ini webservers -m ping

YAML-Format

# inventory.yml
all:
  children:
    webservers:
      hosts:
        web1:
          ansible_host: 192.168.1.10
        web2:
          ansible_host: 192.168.1.11
    databases:
      hosts:
        db1:
          ansible_host: 192.168.1.20

Ad-hoc-Befehle

Einzelne Befehle auf Servern ausführen:

Ping (Erreichbarkeit testen)

ansible all -m ping

Befehl ausführen

ansible webservers -m command -a "uptime"
ansible webservers -m shell -a "df -h | grep /dev/sda"

Paket installieren

ansible webservers -m apt -a "name=nginx state=present" --become

Service starten

ansible webservers -m service -a "name=nginx state=started" --become

Datei kopieren

ansible webservers -m copy -a "src=/local/file dest=/remote/file"

Playbooks

Playbooks definieren Aufgaben in YAML:

Einfaches Playbook

# webserver.yml
---
- name: Webserver einrichten
  hosts: webservers
  become: yes

  tasks:
    - name: Nginx installieren
      apt:
        name: nginx
        state: present
        update_cache: yes

    - name: Nginx starten
      service:
        name: nginx
        state: started
        enabled: yes

Ausführen

ansible-playbook webserver.yml

Mit Inventar

ansible-playbook -i hosts.ini webserver.yml

Syntax prüfen

ansible-playbook webserver.yml --syntax-check

Dry-Run

ansible-playbook webserver.yml --check

Wichtige Module

apt/yum/dnf

- name: Pakete installieren
  apt:
    name:
      - nginx
      - php-fpm
      - mysql-server
    state: present
    update_cache: yes

service/systemd

- name: Service verwalten
  systemd:
    name: nginx
    state: restarted
    enabled: yes

copy

- name: Datei kopieren
  copy:
    src: files/nginx.conf
    dest: /etc/nginx/nginx.conf
    owner: root
    mode: '0644'

template

- name: Template kopieren
  template:
    src: templates/nginx.conf.j2
    dest: /etc/nginx/nginx.conf
  notify: Restart nginx

file

- name: Verzeichnis erstellen
  file:
    path: /var/www/html
    state: directory
    owner: www-data
    mode: '0755'

user

- name: Benutzer erstellen
  user:
    name: deploy
    groups: www-data
    shell: /bin/bash

lineinfile

- name: Zeile in Datei ändern
  lineinfile:
    path: /etc/ssh/sshd_config
    regexp: '^PermitRootLogin'
    line: 'PermitRootLogin no'

git

- name: Repository klonen
  git:
    repo: https://github.com/user/repo.git
    dest: /var/www/app
    version: main

Variablen

In Playbook

---
- hosts: webservers
  vars:
    http_port: 80
    app_dir: /var/www/html

  tasks:
    - name: Index erstellen
      copy:
        content: "Port: {{ http_port }}"
        dest: "{{ app_dir }}/index.html"

In separater Datei

# vars/main.yml
http_port: 80
domain: example.com
- hosts: webservers
  vars_files:
    - vars/main.yml

Host-Variablen

# host_vars/web1.yml
http_port: 8080

Gruppen-Variablen

# group_vars/webservers.yml
http_port: 80
document_root: /var/www/html

Handler

Handler werden nur bei Änderungen ausgeführt:

---
- hosts: webservers
  become: yes

  tasks:
    - name: Nginx-Config kopieren
      copy:
        src: nginx.conf
        dest: /etc/nginx/nginx.conf
      notify: Restart nginx

  handlers:
    - name: Restart nginx
      service:
        name: nginx
        state: restarted

Bedingungen (when)

- name: Nur auf Ubuntu
  apt:
    name: nginx
    state: present
  when: ansible_distribution == "Ubuntu"

- name: Wenn Variable gesetzt
  debug:
    msg: "App-Dir: {{ app_dir }}"
  when: app_dir is defined

Schleifen (loop)

- name: Mehrere Pakete
  apt:
    name: "{{ item }}"
    state: present
  loop:
    - nginx
    - php-fpm
    - mysql-server

- name: Mehrere Benutzer
  user:
    name: "{{ item.name }}"
    groups: "{{ item.groups }}"
  loop:
    - { name: 'user1', groups: 'admin' }
    - { name: 'user2', groups: 'developers' }

Roles

Roles strukturieren wiederverwendbare Konfiguration:

Struktur

roles/
  nginx/
    tasks/
      main.yml
    handlers/
      main.yml
    templates/
      nginx.conf.j2
    files/
    vars/
      main.yml
    defaults/
      main.yml

Role erstellen

ansible-galaxy init nginx

Role verwenden

---
- hosts: webservers
  roles:
    - nginx
    - php
    - mysql

Ansible Galaxy

Community-Roles herunterladen:

# Role installieren
ansible-galaxy install geerlingguy.nginx

# Collection installieren
ansible-galaxy collection install community.general

Ansible Vault

Sensible Daten verschlüsseln:

# Datei verschlüsseln
ansible-vault encrypt secrets.yml

# Datei bearbeiten
ansible-vault edit secrets.yml

# Playbook ausführen
ansible-playbook playbook.yml --ask-vault-pass

Vollständiges Beispiel

# site.yml
---
- name: Webserver Setup
  hosts: webservers
  become: yes

  vars:
    domain: example.com
    document_root: /var/www/{{ domain }}

  tasks:
    - name: System aktualisieren
      apt:
        upgrade: dist
        update_cache: yes

    - name: Pakete installieren
      apt:
        name:
          - nginx
          - php8.2-fpm
        state: present

    - name: Document Root erstellen
      file:
        path: "{{ document_root }}"
        state: directory
        owner: www-data
        mode: '0755'

    - name: Nginx vHost konfigurieren
      template:
        src: templates/vhost.conf.j2
        dest: /etc/nginx/sites-available/{{ domain }}
      notify: Reload nginx

    - name: vHost aktivieren
      file:
        src: /etc/nginx/sites-available/{{ domain }}
        dest: /etc/nginx/sites-enabled/{{ domain }}
        state: link
      notify: Reload nginx

  handlers:
    - name: Reload nginx
      service:
        name: nginx
        state: reloaded

Fazit

Ansible ist ideal für Server-Automatisierung. Die agentlose Architektur und YAML-Syntax machen den Einstieg einfach. Starten Sie mit Ad-hoc-Befehlen, erstellen Sie dann Playbooks und strukturieren Sie komplexe Setups mit Roles.