/
/
/
Ansible role that provisions my storage server.
1---
2# Storage Services - Jellyfin Media Server
3
4- name: Create Jellyfin configuration directory structure
5 file:
6 path: "{{ item }}"
7 state: directory
8 owner: "{{ storage_user }}"
9 group: "{{ storage_group }}"
10 mode: '2775'
11 loop:
12 - "{{ jellyfin_data_dir }}"
13 - "{{ jellyfin_config_dir }}"
14 - "{{ jellyfin_cache_dir }}"
15 - "{{ jellyfin_data_dir }}/transcodes"
16
17# GPU acceleration disabled - using CPU iGPU transcoding
18# - name: Install Intel VAAPI tools/drivers (Debian/Ubuntu)
19# when:
20# - jellyfin_hwaccel_enabled
21# - jellyfin_hwaccel_install_host_deps
22# - ansible_facts.os_family == 'Debian'
23# apt:
24# name:
25# - vainfo
26# - intel-media-va-driver-non-free
27# state: present
28# update_cache: true
29# check_mode: no
30
31# GPU device checking disabled - using CPU iGPU transcoding
32# - name: Check that /dev/dri exists (GPU device presence)
33# when: jellyfin_hwaccel_enabled
34# stat:
35# path: "{{ jellyfin_vaapi_map_dri_dir }}"
36# register: dri_stat
37#
38# - name: Warn if GPU devices are missing (transcoding will fall back to CPU)
39# when:
40# - jellyfin_hwaccel_enabled
41# - not dri_stat.stat.exists
42# debug:
43# msg: "WARNING: {{ jellyfin_vaapi_map_dri_dir }} not found. Hardware transcoding will NOT be available."
44
45- name: Generate Jellyfin environment file
46 template:
47 src: jellyfin.env.j2
48 dest: "{{ jellyfin_data_dir }}/.env"
49 owner: "{{ storage_user }}"
50 group: "{{ storage_group }}"
51 mode: '0660'
52 notify: restart jellyfin
53
54- name: Deploy Jellyfin Docker Compose file
55 template:
56 src: jellyfin-compose.yml.j2
57 dest: "{{ jellyfin_data_dir }}/docker-compose.yml"
58 owner: "{{ storage_user }}"
59 group: "{{ storage_group }}"
60 mode: '0664'
61 notify: restart jellyfin
62
63- name: Check if Jellyfin directory exists
64 stat:
65 path: "{{ jellyfin_data_dir }}"
66 register: jellyfin_dir_stat
67 changed_when: false
68
69- name: Start Jellyfin service
70 community.docker.docker_compose_v2:
71 project_src: "{{ jellyfin_data_dir }}"
72 state: present
73 register: jellyfin_start_result
74 check_mode: no
75 when: jellyfin_dir_stat.stat.exists
76
77- name: Wait for Jellyfin to be healthy
78 uri:
79 url: "http://localhost:{{ jellyfin_port }}/health"
80 method: GET
81 status_code: 200
82 register: jellyfin_health
83 until: jellyfin_health.status == 200
84 retries: 30
85 delay: 10
86 when: jellyfin_start_result is changed
87
88- name: Display Jellyfin deployment summary
89 debug:
90 msg: |
91 Jellyfin Media Server Deployment:
92 - Status: {{ 'Started' if jellyfin_start_result is changed else 'Already running' }}
93 - Web UI: http://{{ ansible_default_ipv4.address }}:{{ jellyfin_host_port }}
94 - Configuration: {{ jellyfin_config_dir }}
95 - Media Directory: {{ jellyfin_media_dir }}
96 - Cache Directory: {{ jellyfin_cache_dir }}
97 - Hardware Acceleration: CPU iGPU (GPU disabled)
98
99 Docker Compose Commands:
100 - cd {{ jellyfin_data_dir }} && docker compose logs -f
101 - cd {{ jellyfin_data_dir }} && docker compose restart
102 - cd {{ jellyfin_data_dir }} && docker compose ps
103