diff --git a/ansible/inventory/group_vars/desktop.yml b/ansible/inventory/group_vars/desktop.yml index db2aab2..e0ba06b 100644 --- a/ansible/inventory/group_vars/desktop.yml +++ b/ansible/inventory/group_vars/desktop.yml @@ -139,6 +139,13 @@ desktop_source_tools: install_name: bookokrat build_output_path: target/release/bookokrat +desktop_binary_tools: + - name: ollama + install_name: ollama + repo: https://github.com/ollama/ollama + asset_arch: amd64 + install_mode: tree + desktop_npm_packages: - name: "opencode-ai" state: latest diff --git a/ansible/roles/profile_desktop_common/tasks/binary_tool.yml b/ansible/roles/profile_desktop_common/tasks/binary_tool.yml new file mode 100644 index 0000000..7587f13 --- /dev/null +++ b/ansible/roles/profile_desktop_common/tasks/binary_tool.yml @@ -0,0 +1,67 @@ +--- +- name: Check installed {{ binary_tool.name }} binary + ansible.builtin.stat: + path: "/usr/local/bin/{{ binary_tool.install_name | default(binary_tool.name) }}" + register: binary_installed + +- name: Get current {{ binary_tool.name }} version + ansible.builtin.command: + cmd: "/usr/local/bin/{{ binary_tool.install_name | default(binary_tool.name) }} --version" + register: binary_current_version + changed_when: false + failed_when: false + +- name: Set effective version for {{ binary_tool.name }} + ansible.builtin.set_fact: + binary_tool_version: >- + {{ + ollama_version + if binary_tool.name == 'ollama' + else binary_tool.version | default('') + }} + binary_tool_asset_name: >- + {{ + ollama_asset_name.name + if binary_tool.name == 'ollama' + else binary_tool.asset_name + }} + +- name: Ensure extraction directory exists for {{ binary_tool.name }} + ansible.builtin.file: + path: "{{ desktop_tools_tmp_dir }}/{{ binary_tool.name }}" + state: directory + mode: "0755" + when: binary_tool.install_mode | default('binary') != 'tree' + +- name: Extract {{ binary_tool.name }} archive + ansible.builtin.unarchive: + src: "{{ desktop_tools_tmp_dir }}/{{ binary_tool_asset_name }}" + dest: "{{ desktop_tools_tmp_dir }}/{{ binary_tool.name }}" + remote_src: true + creates: "{{ desktop_tools_tmp_dir }}/{{ binary_tool.name }}/{{ binary_tool.install_name | default(binary_tool.name) }}" + when: + - binary_tool.install_mode | default('binary') != 'tree' + - binary_current_version.rc != 0 or binary_current_version.stdout_lines[0] != binary_tool_version + +- name: Install {{ binary_tool.name }} archive tree + ansible.builtin.unarchive: + src: "{{ desktop_tools_tmp_dir }}/{{ binary_tool_asset_name }}" + dest: /usr/local + remote_src: true + become: true + when: + - binary_tool.install_mode | default('binary') == 'tree' + - binary_current_version.rc != 0 or binary_current_version.stdout_lines[0] != binary_tool_version + +- name: Install {{ binary_tool.name }} binary + ansible.builtin.copy: + src: "{{ desktop_tools_tmp_dir }}/{{ binary_tool.name }}/{{ binary_tool.install_name | default(binary_tool.name) }}" + dest: "/usr/local/bin/{{ binary_tool.install_name | default(binary_tool.name) }}" + remote_src: true + owner: root + group: root + mode: "0755" + become: true + when: + - binary_tool.install_mode | default('binary') != 'tree' + - binary_current_version.rc != 0 or binary_current_version.stdout_lines[0] != binary_tool_version diff --git a/ansible/roles/profile_desktop_common/tasks/main.yml b/ansible/roles/profile_desktop_common/tasks/main.yml index 0deaac4..e1af3e0 100644 --- a/ansible/roles/profile_desktop_common/tasks/main.yml +++ b/ansible/roles/profile_desktop_common/tasks/main.yml @@ -444,6 +444,74 @@ loop_var: source_tool label: "{{ source_tool.name }}" +- name: Set desktop tools tmp directory + tags: [packages] + ansible.builtin.set_fact: + desktop_tools_tmp_dir: /tmp/desktop-tools + +- name: Set ollama tool config from list + tags: [packages] + ansible.builtin.set_fact: + desktop_ollama_tool: >- + {{ + desktop_binary_tools + | selectattr('name', 'equalto', 'ollama') + | first + | default({}) + }} + when: "'ollama' in (desktop_binary_tools | map(attribute='name') | list)" + +- name: Fetch latest ollama release metadata + tags: [packages] + ansible.builtin.uri: + url: https://api.github.com/repos/ollama/ollama/releases/latest + headers: + Accept: application/vnd.github+json + return_content: true + register: ollama_latest_release + changed_when: false + when: "'ollama' in (desktop_binary_tools | map(attribute='name') | list)" + +- name: Set ollama release metadata + tags: [packages] + ansible.builtin.set_fact: + ollama_version: "{{ ollama_latest_release.json.tag_name | regex_replace('^v') }}" + ollama_asset_name: >- + {{ + ollama_latest_release.json.assets + | selectattr('name', 'equalto', 'ollama-linux-' ~ desktop_ollama_tool.asset_arch ~ '.tar.zst') + | first + | default({}) + }} + when: "'ollama' in (desktop_binary_tools | map(attribute='name') | list)" + +- name: Ensure temporary directory exists for desktop binary tools + tags: [packages] + ansible.builtin.file: + path: "{{ desktop_tools_tmp_dir }}" + state: directory + mode: "0755" + +- name: Fetch latest ollama release archive + tags: [packages] + ansible.builtin.get_url: + url: "https://github.com/ollama/ollama/releases/download/v{{ ollama_version }}/{{ ollama_asset_name.name }}" + dest: "{{ desktop_tools_tmp_dir }}/{{ ollama_asset_name.name }}" + mode: "0644" + when: "'ollama' in (desktop_binary_tools | map(attribute='name') | list)" + +- name: Install desktop binary tools + tags: [packages] + ansible.builtin.include_tasks: + file: binary_tool.yml + apply: + tags: [packages] + loop: "{{ desktop_binary_tools }}" + when: desktop_binary_tools | length > 0 + loop_control: + loop_var: binary_tool + label: "{{ binary_tool.name }}" + - name: Install desktop npm packages tags: [packages] community.general.npm: diff --git a/dotfiles/desktop/.config/service/ollama/run b/dotfiles/desktop/.config/service/ollama/run new file mode 100755 index 0000000..51d5f01 --- /dev/null +++ b/dotfiles/desktop/.config/service/ollama/run @@ -0,0 +1,9 @@ +#!/bin/sh + +set -eu + +if [ -n "${TURNSTILE_ENV_DIR:-}" ]; then + exec chpst -e "$TURNSTILE_ENV_DIR" /usr/local/bin/ollama serve +fi + +exec /usr/local/bin/ollama serve