65 AWX/Tower Automatisierung und Integration von Benutzer- und Rollenverwaltung

65.1 Automatisierung der Benutzerverwaltung auf Zielsystemen

Ansible automatisiert nicht nur die Anwendungsbereitstellung, sondern auch die Verwaltung von Benutzerkonten auf den verwalteten Systemen.

65.1.1 Grundlegende Benutzerverwaltung

- name: Benutzer anlegen
  user:
    name: johndoe
    shell: /bin/bash
    groups: developers
    state: present

- name: SSH-Schlüssel hinzufügen
  authorized_key:
    user: johndoe
    key: "{{ ansible_user_ssh_key }}"

65.1.2 Skalierte Benutzerverwaltung

Für größere Umgebungen empfiehlt sich die Definition von Benutzerlisten in Inventarvariablen:

# group_vars/all.yml
system_users:
  - name: johndoe
    groups: [developers, ssh_users]
    ssh_key: "ssh-rsa AAAAB3NzaC1yc2E..."
  - name: janedoe
    groups: [admins, ssh_users]
    ssh_key: "ssh-rsa AAAAB3NzaC1yc2E..."

# Playbook
- name: Benutzer aus Liste erstellen
  user:
    name: "{{ item.name }}"
    groups: "{{ item.groups }}"
  loop: "{{ system_users }}"

65.2 Tower/AWX-Verwaltung mit Tower CLI

Der Tower CLI bietet eine effizientere Alternative zur direkten API-Nutzung für die Automatisierung von Tower/AWX.

65.2.1 Installation und Konfiguration

pip install ansible-tower-cli
awx config host https://tower.example.com
awx config username admin
awx config password your_password

65.2.2 Team- und Benutzerverwaltung

# Team erstellen
awx teams create --name "DevOps Team" --organization "Default"

# Benutzer hinzufügen
awx users create --username johndoe --email johndoe@example.com \
    --first-name John --last-name Doe

# Benutzer zum Team hinzufügen
awx teams associate --team "DevOps Team" --user johndoe

65.2.3 Automatisierte Rollenzuweisung

# Rolle an Team vergeben
awx roles grant --team "DevOps Team" --type admin \
    --target-team "DevOps Team"

# Projekt-spezifische Berechtigung
awx roles grant --team "DevOps Team" --type execute \
    --job-template "Deploy Webserver"

65.3 Integration externer Verzeichnisdienste

65.3.1 LDAP-Integration konfigurieren

Die Integration erfolgt über die Tower-Einstellungen oder API. Zentrale Konfigurationsparameter:

# Wesentliche LDAP-Einstellungen
AUTH_LDAP_SERVER_URI = "ldap://ldap.example.com"
AUTH_LDAP_USER_SEARCH = LDAPSearch(
    "ou=users,dc=example,dc=com", 
    ldap.SCOPE_SUBTREE, 
    "(uid=%(user)s)"
)

Hinweis: Vollständige LDAP-Konfigurationen gehören in das Kapitel “Integration externer Verzeichnisdienste” oder den Anhang “Konfigurationsreferenz”.

65.3.2 Gruppenbasierte Rollenzuweisung

LDAP-Gruppen können automatisch auf Tower-Teams und -Rollen gemappt werden:

# Mapping-Beispiel (vereinfacht)
LDAP_GROUP_MAPPINGS:
  "cn=ansible-admins,ou=groups,dc=example,dc=com":
    - organization_admin: ["Default"]
  "cn=devops,ou=groups,dc=example,dc=com":
    - execute: ["Deploy Webserver", "Update Database"]

65.4 Automatisiertes Onboarding und Offboarding

65.4.1 Onboarding-Playbook

- name: Neuen Mitarbeiter onboarden
  hosts: localhost
  vars:
    new_user:
      username: "{{ username }}"
      email: "{{ email }}"
      team: "{{ team_name }}"
  tasks:
    - name: Benutzer in Tower anlegen
      shell: |
        awx users create --username {{ new_user.username }} \
          --email {{ new_user.email }}

    - name: Zu Team hinzufügen
      shell: |
        awx teams associate --team "{{ new_user.team }}" \
          --user {{ new_user.username }}

65.4.2 Offboarding-Automatisierung

- name: Mitarbeiter offboarden
  hosts: localhost
  tasks:
    - name: Benutzer in Tower deaktivieren
      shell: |
        awx users modify {{ username }} --is-active false

    - name: SSH-Schlüssel von allen Systemen entfernen
      authorized_key:
        user: "{{ username }}"
        state: absent
      delegate_to: "{{ item }}"
      loop: "{{ groups['all'] }}"

65.5 Monitoring und Wartung

65.5.1 Automatisierte Berechtigungsaudits

- name: Berechtigungsaudit durchführen
  hosts: localhost
  tasks:
    - name: Alle aktiven Benutzer auflisten
      shell: awx users list --is-active true
      register: active_users

    - name: Benutzer ohne Login in letzten 90 Tagen
      shell: |
        awx users list --last-login__lt="{{ (ansible_date_time.epoch | int - 7776000) | 
        strftime('%Y-%m-%d') }}"
      register: inactive_users

65.5.2 Berichterstellung

- name: Berechtigungsbericht erstellen
  template:
    src: permission_report.j2
    dest: /tmp/permission_report_{{ ansible_date_time.date }}.html
  vars:
    report_data:
      active_users: "{{ active_users.stdout | from_json }}"
      inactive_users: "{{ inactive_users.stdout | from_json }}"

65.6 API-basierte Integration

Für komplexere Integrationen bietet die Tower-API umfassende Möglichkeiten:

# Python-Beispiel für Tower-API
import requests

def create_team(tower_url, token, team_name, org_id):
    headers = {
        'Authorization': f'Bearer {token}',
        'Content-Type': 'application/json'
    }
    data = {
        'name': team_name,
        'organization': org_id
    }
    response = requests.post(
        f'{tower_url}/api/v2/teams/',
        json=data,
        headers=headers
    )
    return response.json()

65.7 Troubleshooting und häufige Probleme

65.7.1 LDAP-Verbindungsprobleme

65.7.2 Tower CLI-Fehler

# Verbindung testen
awx config

# Debug-Modus aktivieren
awx --verbose teams list

65.7.3 Berechtigungskonflikte