# Namespace nex für Agenten im Cluster (nex-Spec 2026-10-19 Cluster-Agenten): Brücke zu appsrv08 (D259), Zugang für # nex-admin (D265), Pull-Secret für die Gitea-Registry (D263). Läuft auf ops: ansible-playbook playbooks/nex-k3s.yml # # Voraussetzung für das Pull-Secret: /root/.config/knaster/gitea-registry.env mit REGISTRY_USER=… und # REGISTRY_TOKEN=… (Gitea-Token mit read:package). Fehlt die Datei, wird dieser Schritt übersprungen. # Ausgabe: Token-Datei für nex-admin (nur Pfad), CA des Clusters als base64 (für NEX_ADMIN_K8S_CA_B64) und API-Adresse. - name: Namespace nex für Cluster-Agenten hosts: localhost connection: local gather_facts: false vars: manifests: "{{ playbook_dir }}/../../../../deploy/k8s/nex" registry_env: /root/.config/knaster/gitea-registry.env token_file: /root/.config/knaster/nex-admin-k8s.token api_url: "https://{{ hostvars['k3s'].ansible_host }}:6443" tasks: - name: Namespace nex ansible.builtin.command: kubectl apply -f {{ playbook_dir }}/../../../../deploy/k8s/nex-speech/namespace.yaml register: ns changed_when: "'created' in ns.stdout" - name: Brücke zu appsrv08 (Services ohne Selector + Endpoints) ansible.builtin.command: kubectl apply -f {{ manifests }}/bridge.yaml register: bridge changed_when: "'configured' in bridge.stdout or 'created' in bridge.stdout" - name: Zugang für nex-admin (ServiceAccount, Role, RoleBinding, Token-Secret) ansible.builtin.command: kubectl apply -f {{ manifests }}/admin-access.yaml register: access changed_when: "'configured' in access.stdout or 'created' in access.stdout" - name: Token des ServiceAccounts lesen (Secret wird vom Controller befüllt) ansible.builtin.shell: > set -o pipefail; kubectl -n nex get secret nex-admin-token -o go-template='{{ "{{" }}.data.token{{ "}}" }}' | base64 -d args: {executable: /bin/bash} register: token until: token.stdout | length > 0 retries: 10 delay: 2 changed_when: false no_log: true - name: Token als Datei auf ops ablegen (600, nie ausgeben) ansible.builtin.copy: content: "{{ token.stdout }}" dest: "{{ token_file }}" mode: "0600" no_log: true - name: Registry-Zugang vorhanden? ansible.builtin.stat: path: "{{ registry_env }}" register: reg - name: Pull-Secret gitea-registry (aus {{ registry_env }}) ansible.builtin.shell: > set -o pipefail; set -a; . {{ registry_env }}; set +a; kubectl -n nex create secret docker-registry gitea-registry --docker-server=gitea.mindboost.team --docker-username="$REGISTRY_USER" --docker-password="$REGISTRY_TOKEN" --dry-run=client -o yaml | kubectl apply -f - args: {executable: /bin/bash} register: pull changed_when: "'configured' in pull.stdout or 'created' in pull.stdout" when: reg.stat.exists no_log: true - name: CA des Clusters (base64, eine Zeile) ansible.builtin.command: kubectl config view --raw --minify -o jsonpath='{.clusters[0].cluster.certificate-authority-data}' register: ca changed_when: false - name: Brücke prüfen (Pod im Namespace nex löst die Namen auf) ansible.builtin.shell: > kubectl -n nex run bridge-check --rm -i --restart=Never --image=alpine:3.20 -- sh -c 'for h in nex-router nex-know nex-access grp-mcp-intern; do getent hosts $h >/dev/null && echo "$h dns ok" || echo "$h dns FEHLT"; done' 2>/dev/null register: check changed_when: false - name: Ergebnis ansible.builtin.debug: msg: - "Token für nex-admin: {{ token_file }} (NEX_ADMIN_K8S_TOKEN)" - "NEX_ADMIN_K8S_URL={{ api_url }}" - "NEX_ADMIN_K8S_CA_B64={{ ca.stdout }}" - "Pull-Secret gitea-registry: {{ 'angelegt/aktuell' if reg.stat.exists else 'übersprungen (' + registry_env + ' fehlt)' }}" - "{{ check.stdout_lines }}"