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.
This commit is contained in:
@@ -0,0 +1,268 @@
|
||||
---
|
||||
- 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
|
||||
Reference in New Issue
Block a user