feat: add Ollama role with installation, configuration, and service exposure for K3s cluster

This commit is contained in:
Nik Afiq 2026-04-21 16:43:44 +09:00
parent 2bccbc14ef
commit 7d2fde96ae
7 changed files with 133 additions and 0 deletions

View File

@ -22,3 +22,4 @@ all:
hosts:
mac-mini:
ansible_host: 192.168.7.96
ansible_python_interpreter: /usr/bin/python3

View File

@ -0,0 +1,9 @@
---
# Run: ansible-playbook ansible/playbooks/setup-ollama.yaml -i ansible/inventory.yaml --ask-become-pass
# Description: Installs Ollama on the Mac Mini, configures it as a launchd daemon listening on all interfaces, and pulls the configured models.
- name: Setup Ollama on Mac Mini
hosts: mac_mini
gather_facts: true
roles:
- ollama

View File

@ -0,0 +1,9 @@
---
# Part of role: ollama
# Called by: ansible/playbooks/setup-ollama.yaml
# Description: Default variables for the ollama role. Add models to ollama_models to have them pulled automatically.
ollama_host: "0.0.0.0"
ollama_port: 11434
ollama_models:
- qwen3:4b

View File

@ -0,0 +1,8 @@
---
# Part of role: ollama
# Called by: ansible/playbooks/setup-ollama.yaml
# Description: Handlers for the ollama role. Restarts the ollama launchd daemon when the plist changes.
- name: restart ollama
become: true
command: launchctl kickstart -k system/com.ollama.ollama

View File

@ -0,0 +1,41 @@
---
# Part of role: ollama
# Called by: ansible/playbooks/setup-ollama.yaml
# Description: Installs Ollama via Homebrew, deploys the launchd plist so it starts on boot bound to all interfaces, and pulls configured models.
- name: Install ollama via Homebrew
community.general.homebrew:
name: ollama
state: present
- name: Deploy ollama launchd plist
template:
src: ollama.plist.j2
dest: /Library/LaunchDaemons/com.ollama.ollama.plist
owner: root
group: wheel
mode: "0644"
become: true
notify: restart ollama
- name: Load ollama launchd service
become: true
command: launchctl load -w /Library/LaunchDaemons/com.ollama.ollama.plist
args:
creates: /var/run/ollama.pid
ignore_errors: true
- name: Wait for ollama to be ready
uri:
url: "http://localhost:{{ ollama_port }}"
status_code: 200
register: result
until: result.status == 200
retries: 10
delay: 3
- name: Pull ollama models
command: /opt/homebrew/bin/ollama pull {{ item }}
loop: "{{ ollama_models }}"
environment:
OLLAMA_HOST: "http://localhost:{{ ollama_port }}"

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Part of role: ollama -->
<!-- Called by: ansible/roles/ollama/tasks/main.yaml -->
<!-- Description: launchd daemon plist for Ollama on macOS. Binds to all interfaces so the K3s cluster can reach it via manifests/core/ollama-external.yaml. -->
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.ollama.ollama</string>
<key>ProgramArguments</key>
<array>
<string>/opt/homebrew/bin/ollama</string>
<string>serve</string>
</array>
<key>EnvironmentVariables</key>
<dict>
<key>OLLAMA_HOST</key>
<string>{{ ollama_host }}:{{ ollama_port }}</string>
<key>HOME</key>
<string>/var/root</string>
</dict>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/var/log/ollama.log</string>
<key>StandardErrorPath</key>
<string>/var/log/ollama.error.log</string>
</dict>
</plist>

View File

@ -0,0 +1,28 @@
---
# Apply: kubectl apply -f manifests/core/ollama-external.yaml
# Delete: kubectl delete -f manifests/core/ollama-external.yaml
# Description: Exposes the Mac Mini's Ollama instance to the K3s cluster via a headless Service + Endpoints pair.
# Allows any pod to reach Ollama at http://ollama.default.svc.cluster.local:11434
apiVersion: v1
kind: Endpoints
metadata:
name: ollama
namespace: default
subsets:
- addresses:
- ip: 192.168.7.96
ports:
- port: 11434
---
apiVersion: v1
kind: Service
metadata:
name: ollama
namespace: default
spec:
ports:
- name: http
port: 11434
targetPort: 11434
clusterIP: None