Ansible mit Rocky: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
(Die Seite wurde neu angelegt: „= Ansible auf Rocky Linux = Ansible ist ein agentenloser Automatisierungsdienst – es wird nur auf dem Control Node installiert, die verwalteten Maschinen br…“) |
(kein Unterschied)
|
Aktuelle Version vom 20. Mai 2026, 06:23 Uhr
Ansible auf Rocky Linux
Ansible ist ein agentenloser Automatisierungsdienst – es wird nur auf dem Control Node installiert, die verwalteten Maschinen brauchen nichts außer SSH und Python. Im Labor übernimmt der Client im LAN die Rolle des Control Node und verwaltet alle DMZ-Server.
Installation
- Ansible wird nur auf dem Control Node installiert – also auf client.it2XX.int
- dnf install -y ansible
SSH-Schlüssel vorbereiten
- Ansible kommuniziert über SSH – der Control Node braucht einen Schlüssel der auf allen Zielsystemen hinterlegt ist
- ssh-keygen -t ed25519 -C "ansible@it2XX.int"
- Schlüssel auf alle DMZ-Server verteilen
- ssh-copy-id root@ns.it2XX.int
- ssh-copy-id root@www.it2XX.int
- ssh-copy-id root@ldap.it2XX.int
Inventory
- Das Inventory listet alle verwalteten Maschinen – hier gruppiert nach ihrer Rolle
- mkdir -p /etc/ansible
- vi /etc/ansible/hosts
[dmz] ns.it2XX.int www.it2XX.int ldap.it2XX.int [dmz:vars] ansible_user=root
Erster Test
- Alle Maschinen anpingen – Ansible nutzt dafür das ping-Modul, nicht ICMP
- ansible all -m ping
ns.it2XX.int | SUCCESS => {
"changed": false,
"ping": "pong"
}
- Ad-hoc Befehl auf allen Maschinen ausführen
- ansible all -m command -a "hostname"
- Nur die DMZ-Gruppe ansprechen
- ansible dmz -m command -a "uptime"
Playbooks
- Ein Playbook ist eine YAML-Datei die Tasks in einer bestimmten Reihenfolge ausführt
- Einfaches Beispiel – Paket installieren und Dienst starten
- vi /root/test.yml
---
- name: Testplaybook
hosts: dmz
tasks:
- name: tree installieren
dnf:
name: tree
state: present
- ansible-playbook /root/test.yml
Rollen
- Rollen sind wiederverwendbare Ansible-Strukturen – Playbook, Templates und Handler in einem Verzeichnis
- Eine Rolle hat immer dieselbe Verzeichnisstruktur
roles/
└── rollenname/
├── tasks/
│ └── main.yml
├── templates/
├── handlers/
│ └── main.yml
└── defaults/
└── main.yml
- Rollengerüst automatisch erstellen
- mkdir -p /etc/ansible/roles
- cd /etc/ansible/roles
- ansible-galaxy init sssd
- ansible-galaxy init ssh-hardening
Rolle: SSSD
- Diese Rolle installiert SSSD auf allen DMZ-Servern und verbindet sie gegen den LDAP-Server
tasks/main.yml
- vi /etc/ansible/roles/sssd/tasks/main.yml
---
- name: Pakete installieren
dnf:
name:
- sssd
- sssd-ldap
- oddjob
- oddjob-mkhomedir
state: present
- name: sssd.conf schreiben
template:
src: sssd.conf.j2
dest: /etc/sssd/sssd.conf
owner: root
group: root
mode: '0600'
notify: sssd neu starten
- name: authselect konfigurieren
command: authselect select sssd with-mkhomedir --force
changed_when: false
- name: oddjobd starten
systemd:
name: oddjobd
enabled: true
state: started
templates/sssd.conf.j2
- Das Template nutzt Ansible-Variablen – so funktioniert dieselbe Rolle für jeden Studenten
- vi /etc/ansible/roles/sssd/templates/sssd.conf.j2
[sssd]
config_file_version = 2
services = nss, pam, sudo
domains = {{ domain }}
[domain/{{ domain }}]
id_provider = ldap
auth_provider = ldap
chpass_provider = ldap
access_provider = permit
sudo_provider = ldap
ldap_uri = ldaps://ldap.{{ domain }}
ldap_search_base = dc={{ dc1 }},dc={{ dc2 }}
ldap_sudo_search_base = ou=sudo,dc={{ dc1 }},dc={{ dc2 }}
ldap_default_bind_dn = cn=admin,dc={{ dc1 }},dc={{ dc2 }}
ldap_default_authtok = {{ ldap_password }}
ldap_tls_cacert = /etc/pki/tls/certs/ca-bundle.crt
ldap_tls_reqcert = hard
cache_credentials = True
[nss]
filter_users = root,daemon,bin,sys,sync,games,man,lp,mail,news,uucp,proxy,nobody,systemd-network,systemd-resolve,dbus,polkitd,unbound,tss,sssd,chrony,sshd,rngd
[pam]
offline_credentials_expiration = 2
handlers/main.yml
- vi /etc/ansible/roles/sssd/handlers/main.yml
---
- name: sssd neu starten
systemd:
name: sssd
state: restarted
defaults/main.yml
- Standardwerte – werden durch group_vars oder host_vars überschrieben
- vi /etc/ansible/roles/sssd/defaults/main.yml
--- domain: "it2XX.int" dc1: "it2XX" dc2: "int" ldap_password: "123Start$"
Rolle: SSH-Härtung
- Diese Rolle schaltet Passwort-Authentifizierung ab – erst nachdem die SSH-Keys verteilt wurden
- Wichtig
- Reihenfolge beachten – erst Keys verteilen, dann diese Rolle ausführen
tasks/main.yml
- vi /etc/ansible/roles/ssh-hardening/tasks/main.yml
---
- name: Passwort-Login deaktivieren
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^#?PasswordAuthentication'
line: 'PasswordAuthentication no'
state: present
notify: sshd neu starten
- name: Root-Login nur mit Key erlauben
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^#?PermitRootLogin'
line: 'PermitRootLogin prohibit-password'
state: present
notify: sshd neu starten
handlers/main.yml
- vi /etc/ansible/roles/ssh-hardening/handlers/main.yml
---
- name: sshd neu starten
systemd:
name: sshd
state: restarted
Playbook: DMZ ausrollen
- Ein Playbook das beide Rollen nacheinander ausführt
- vi /etc/ansible/dmz.yml
---
- name: DMZ-Server konfigurieren
hosts: dmz
roles:
- sssd
- ssh-hardening
- Zuerst nur SSSD ausrollen und testen
- ansible-playbook /etc/ansible/dmz.yml --tags sssd
- Danach SSH-Härtung
- ansible-playbook /etc/ansible/dmz.yml
- Dry-run – zeigt was sich ändern würde ohne es anzuwenden
- ansible-playbook /etc/ansible/dmz.yml --check
Kontrolle
- SSSD auf einem Server prüfen
- ansible ns.it2XX.int -m command -a "getent passwd thomas"
- SSH-Konfiguration prüfen
- ansible dmz -m command -a "grep PasswordAuthentication /etc/ssh/sshd_config"
- Alle Fakten eines Servers anzeigen – nützlich zur Fehlersuche
- ansible ns.it2XX.int -m setup
Logs
- journalctl -fu sshd
- ansible-playbook /etc/ansible/dmz.yml -v
- ansible-playbook /etc/ansible/dmz.yml -vvv