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 ansibleMit pip (aktuellste Version)
pip install ansibleVersion prüfen
ansible --versionInventar (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/python3Eigenes 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.20Nutzung:
ansible -i hosts.ini webservers -m pingYAML-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.20Ad-hoc-Befehle
Einzelne Befehle auf Servern ausführen:
Ping (Erreichbarkeit testen)
ansible all -m pingBefehl 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" --becomeService starten
ansible webservers -m service -a "name=nginx state=started" --becomeDatei 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: yesAusführen
ansible-playbook webserver.ymlMit Inventar
ansible-playbook -i hosts.ini webserver.ymlSyntax prüfen
ansible-playbook webserver.yml --syntax-checkDry-Run
ansible-playbook webserver.yml --checkWichtige Module
apt/yum/dnf
- name: Pakete installieren
apt:
name:
- nginx
- php-fpm
- mysql-server
state: present
update_cache: yesservice/systemd
- name: Service verwalten
systemd:
name: nginx
state: restarted
enabled: yescopy
- 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 nginxfile
- 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/bashlineinfile
- 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: mainVariablen
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.ymlHost-Variablen
# host_vars/web1.yml
http_port: 8080Gruppen-Variablen
# group_vars/webservers.yml
http_port: 80
document_root: /var/www/htmlHandler
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: restartedBedingungen (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 definedSchleifen (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.ymlRole erstellen
ansible-galaxy init nginxRole verwenden
---
- hosts: webservers
roles:
- nginx
- php
- mysqlAnsible Galaxy
Community-Roles herunterladen:
# Role installieren
ansible-galaxy install geerlingguy.nginx
# Collection installieren
ansible-galaxy collection install community.generalAnsible 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-passVollstä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: reloadedFazit
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.