--- # 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 - name: Workstation | Linux | Software | ZeroClaw | Facts 02 ansible.builtin.set_fact: ollama_runit_dir: "{{ runit_service_dir }}/{{ ollama }}" zeroclaw_runit_dir: "{{ runit_service_dir }}/{{ zeroclaw }}" - name: Workstation | Linux | Software | ZeroClaw | Facts 03 ansible.builtin.set_fact: ollama_runit_start: "{{ ollama_runit_dir }}/{{ runit_service_script }}" zeroclaw_runit_start: "{{ zeroclaw_runit_dir }}{{ runit_service_script }}n" ### TBD/TODO: Add to Env! (bash_profile, zprofile) ### OLLAMA_MAX_LOADED_MODELS=1 - name: Workstation | Linux | Software | ZeroClaw | Install ansible.builtin.package: name: - "{{ zeroclaw }}" - "{{ ollama }}" state: present #- name: Workstation | Linux | Software | ZeroClaw | ollama | Script [runit] # ansible.builtin.shell: "{{ item }}" # loop: # - "mkdir -p {{ ollama_runit_dir }}" # - "echo '#!/bin/sh' > {{ ollama_runit_start }}" # - "echo 'ollama serve' >> {{ ollama_runit_start }}" # - "chmod +x {{ ollama_runit_start }}" # register: shell_check # changed_when: shell_check.rc == 0 # when: ansible_service_mgr == "runit" ## This is safe to run without wasting too many resources, allows pulling. #- name: Workstation | Linux | Software | ZeroClaw | ollama | Enable # ansible.builtin.service: # name: "{{ ollama }}" # state: started # enabled: true - name: Workstation | Linux | Software | ZeroClaw | ollama | Enable ansible.builtin.blockinfile: path: "{{ user_user.home }}/.config/i3/config" marker: "# {mark} MANAGED BY ANSIBLE | zeroclaw" block: | exec_always --no-startup-id pgrep -x ollama || ollama serve >~/Reports/{{ ansible_hostname }}.ollama.log 2>&1 state: present - name: Workstation | Linux | Software | ZeroClaw | Models | Install ansible.builtin.shell: | set -o pipefail item='{{ item }}' if ollama list | grep -q $item; then echo "OKAY" && return else ollama pull $item && 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 | 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 | Config ansible.builtin.debug: msg: TBD ### ~/.zeroclaw/config.toml` ### `default_provider = "ollama"` pointing at `http://127.0.0.1:11434` - name: Workstation | Linux | Software | 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"