185 lines
6.7 KiB
YAML
185 lines
6.7 KiB
YAML
---
|
|
# 2026-10-05 Hyperling
|
|
# Install a local LLM for use offline.
|
|
# - https://zeroclaw.net/blog/install-zeroclaw
|
|
# - https://zeroclaw.net/blog/set-up-zeroclaw-bot-ollama-telegram
|
|
#
|
|
# Packages Details
|
|
# - https://archlinux.org/packages/extra/x86_64/zeroclaw/
|
|
# - https://archlinux.org/packages/extra/x86_64/ollama/
|
|
#
|
|
# Individual Guides
|
|
# - https://github.com/zeroclaw-labs/zeroclaw
|
|
# - https://wiki.archlinux.org/title/Ollama
|
|
#
|
|
# Model Explanations
|
|
# - https://webscraft.org/blog/ollama-na-8-gb-ram-yaki-modeli-pratsyuyut-u-2026?lang=en
|
|
#
|
|
# Models
|
|
# - https://ollama.com/search
|
|
|
|
# Currently only testing this on Arch based distros (pacman).
|
|
- name: Workstation | Linux | Software | ZeroClaw
|
|
block:
|
|
|
|
- name: Workstation | Linux | Software | ZeroClaw | Facts 01
|
|
ansible.builtin.set_fact:
|
|
zeroclaw: zeroclaw
|
|
ollama: ollama
|
|
llm_installs:
|
|
- qwen3.5:4b
|
|
#- deepseek-r1:1.5b
|
|
#- deepseek-r1:7b
|
|
#- mistal:7b
|
|
#- ministral:3b
|
|
#- ministral:8b
|
|
#- mistal:7b
|
|
#- glm4-flash
|
|
#- qwen3.5:4b
|
|
- qwen3:4b # most similar to Ask Brave
|
|
llm_removals:
|
|
- qwen2.5
|
|
zerocode: zerocode
|
|
|
|
- name: Workstation | Linux | Software | ZeroClaw | Facts 02
|
|
ansible.builtin.set_fact:
|
|
ollama_runit_dir: "{{ runit_script_dir }}/{{ ollama }}"
|
|
ollama_runit_log_dest: "{{ global_log }}/{{ ollama }}"
|
|
zeroclaw_runit_dir: "{{ runit_script_dir }}/{{ zeroclaw }}"
|
|
zeroclaw_runit_log_dest: "{{ global_log }}/{{ zeroclaw }}"
|
|
|
|
- name: Workstation | Linux | Software | ZeroClaw | Facts 03
|
|
ansible.builtin.set_fact:
|
|
ollama_runit_start: "{{ ollama_runit_dir }}/{{ runit_service_script }}"
|
|
ollama_runit_log_dir: "{{ ollama_runit_dir }}/{{ runit_log_dir }}"
|
|
ollama_runit_log_config: "{{ ollama_runit_log_dest }}/{{ global_log_config }}"
|
|
zeroclaw_runit_start: "{{ zeroclaw_runit_dir }}/{{ runit_service_script }}"
|
|
zeroclaw_runit_log_dir: "{{ zeroclaw_runit_dir }}/{{ runit_log_dir }}"
|
|
zeroclaw_runit_log_config: "{{ zeroclaw_runit_log_dest }}/{{ global_log_config }}"
|
|
|
|
- name: Workstation | Linux | Software | ZeroClaw | Facts 04
|
|
ansible.builtin.set_fact:
|
|
ollama_runit_log_start: "{{ ollama_runit_log_dir }}/{{ runit_log_script }}"
|
|
zeroclaw_runit_log_start: "{{ zeroclaw_runit_log_dir }}/{{ runit_log_script }}"
|
|
|
|
- name: Workstation | Linux | Software | ZeroClaw | Install
|
|
ansible.builtin.package:
|
|
name:
|
|
- "{{ zeroclaw }}"
|
|
- "{{ ollama }}"
|
|
- "{{ zerocode }}"
|
|
state: present
|
|
|
|
- name: Workstation | Linux | Software | ZeroClaw | ollama | runit | Script
|
|
ansible.builtin.shell: "{{ item }}"
|
|
loop:
|
|
- "mkdir -p {{ ollama_runit_dir }}"
|
|
- "echo '#!/bin/sh -e' > {{ ollama_runit_start }}"
|
|
- "echo '# Allow pulling LLMs for use with ZeroClaw.' >> {{ ollama_runit_start }}"
|
|
- "echo 'exec 2>&1' >> {{ ollama_runit_start }}"
|
|
- "echo 'export HOME={{ user_user.home}}' >> {{ ollama_runit_start }}"
|
|
- "echo 'export OLLAMA_MAX_LOADED_MODELS=1' >> {{ ollama_runit_start }}"
|
|
- "echo 'exec chpst -u {{ user }} ollama serve' >> {{ ollama_runit_start }}"
|
|
- "chmod +x {{ ollama_runit_start }}"
|
|
register: shell_check
|
|
changed_when: shell_check.rc == 0
|
|
when: ansible_service_mgr == "runit"
|
|
|
|
- name: Workstation | Linux | Software | ZeroClaw | ollama | runit | Log | Script
|
|
ansible.builtin.shell: "{{ item }}"
|
|
loop:
|
|
- "mkdir -p {{ ollama_runit_log_dir }}"
|
|
- "echo '#!/bin/sh -e' > {{ ollama_runit_log_start }}"
|
|
- "echo 'exec svlogd -tt {{ ollama_runit_log_dest }}' >> {{ ollama_runit_log_start }}"
|
|
- "chmod +x {{ ollama_runit_log_start }}"
|
|
register: shell_check
|
|
changed_when: shell_check.rc == 0
|
|
when: ansible_service_mgr == "runit"
|
|
|
|
- name: Workstation | Linux | Software | ZeroClaw | ollama | runit | Log | Config
|
|
ansible.builtin.shell: "{{ item }}"
|
|
loop:
|
|
- "mkdir -p {{ ollama_runit_log_dest }}"
|
|
- "echo 's10000000 # rotate at 10 MB' > {{ ollama_runit_log_config }}"
|
|
- "echo 'n5 # keep 5 old files' >> {{ ollama_runit_log_config }}"
|
|
register: shell_check
|
|
changed_when: shell_check.rc == 0
|
|
when: ansible_service_mgr == "runit"
|
|
|
|
- name: Workstation | Linux | Software | ZeroClaw | ollama | Enable
|
|
ansible.builtin.service:
|
|
name: "{{ ollama }}"
|
|
state: started
|
|
enabled: true
|
|
|
|
- name: Workstation | Linux | Software | ZeroClaw | ollama | Wait
|
|
ansible.builtin.uri:
|
|
url: http://127.0.0.1:11434/api/version
|
|
status_code: 200
|
|
timeout: 5
|
|
register: health
|
|
until: health.status == 200
|
|
retries: 12
|
|
delay: 5
|
|
|
|
- name: Workstation | Linux | Software | ZeroClaw | ollama | Models | Install
|
|
ansible.builtin.shell: |
|
|
set -o pipefail
|
|
item='{{ item }}'
|
|
if ollama list | grep -q $item; then
|
|
echo "OKAY" &&
|
|
return
|
|
else
|
|
ollama pull $item 1>/dev/null &&
|
|
echo "INSTALLED" &&
|
|
return
|
|
fi
|
|
echo "FAILED"
|
|
loop: "{{ llm_installs }}"
|
|
register: shell_check
|
|
changed_when: "'INSTALLED' in shell_check.stdout"
|
|
failed_when: "'FAILED' in shell_check.stdout"
|
|
become: true
|
|
become_user: "{{ user }}"
|
|
|
|
- name: Workstation | Linux | Software | ZeroClaw | ollama | Models | Remove
|
|
ansible.builtin.shell: |
|
|
set -o pipefail
|
|
item='{{ item }}'
|
|
if ollama list | grep -q $item; then
|
|
ollama rm $item &&
|
|
echo "INSTALLED" &&
|
|
return
|
|
else
|
|
echo "OKAY" &&
|
|
return
|
|
fi
|
|
echo "FAILED"
|
|
loop: "{{ llm_removals }}"
|
|
register: shell_check
|
|
changed_when: "'INSTALLED' in shell_check.stdout"
|
|
failed_when: "'FAILED' in shell_check.stdout"
|
|
become: true
|
|
become_user: "{{ user }}"
|
|
|
|
- name: Workstation | Linux | Software | ZeroClaw | zeroclaw | Config
|
|
ansible.builtin.copy:
|
|
src: files/settings/zeroclaw.config.toml
|
|
dest: "{{ user_user.home }}/.zeroclaw/config.toml"
|
|
owner: "{{ user }}"
|
|
mode: "0644"
|
|
|
|
- name: Workstation | Linux | Software | ZeroClaw | zeroclaw | Test
|
|
ansible.builtin.debug:
|
|
msg: TBD
|
|
### zeroclaw agent -m "Hello!" # quick test
|
|
|
|
### Nah, run on command instead of as daemon, otherwise will eat power.
|
|
###- name: Workstation | Linux | Software | ZeroClaw | Init Scripts | zeroclaw
|
|
### ansible.builtin.debug:
|
|
### msg: TBD
|
|
###### `/run/runit/zeroclaw/run`
|
|
###### `zeroclaw daemon`
|
|
|
|
when: ansible_pkg_mgr == "pacman"
|