| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- ---
- # =============================================================================
- # AI Platform — Full Deployment
- # =============================================================================
- # Runs every role in dependency order, from pre-flight through DNS.
- #
- # Usage:
- # ansible-playbook deploy_ai.yml -K # full deploy (-K prompts for sudo password)
- # ansible-playbook deploy_ai.yml -K --tags vault # Vault only
- # ansible-playbook deploy_ai.yml -K --skip-tags benchmark # skip benchmarking
- # ansible-playbook deploy_ai.yml -K -e "slot4_model=deepseek-r1:14b"
- # =============================================================================
- # ── 1. Pre-flight — verify all hosts are reachable and healthy ────────────────
- - name: "Pre-flight checks"
- ansible.builtin.import_playbook: playbooks/00_preflight.yml
- # ── 2. Vault — deploy HashiCorp Vault, init, unseal, populate secrets ─────────
- - name: "HashiCorp Vault"
- ansible.builtin.import_playbook: playbooks/01_vault.yml
- # ── 3. Infrastructure — Docker CE + Ollama on ai_server ──────────────────────
- - name: "Infrastructure (Docker + Ollama)"
- ansible.builtin.import_playbook: playbooks/02_infrastructure.yml
- # ── 4. Benchmark — score all installed models, select 4 warm-up slots ─────────
- - name: "Model benchmarking"
- ansible.builtin.import_playbook: playbooks/03_benchmark.yml
- # ── 5. Models — pull slot models, create Modelfiles, start warm-up service ────
- - name: "Model slots and warm-up"
- ansible.builtin.import_playbook: playbooks/04_models.yml
- # ── 6. Keycloak — deploy Keycloak, create realm and client ────────────────────
- - name: "Keycloak SSO"
- ansible.builtin.import_playbook: playbooks/05_keycloak.yml
- # ── 7. Qdrant — deploy vector database for RAG ───────────────────────────────
- - name: "Qdrant vector database"
- ansible.builtin.import_playbook: playbooks/06_qdrant.yml
- # ── 8. Open WebUI — deploy with Ollama + Qdrant + Keycloak OIDC ──────────────
- - name: "Open WebUI"
- ansible.builtin.import_playbook: playbooks/07_openwebui.yml
- # ── 9. OpenClaw — deploy Telegram bot (skipped if no token provided) ──────────
- - name: "OpenClaw Telegram bot"
- ansible.builtin.import_playbook: playbooks/08_openclaw.yml
- # ── 10. NGINX — deploy reverse-proxy configs ─────────────────────────────────
- - name: "NGINX reverse proxy"
- ansible.builtin.import_playbook: playbooks/09_nginx.yml
- # ── 11. CoreDNS — add vault + ollama-api DNS records ─────────────────────────
- - name: "CoreDNS records"
- ansible.builtin.import_playbook: playbooks/10_coredns.yml
- # ── 12. Vault OIDC — configure Keycloak as Vault login provider ───────────────
- - name: "Vault OIDC"
- ansible.builtin.import_playbook: playbooks/11_vault_oidc.yml
- # ── 13. Summary — print all service URLs and credentials ─────────────────────
- - name: "Deployment summary"
- hosts: localhost
- connection: local
- gather_facts: false
- tags:
- - summary
- vars:
- _token_file: "{{ playbook_dir }}/vault/.vault-token"
- _vault_url: "http://{{ ai_server_ip }}:{{ vault_port }}"
- tasks:
- - name: "Summary | Load credentials from Vault"
- ansible.builtin.set_fact:
- _kc_admin_pass: "{{ lookup('community.hashi_vault.hashi_vault', vault_secret_prefix ~ '/keycloak:admin_password token=' ~ lookup('ansible.builtin.file', _token_file) ~ ' url=' ~ _vault_url) }}"
- _kc_realm_admin_pass: "{{ lookup('community.hashi_vault.hashi_vault', vault_secret_prefix ~ '/keycloak:realm_admin_password token=' ~ lookup('ansible.builtin.file', _token_file) ~ ' url=' ~ _vault_url) }}"
- _ollama_api_key: "{{ lookup('community.hashi_vault.hashi_vault', vault_secret_prefix ~ '/ollama:api_key token=' ~ lookup('ansible.builtin.file', _token_file) ~ ' url=' ~ _vault_url) }}"
- - name: "Summary | Display deployment results"
- ansible.builtin.debug:
- msg: |
- ╔══════════════════════════════════════════════════════╗
- ║ {{ platform_name }} — Deployment Complete
- ╠══════════════════════════════════════════════════════╣
- ║ Open WebUI: {{ openwebui_url }}
- ║ Keycloak Admin: {{ keycloak_url }}
- ║ Vault UI: {{ vault_api_addr }}
- ║ Ollama API: {{ ollama_api_url }}
- ╠══════════════════════════════════════════════════════╣
- ║ Keycloak admin user: admin ║
- ║ Keycloak admin pass: {{ _kc_admin_pass }}
- ║ Realm admin user: {{ keycloak_realm_admin_user }}
- ║ Realm admin pass: {{ _kc_realm_admin_pass }}
- ║ Ollama API Key: {{ _ollama_api_key }}
- ╠══════════════════════════════════════════════════════╣
- ║ Vault init file: vault/.vault-init.json ║
- ║ KEEP THIS FILE SAFE — NOT IN GIT ║
- ╚══════════════════════════════════════════════════════╝
|