Ansible mit Rocky: Unterschied zwischen den Versionen

Aus Xinux Wiki
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