commit f3b4c2b0d2d4d7b59c06be6092489b302e98458d Author: mathieu Date: Sun May 24 17:13:33 2026 +0200 feat: initial installation role for radarr diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a8b42eb --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.retry diff --git a/README.md b/README.md new file mode 100644 index 0000000..dc8ee90 --- /dev/null +++ b/README.md @@ -0,0 +1,39 @@ +# ansible-role-radarr + +Installs Radarr from GitHub releases on Linux. The role detects the current +architecture and downloads the matching binary. It is idempotent: re-running +the role only downloads and extracts if the installed version differs. + +The service user and group must be created beforehand (e.g. via a users role). + +## Requirements + +- Ansible >= 2.14 +- `sqlite3` package on the target host + +## Role Variables + +| Variable | Default | Description | +|---|---|---| +| `radarr_version` | `""` | Version to install (empty = latest) | +| `radarr_user` | `radarr` | System user to run Radarr | +| `radarr_group` | `radarr` | System group to run Radarr | +| `radarr_install_dir` | `/opt/radarr` | Binary installation directory | +| `radarr_data_dir` | `/var/lib/radarr` | Data and config directory | +| `radarr_service_enabled` | `true` | Enable service at boot | +| `radarr_service_state` | `started` | Service state after installation | + +## Example Playbook + +```yaml +- hosts: servers + roles: + - role: ansible-role-radarr + vars: + radarr_user: radarr + radarr_group: radarr +``` + +## License + +MIT diff --git a/defaults/main.yml b/defaults/main.yml new file mode 100644 index 0000000..544c6c0 --- /dev/null +++ b/defaults/main.yml @@ -0,0 +1,8 @@ +--- +radarr_version: "" +radarr_user: radarr +radarr_group: radarr +radarr_install_dir: /opt/radarr +radarr_data_dir: /var/lib/radarr +radarr_service_enabled: true +radarr_service_state: started diff --git a/handlers/main.yml b/handlers/main.yml new file mode 100644 index 0000000..ed97d53 --- /dev/null +++ b/handlers/main.yml @@ -0,0 +1 @@ +--- diff --git a/meta/main.yml b/meta/main.yml new file mode 100644 index 0000000..c546a2b --- /dev/null +++ b/meta/main.yml @@ -0,0 +1,15 @@ +--- +galaxy_info: + author: mathieu + description: Install Radarr via binary on Linux + license: MIT + min_ansible_version: "2.14" + platforms: + - name: Debian + versions: [bullseye, bookworm] + - name: Ubuntu + versions: [focal, jammy, noble] + - name: EL + versions: ["8", "9"] + galaxy_tags: [radarr, media, arr] +dependencies: [] diff --git a/tasks/main.yml b/tasks/main.yml new file mode 100644 index 0000000..c896ac3 --- /dev/null +++ b/tasks/main.yml @@ -0,0 +1,127 @@ +--- +- name: Install prerequisites + ansible.builtin.package: + name: + - curl + - sqlite3 + state: present + become: true + +- name: Set architecture fact + ansible.builtin.set_fact: + _radarr_arch: "{{ {'x86_64': 'x64', 'aarch64': 'arm64', 'armv7l': 'arm'}.get(ansible_architecture, 'x64') }}" + +- name: Get Radarr release info from GitHub + ansible.builtin.uri: + url: >- + {{ 'https://api.github.com/repos/Radarr/Radarr/releases/latest' + if radarr_version == '' + else 'https://api.github.com/repos/Radarr/Radarr/releases/tags/v' + radarr_version }} + headers: + Accept: "application/vnd.github.v3+json" + return_content: true + register: _radarr_release + +- name: Set version and download URL facts + ansible.builtin.set_fact: + _radarr_version_tag: "{{ _radarr_release.json.tag_name }}" + _radarr_download_url: >- + {{ _radarr_release.json.assets + | selectattr('name', 'search', 'linux-core-' + _radarr_arch) + | map(attribute='browser_download_url') + | first }} + +- name: Read installed version + ansible.builtin.slurp: + src: "{{ radarr_install_dir }}/.version" + register: _radarr_installed_raw + ignore_errors: true + become: true + +- name: Set installed version fact + ansible.builtin.set_fact: + _radarr_installed_version: >- + {{ (_radarr_installed_raw.content | b64decode | trim) + if _radarr_installed_raw is not failed else '' }} + +- name: Install or upgrade Radarr + when: _radarr_installed_version != _radarr_version_tag + block: + - name: Download Radarr archive + ansible.builtin.get_url: + url: "{{ _radarr_download_url }}" + dest: /tmp/radarr.tar.gz + mode: '0644' + + - name: Create Radarr installation directory + ansible.builtin.file: + path: "{{ radarr_install_dir }}" + state: directory + owner: "{{ radarr_user }}" + group: "{{ radarr_group }}" + mode: '0755' + become: true + + - name: Extract Radarr archive + ansible.builtin.unarchive: + src: /tmp/radarr.tar.gz + dest: "{{ radarr_install_dir }}" + remote_src: true + extra_opts: [--strip-components=1] + owner: "{{ radarr_user }}" + group: "{{ radarr_group }}" + become: true + + - name: Write installed version file + ansible.builtin.copy: + content: "{{ _radarr_version_tag }}" + dest: "{{ radarr_install_dir }}/.version" + owner: "{{ radarr_user }}" + group: "{{ radarr_group }}" + mode: '0644' + become: true + + - name: Remove downloaded archive + ansible.builtin.file: + path: /tmp/radarr.tar.gz + state: absent + +- name: Create Radarr data directory + ansible.builtin.file: + path: "{{ radarr_data_dir }}" + state: directory + owner: "{{ radarr_user }}" + group: "{{ radarr_group }}" + mode: '0750' + become: true + +- name: Create Radarr systemd service + ansible.builtin.copy: + content: | + [Unit] + Description=Radarr + After=syslog.target network.target + + [Service] + SyslogIdentifier=radarr + ExecStart={{ radarr_install_dir }}/Radarr -nobrowser -data={{ radarr_data_dir }} + TimeoutStopSec=20 + KillMode=process + Restart=on-failure + User={{ radarr_user }} + Group={{ radarr_group }} + UMask=0002 + + [Install] + WantedBy=multi-user.target + dest: /etc/systemd/system/radarr.service + mode: '0644' + become: true + +- name: Enable and start Radarr service + ansible.builtin.systemd: + name: radarr + enabled: "{{ radarr_service_enabled }}" + state: "{{ radarr_service_state }}" + daemon_reload: true + become: true