diff --git a/host_vars/ollama.universe.local.yml b/host_vars/ollama.universe.local.yml new file mode 100644 index 0000000..e69de29 diff --git a/hosts b/hosts index f59f60a..8a22676 100644 --- a/hosts +++ b/hosts @@ -51,6 +51,7 @@ jitsimeet mailserver mastodon nameserver +ollama printspooler proxmoxserver proxyserver @@ -135,6 +136,9 @@ ns1.universe.local unbound01.universe.local unbound02.universe.local +[ollama] +ollama.universe.local + [omada_controller] omada.universe.local omada-stdby.universe.local diff --git a/local.yml b/local.yml index ffca747..f617c6d 100644 --- a/local.yml +++ b/local.yml @@ -204,6 +204,14 @@ roles: - omada-controller +- hosts: ollama + tags: server,ollama + become: true + handlers: + - ansible.builtin.import_tasks: global_handlers/global_handlers.yml + roles: + - ollama + - hosts: backup tags: server,backup become: true diff --git a/roles/ollama/README.md b/roles/ollama/README.md new file mode 100644 index 0000000..30c9dca --- /dev/null +++ b/roles/ollama/README.md @@ -0,0 +1,59 @@ +# Ansible Role: ollama + +Diese Rolle richtet einen Debian-Host vollständig als Ollama-Server ein. + +Sie installiert Ollama über das offizielle Installationsskript, aktiviert den systemd-Dienst `ollama` und erzeugt einen systemd-Override, damit der Server auf allen Interfaces lauscht (`OLLAMA_HOST=0.0.0.0:11434`). Anschließend werden die über die Variable `ollama_models` definierten Modelle automatisch heruntergeladen – jeweils nur, wenn sie noch nicht vorhanden sind. + +Eine Firewall-Konfiguration wird bewusst nicht vorgenommen. + +## Anforderungen + +Diese Rolle wurde für Debian-basierte Systeme entwickelt und getestet (Debian, Ubuntu – insbesondere LXC-Container). + +Das offizielle Installationsskript lädt die neueste Ollama-Version von `https://ollama.com/install.sh` und benötigt dafür `curl`. Dieses wird vom Skript bei Bedarf selbst mit installiert. + +## Rollenvariablen + +Die folgenden Variablen können angepasst werden, um das Verhalten der Rolle zu steuern. Die Standardwerte sind in `defaults/main.yml` definiert. + +| Variable | Standardwert | Beschreibung | +|---|---|---| +| `ollama_host` | `"0.0.0.0:11434"` | Host/Port, auf dem der Ollama-Server lauschen soll. `0.0.0.0` bedeutet alle Interfaces. | +| `ollama_install_script_url` | `"https://ollama.com/install.sh"` | URL des offiziellen Ollama-Installationsskripts. | +| `ollama_models` | `["qwen3:8b"]` | Liste der Modelle, die automatisch heruntergeladen werden. | + +## Abhängigkeiten + +Diese Rolle hat keine Abhängigkeiten von anderen Ansible-Rollen. + +## Beispiel-Playbook + +So können Sie die Rolle in Ihr Playbook integrieren: + +```yaml +- hosts: ollama + become: true + roles: + - ollama +``` + +Um weitere Modelle herunterzuladen, überschreiben Sie die Variable im Playbook oder in den `host_vars`: + +```yaml +- hosts: ollama + become: true + vars: + ollama_models: + - qwen3:8b + - llama3.1:8b + roles: + - ollama +``` + +## Lizenz + +MIT + +## Autor + +Ihr Name diff --git a/roles/ollama/defaults/main.yml b/roles/ollama/defaults/main.yml new file mode 100644 index 0000000..828b6f3 --- /dev/null +++ b/roles/ollama/defaults/main.yml @@ -0,0 +1,13 @@ +--- +# defaults file for roles/ollama + +# Host/Port, auf dem der Ollama-Server lauschen soll. +# 0.0.0.0:11434 => alle Interfaces. +ollama_host: "0.0.0.0:11434" + +# URL des offiziellen Ollama-Installationsskripts. +ollama_install_script_url: "https://ollama.com/install.sh" + +# Liste der Modelle, die automatisch heruntergeladen werden. +ollama_models: + - qwen3:8b diff --git a/roles/ollama/handlers/main.yml b/roles/ollama/handlers/main.yml new file mode 100644 index 0000000..04ab023 --- /dev/null +++ b/roles/ollama/handlers/main.yml @@ -0,0 +1,8 @@ +--- +# handlers file for roles/ollama + +- name: Reload systemd and restart Ollama + ansible.builtin.systemd: + name: ollama + state: restarted + daemon_reload: yes diff --git a/roles/ollama/tasks/configure.yml b/roles/ollama/tasks/configure.yml new file mode 100644 index 0000000..b958fa1 --- /dev/null +++ b/roles/ollama/tasks/configure.yml @@ -0,0 +1,20 @@ +--- +# tasks file for roles/ollama +# systemd-Override, damit Ollama auf allen Interfaces lauscht (OLLAMA_HOST). +- name: ollama | configure | create systemd override directory + tags: ollama,configure + ansible.builtin.file: + path: /etc/systemd/system/ollama.service.d + state: directory + mode: '0755' + +- name: ollama | configure | set OLLAMA_HOST via systemd override + tags: ollama,configure + ansible.builtin.template: + src: ollama-override.conf.j2 + dest: /etc/systemd/system/ollama.service.d/override.conf + mode: '0644' + # Der Handler lädt systemd neu und startet den Dienst nur bei Änderungen neu. + notify: Reload systemd and restart Ollama + +# Hinweis: Eine Firewall-Konfiguration (z.B. ufw) wird bewusst NICHT vorgenommen. diff --git a/roles/ollama/tasks/install.yml b/roles/ollama/tasks/install.yml new file mode 100644 index 0000000..2db32eb --- /dev/null +++ b/roles/ollama/tasks/install.yml @@ -0,0 +1,17 @@ +--- +# tasks file for roles/ollama +# Installation von Ollama über das offizielle Installationsskript. +- name: ollama | install | download official install script + tags: ollama,install + ansible.builtin.get_url: + url: "{{ ollama_install_script_url }}" + dest: "/tmp/ollama-install.sh" + mode: "0755" + +- name: ollama | install | run official install script + tags: ollama,install + # Das Skript installiert das Binary nach /usr/local/bin/ollama. + # 'creates' sorgt für Idempotenz: Bei vorhandenem Binary wird die Ausführung übersprungen. + ansible.builtin.shell: + cmd: "/tmp/ollama-install.sh" + creates: /usr/local/bin/ollama diff --git a/roles/ollama/tasks/main.yml b/roles/ollama/tasks/main.yml new file mode 100644 index 0000000..a6e8dd7 --- /dev/null +++ b/roles/ollama/tasks/main.yml @@ -0,0 +1,12 @@ +--- +# Load distro specific variables +- ansible.builtin.include_vars: "{{ ansible_facts['distribution'] | lower }}.yml" + tags: always + ignore_errors: True +- ansible.builtin.include_vars: "{{ ansible_facts['fqdn'] | lower }}.yml" + ignore_errors: True + +- ansible.builtin.import_tasks: install.yml +- ansible.builtin.import_tasks: configure.yml +- ansible.builtin.import_tasks: service.yml +- ansible.builtin.import_tasks: models.yml diff --git a/roles/ollama/tasks/models.yml b/roles/ollama/tasks/models.yml new file mode 100644 index 0000000..f1d37e4 --- /dev/null +++ b/roles/ollama/tasks/models.yml @@ -0,0 +1,20 @@ +--- +# tasks file for roles/ollama +# Modellverwaltung: Es werden nur Modelle heruntergeladen, die noch nicht vorhanden sind. +- name: ollama | models | list installed models + tags: ollama,models + ansible.builtin.command: ollama list + register: ollama_installed_models + changed_when: false + # Kurzes Warten auf den frisch gestarteten Daemon beim Erstlauf (Retry-Muster wie omada-controller). + retries: 5 + until: ollama_installed_models is success + delay: 2 + +- name: ollama | models | pull missing models + tags: ollama,models + ansible.builtin.command: ollama pull {{ item }} + loop: "{{ ollama_models }}" + # 'ollama list' führt die Modellnamen in der ersten Spalte auf; ein bereits + # vorhandenes Modell wird nicht erneut heruntergeladen. + when: item not in ollama_installed_models.stdout diff --git a/roles/ollama/tasks/service.yml b/roles/ollama/tasks/service.yml new file mode 100644 index 0000000..f009728 --- /dev/null +++ b/roles/ollama/tasks/service.yml @@ -0,0 +1,8 @@ +--- +# tasks file for roles/ollama +- name: ollama | service | enable and start Ollama + tags: ollama,service + ansible.builtin.service: + name: ollama + state: started + enabled: true diff --git a/roles/ollama/templates/ollama-override.conf.j2 b/roles/ollama/templates/ollama-override.conf.j2 new file mode 100644 index 0000000..a2c8e27 --- /dev/null +++ b/roles/ollama/templates/ollama-override.conf.j2 @@ -0,0 +1,2 @@ +[Service] +Environment="OLLAMA_HOST={{ ollama_host }}"