Files
a13labs.infra/ansible/roles/linux_dev_station/tasks/tool_packages.yml
T
alexandre.pires 59b2c10c43 Add Linux development station role with systemd services for code-server and OpenCode
- Implemented handlers for restarting code-server and OpenCode services.
- Created main tasks for setting up a Linux development station, including user management, package installation, and configuration.
- Added validation for OpenCode server credentials and code-server password.
- Introduced tool package management for npm, uv, and go installers.
- Developed templates for systemd service units for code-server and OpenCode.
- Included scripts for starting code-server and OpenCode with SSH agent support.
- Updated inventory and Terraform configuration to include new development host.
2026-07-10 15:44:18 +02:00

269 lines
11 KiB
YAML

---
- name: Ensure tool packages list is valid
ansible.builtin.assert:
that:
- linux_dev_station_tool_packages is iterable
fail_msg: "linux_dev_station_tool_packages must be a list of tool definitions."
- name: Download uv installer
become: true
ansible.builtin.get_url:
url: https://astral.sh/uv/install.sh
dest: "{{ linux_dev_station_service_home }}/.cache/uv-install.sh"
owner: "{{ linux_dev_station_service_user }}"
group: "{{ linux_dev_station_service_user }}"
mode: "0755"
when:
- linux_dev_station_service_user_enabled | bool
- linux_dev_station_tool_packages | selectattr('name', 'equalto', 'uv') | list | length > 0
- name: Install uv
become: true
become_user: "{{ linux_dev_station_service_user }}"
ansible.builtin.command: >-
/bin/sh {{ linux_dev_station_service_home }}/.cache/uv-install.sh
args:
creates: "{{ linux_dev_station_service_home }}/.local/bin/uv"
environment:
HOME: "{{ linux_dev_station_service_home }}"
USER: "{{ linux_dev_station_service_user }}"
PATH: "{{ linux_dev_station_path }}"
UV_UNINSTALL_MISSING_PACKAGES: "1"
when:
- linux_dev_station_service_user_enabled | bool
- linux_dev_station_tool_packages | selectattr('name', 'equalto', 'uv') | list | length > 0
- name: Download rustup installer
become: true
ansible.builtin.get_url:
url: https://sh.rustup.rs
dest: "{{ linux_dev_station_service_home }}/.cache/rustup-install.sh"
owner: "{{ linux_dev_station_service_user }}"
group: "{{ linux_dev_station_service_user }}"
mode: "0755"
when:
- linux_dev_station_service_user_enabled | bool
- linux_dev_station_tool_packages | selectattr('name', 'equalto', 'rust') | list | length > 0
- name: Install rustup
become: true
become_user: "{{ linux_dev_station_service_user }}"
ansible.builtin.command: >-
/bin/sh {{ linux_dev_station_service_home }}/.cache/rustup-install.sh -y --default-toolchain stable
args:
creates: "{{ linux_dev_station_service_home }}/.cargo/bin/rustc"
environment:
HOME: "{{ linux_dev_station_service_home }}"
USER: "{{ linux_dev_station_service_user }}"
PATH: "{{ linux_dev_station_path }}:{{ linux_dev_station_service_home }}/.cargo/bin"
when:
- linux_dev_station_service_user_enabled | bool
- linux_dev_station_tool_packages | selectattr('name', 'equalto', 'rust') | list | length > 0
- name: Download fnm (Fast Node Manager) binary
become: true
ansible.builtin.get_url:
url: "https://github.com/Schniz/fnm/releases/download/{{ fnm_version }}/fnm-linux.zip"
dest: "{{ linux_dev_station_service_home }}/.cache/fnm.zip"
owner: "{{ linux_dev_station_service_user }}"
group: "{{ linux_dev_station_service_user }}"
mode: "0644"
vars:
fnm_version: v1.38.1
when:
- linux_dev_station_service_user_enabled | bool
- linux_dev_station_tool_packages | selectattr('name', 'equalto', 'node') | list | length > 0
- name: Create .fnm directory
become: true
become_user: "{{ linux_dev_station_service_user }}"
ansible.builtin.file:
path: "{{ linux_dev_station_service_home }}/.fnm"
state: directory
owner: "{{ linux_dev_station_service_user }}"
group: "{{ linux_dev_station_service_user }}"
mode: "0755"
when:
- linux_dev_station_service_user_enabled | bool
- linux_dev_station_tool_packages | selectattr('name', 'equalto', 'node') | list | length > 0
- name: Extract fnm to .fnm directory
become: true
become_user: "{{ linux_dev_station_service_user }}"
ansible.builtin.unarchive:
src: "{{ linux_dev_station_service_home }}/.cache/fnm.zip"
dest: "{{ linux_dev_station_service_home }}/.fnm"
remote_src: true
when:
- linux_dev_station_service_user_enabled | bool
- linux_dev_station_tool_packages | selectattr('name', 'equalto', 'node') | list | length > 0
- name: Ensure fnm binary is executable
become: true
ansible.builtin.file:
path: "{{ linux_dev_station_service_home }}/.fnm/fnm"
mode: "0755"
owner: "{{ linux_dev_station_service_user }}"
group: "{{ linux_dev_station_service_user }}"
when:
- linux_dev_station_service_user_enabled | bool
- linux_dev_station_tool_packages | selectattr('name', 'equalto', 'node') | list | length > 0
- name: Install LTS Node.js version via fnm
become: true
become_user: "{{ linux_dev_station_service_user }}"
ansible.builtin.command: >-
{{ linux_dev_station_service_home }}/.fnm/fnm install --lts
args:
creates: "{{ linux_dev_station_service_home }}/.fnm/node-versions"
environment:
HOME: "{{ linux_dev_station_service_home }}"
USER: "{{ linux_dev_station_service_user }}"
PATH: "{{ linux_dev_station_path }}:{{ linux_dev_station_service_home }}/.fnm"
FNM_DIR: "{{ linux_dev_station_service_home }}/.fnm"
when:
- linux_dev_station_service_user_enabled | bool
- linux_dev_station_tool_packages | selectattr('name', 'equalto', 'node') | list | length > 0
- name: Get installed Node.js version from fnm node-versions directory
become: true
become_user: "{{ linux_dev_station_service_user }}"
ansible.builtin.command: ls "{{ linux_dev_station_service_home }}/.fnm/node-versions"
register: fnm_versions_list
changed_when: false
environment:
FNM_DIR: "{{ linux_dev_station_service_home }}/.fnm"
when:
- linux_dev_station_service_user_enabled | bool
- linux_dev_station_tool_packages | selectattr('name', 'equalto', 'node') | list | length > 0
- name: Set default Node.js version via fnm
become: true
become_user: "{{ linux_dev_station_service_user }}"
ansible.builtin.command: >-
{{ linux_dev_station_service_home }}/.fnm/fnm default {{ node_version }}
environment:
HOME: "{{ linux_dev_station_service_home }}"
USER: "{{ linux_dev_station_service_user }}"
PATH: "{{ linux_dev_station_path }}:{{ linux_dev_station_service_home }}/.fnm"
FNM_DIR: "{{ linux_dev_station_service_home }}/.fnm"
when:
- linux_dev_station_service_user_enabled | bool
- linux_dev_station_tool_packages | selectattr('name', 'equalto', 'node') | list | length > 0
- fnm_versions_list is defined
- fnm_versions_list.stdout | trim | length > 0
vars:
node_version: "{{ fnm_versions_list.stdout | trim }}"
- name: Download code-server tarball
become: true
ansible.builtin.get_url:
url: "https://github.com/coder/code-server/releases/download/v{{ tool.version }}/code-server-{{ tool.version }}-linux-amd64.tar.gz"
dest: "{{ linux_dev_station_service_home }}/.cache/code-server.tar.gz"
owner: "{{ linux_dev_station_service_user }}"
group: "{{ linux_dev_station_service_user }}"
mode: "0644"
vars:
tool: "{{ linux_dev_station_tool_packages | selectattr('name', 'equalto', 'code-server') | first }}"
when:
- linux_dev_station_service_user_enabled | bool
- linux_dev_station_tool_packages | selectattr('name', 'equalto', 'code-server') | list | length > 0
- name: Create code-server installation directories
become: true
become_user: "{{ linux_dev_station_service_user }}"
ansible.builtin.file:
path: "{{ item }}"
state: directory
mode: "0755"
loop:
- "{{ linux_dev_station_service_home }}/.local/lib"
- "{{ linux_dev_station_service_home }}/.local/bin"
when:
- linux_dev_station_service_user_enabled | bool
- linux_dev_station_tool_packages | selectattr('name', 'equalto', 'code-server') | list | length > 0
- name: Extract code-server tarball to lib directory
become: true
become_user: "{{ linux_dev_station_service_user }}"
ansible.builtin.unarchive:
src: "{{ linux_dev_station_service_home }}/.cache/code-server.tar.gz"
dest: "{{ linux_dev_station_service_home }}/.local/lib"
remote_src: true
environment:
HOME: "{{ linux_dev_station_service_home }}"
USER: "{{ linux_dev_station_service_user }}"
when:
- linux_dev_station_service_user_enabled | bool
- linux_dev_station_tool_packages | selectattr('name', 'equalto', 'code-server') | list | length > 0
- name: Create symlink for code-server binary
become: true
become_user: "{{ linux_dev_station_service_user }}"
ansible.builtin.file:
src: "{{ linux_dev_station_service_home }}/.local/lib/code-server-{{ tool.version }}-linux-amd64/bin/code-server"
dest: "{{ linux_dev_station_service_home }}/.local/bin/code-server"
state: link
vars:
tool: "{{ linux_dev_station_tool_packages | selectattr('name', 'equalto', 'code-server') | first }}"
when:
- linux_dev_station_service_user_enabled | bool
- linux_dev_station_tool_packages | selectattr('name', 'equalto', 'code-server') | list | length > 0
- name: Create opencode installation directories
become: true
become_user: "{{ linux_dev_station_service_user }}"
ansible.builtin.file:
path: "{{ item }}"
state: directory
mode: "0755"
loop:
- "{{ linux_dev_station_service_home }}/.local/lib"
- "{{ linux_dev_station_service_home }}/.local/lib/opencode-{{ tool.version }}"
- "{{ linux_dev_station_service_home }}/.local/bin"
vars:
tool: "{{ linux_dev_station_tool_packages | selectattr('name', 'equalto', 'opencode') | first }}"
when:
- linux_dev_station_service_user_enabled | bool
- linux_dev_station_tool_packages | selectattr('name', 'equalto', 'opencode') | list | length > 0
- name: Download opencode tarball
become: true
ansible.builtin.get_url:
url: "https://github.com/anomalyco/opencode/releases/download/v{{ tool.version }}/opencode-linux-x64.tar.gz"
dest: "{{ linux_dev_station_service_home }}/.cache/opencode-{{ tool.version }}.tar.gz"
owner: "{{ linux_dev_station_service_user }}"
group: "{{ linux_dev_station_service_user }}"
mode: "0644"
vars:
tool: "{{ linux_dev_station_tool_packages | selectattr('name', 'equalto', 'opencode') | first }}"
when:
- linux_dev_station_service_user_enabled | bool
- linux_dev_station_tool_packages | selectattr('name', 'equalto', 'opencode') | list | length > 0
- name: Extract opencode tarball to versioned directory
become: true
become_user: "{{ linux_dev_station_service_user }}"
ansible.builtin.unarchive:
src: "{{ linux_dev_station_service_home }}/.cache/opencode-{{ tool.version }}.tar.gz"
dest: "{{ linux_dev_station_service_home }}/.local/lib/opencode-{{ tool.version }}"
remote_src: true
vars:
tool: "{{ linux_dev_station_tool_packages | selectattr('name', 'equalto', 'opencode') | first }}"
when:
- linux_dev_station_service_user_enabled | bool
- linux_dev_station_tool_packages | selectattr('name', 'equalto', 'opencode') | list | length > 0
- name: Create symlink for opencode binary
become: true
become_user: "{{ linux_dev_station_service_user }}"
ansible.builtin.file:
src: "{{ linux_dev_station_service_home }}/.local/lib/opencode-{{ tool.version }}/opencode"
dest: "{{ linux_dev_station_service_home }}/.local/bin/opencode"
state: link
vars:
tool: "{{ linux_dev_station_tool_packages | selectattr('name', 'equalto', 'opencode') | first }}"
when:
- linux_dev_station_service_user_enabled | bool
- linux_dev_station_tool_packages | selectattr('name', 'equalto', 'opencode') | list | length > 0