deploy_ai.yml 5.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. ---
  2. # =============================================================================
  3. # AI Platform — Full Deployment
  4. # =============================================================================
  5. # Runs every role in dependency order, from pre-flight through DNS.
  6. #
  7. # Usage:
  8. # ansible-playbook deploy_ai.yml -K # full deploy (-K prompts for sudo password)
  9. # ansible-playbook deploy_ai.yml -K --tags vault # Vault only
  10. # ansible-playbook deploy_ai.yml -K --skip-tags benchmark # skip benchmarking
  11. # ansible-playbook deploy_ai.yml -K -e "slot4_model=deepseek-r1:14b"
  12. # =============================================================================
  13. # ── 1. Pre-flight — verify all hosts are reachable and healthy ────────────────
  14. - name: "Pre-flight checks"
  15. ansible.builtin.import_playbook: playbooks/00_preflight.yml
  16. # ── 2. Vault — deploy HashiCorp Vault, init, unseal, populate secrets ─────────
  17. - name: "HashiCorp Vault"
  18. ansible.builtin.import_playbook: playbooks/01_vault.yml
  19. # ── 3. Infrastructure — Docker CE + Ollama on ai_server ──────────────────────
  20. - name: "Infrastructure (Docker + Ollama)"
  21. ansible.builtin.import_playbook: playbooks/02_infrastructure.yml
  22. # ── 4. Benchmark — score all installed models, select 4 warm-up slots ─────────
  23. - name: "Model benchmarking"
  24. ansible.builtin.import_playbook: playbooks/03_benchmark.yml
  25. # ── 5. Models — pull slot models, create Modelfiles, start warm-up service ────
  26. - name: "Model slots and warm-up"
  27. ansible.builtin.import_playbook: playbooks/04_models.yml
  28. # ── 6. Keycloak — deploy Keycloak, create realm and client ────────────────────
  29. - name: "Keycloak SSO"
  30. ansible.builtin.import_playbook: playbooks/05_keycloak.yml
  31. # ── 7. Qdrant — deploy vector database for RAG ───────────────────────────────
  32. - name: "Qdrant vector database"
  33. ansible.builtin.import_playbook: playbooks/06_qdrant.yml
  34. # ── 8. Open WebUI — deploy with Ollama + Qdrant + Keycloak OIDC ──────────────
  35. - name: "Open WebUI"
  36. ansible.builtin.import_playbook: playbooks/07_openwebui.yml
  37. # ── 9. OpenClaw — deploy Telegram bot (skipped if no token provided) ──────────
  38. - name: "OpenClaw Telegram bot"
  39. ansible.builtin.import_playbook: playbooks/08_openclaw.yml
  40. # ── 10. NGINX — deploy reverse-proxy configs ─────────────────────────────────
  41. - name: "NGINX reverse proxy"
  42. ansible.builtin.import_playbook: playbooks/09_nginx.yml
  43. # ── 11. CoreDNS — add vault + ollama-api DNS records ─────────────────────────
  44. - name: "CoreDNS records"
  45. ansible.builtin.import_playbook: playbooks/10_coredns.yml
  46. # ── 12. Vault OIDC — configure Keycloak as Vault login provider ───────────────
  47. - name: "Vault OIDC"
  48. ansible.builtin.import_playbook: playbooks/11_vault_oidc.yml
  49. # ── 13. Summary — print all service URLs and credentials ─────────────────────
  50. - name: "Deployment summary"
  51. hosts: localhost
  52. connection: local
  53. gather_facts: false
  54. tags:
  55. - summary
  56. vars:
  57. _token_file: "{{ playbook_dir }}/vault/.vault-token"
  58. _vault_url: "http://{{ ai_server_ip }}:{{ vault_port }}"
  59. tasks:
  60. - name: "Summary | Load credentials from Vault"
  61. ansible.builtin.set_fact:
  62. _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) }}"
  63. _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) }}"
  64. _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) }}"
  65. - name: "Summary | Display deployment results"
  66. ansible.builtin.debug:
  67. msg: |
  68. ╔══════════════════════════════════════════════════════╗
  69. ║ {{ platform_name }} — Deployment Complete
  70. ╠══════════════════════════════════════════════════════╣
  71. ║ Open WebUI: {{ openwebui_url }}
  72. ║ Keycloak Admin: {{ keycloak_url }}
  73. ║ Vault UI: {{ vault_api_addr }}
  74. ║ Ollama API: {{ ollama_api_url }}
  75. ╠══════════════════════════════════════════════════════╣
  76. ║ Keycloak admin user: admin ║
  77. ║ Keycloak admin pass: {{ _kc_admin_pass }}
  78. ║ Realm admin user: {{ keycloak_realm_admin_user }}
  79. ║ Realm admin pass: {{ _kc_realm_admin_pass }}
  80. ║ Ollama API Key: {{ _ollama_api_key }}
  81. ╠══════════════════════════════════════════════════════╣
  82. ║ Vault init file: vault/.vault-init.json ║
  83. ║ KEEP THIS FILE SAFE — NOT IN GIT ║
  84. ╚══════════════════════════════════════════════════════╝