/
/
/
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: '0775'
11 loop:
12 - "{{ jellyfin_data_dir }}"
13 - "{{ jellyfin_config_dir }}"
14 - "{{ jellyfin_cache_dir }}"
15 - "{{ jellyfin_data_dir }}/transcodes"
16 tags:
17 - storage
18 - jellyfin
19 - directories
20
21- name: Set group sticky bit on Jellyfin directories for permission inheritance
22 file:
23 path: "{{ item }}"
24 state: directory
25 mode: "g+s"
26 loop:
27 - "{{ jellyfin_data_dir }}"
28 - "{{ jellyfin_config_dir }}"
29 - "{{ jellyfin_cache_dir }}"
30 tags:
31 - storage
32 - jellyfin
33 - permissions
34
35- name: Install Intel VAAPI tools/drivers (Debian/Ubuntu)
36 when:
37 - jellyfin_hwaccel_enabled
38 - jellyfin_hwaccel_install_host_deps
39 - ansible_facts.os_family == 'Debian'
40 apt:
41 name:
42 - vainfo
43 - intel-media-va-driver-non-free
44 state: present
45 update_cache: true
46 tags:
47 - storage
48 - jellyfin
49 - gpu
50 - vaapi
51
52- name: Check that /dev/dri exists (GPU device presence)
53 when: jellyfin_hwaccel_enabled
54 stat:
55 path: "{{ jellyfin_vaapi_map_dri_dir }}"
56 register: dri_stat
57 tags:
58 - storage
59 - jellyfin
60 - gpu
61 - vaapi
62
63- name: Warn if GPU devices are missing (transcoding will fall back to CPU)
64 when:
65 - jellyfin_hwaccel_enabled
66 - not dri_stat.stat.exists
67 debug:
68 msg: "WARNING: {{ jellyfin_vaapi_map_dri_dir }} not found. Hardware transcoding will NOT be available."
69 tags:
70 - storage
71 - jellyfin
72 - gpu
73 - vaapi
74
75- name: Generate Jellyfin environment file
76 template:
77 src: jellyfin.env.j2
78 dest: "{{ jellyfin_data_dir }}/.env"
79 owner: "{{ storage_user }}"
80 group: "{{ storage_group }}"
81 mode: '0600'
82 notify: restart jellyfin
83 tags:
84 - storage
85 - jellyfin
86 - config
87 - env
88
89- name: Deploy Jellyfin Docker Compose file
90 template:
91 src: jellyfin-compose.yml.j2
92 dest: "{{ jellyfin_data_dir }}/docker-compose.yml"
93 owner: "{{ storage_user }}"
94 group: "{{ storage_group }}"
95 mode: '0664'
96 notify: restart jellyfin
97 tags:
98 - storage
99 - jellyfin
100 - config
101 - compose
102
103- name: Start Jellyfin service
104 community.docker.docker_compose_v2:
105 project_src: "{{ jellyfin_data_dir }}"
106 state: present
107 register: jellyfin_start_result
108 tags:
109 - storage
110 - jellyfin
111 - deploy
112
113- name: Wait for Jellyfin to be healthy
114 uri:
115 url: "http://localhost:{{ jellyfin_port }}/health"
116 method: GET
117 status_code: 200
118 register: jellyfin_health
119 until: jellyfin_health.status == 200
120 retries: 30
121 delay: 10
122 when: jellyfin_start_result is changed
123 tags:
124 - storage
125 - jellyfin
126 - validation
127 - health-check
128
129- name: Display Jellyfin deployment summary
130 debug:
131 msg: |
132 Jellyfin Media Server Deployment:
133 - Status: {{ 'Started' if jellyfin_start_result is changed else 'Already running' }}
134 - Web UI: http://{{ ansible_default_ipv4.address }}:{{ jellyfin_host_port }}
135 - Configuration: {{ jellyfin_config_dir }}
136 - Media Directory: {{ jellyfin_media_dir }}
137 - Cache Directory: {{ jellyfin_cache_dir }}
138 - Hardware Acceleration: {{ 'Enabled' if jellyfin_hwaccel_enabled else 'Disabled' }}
139 - GPU Detection: {{ 'Available' if dri_stat.stat.exists else 'No GPU detected' }}
140
141 Management Commands:
142 - jellyfin-logs.sh - View service logs
143 - jellyfin-restart.sh - Restart service
144 - jellyfin-status.sh - Check service status
145 tags:
146 - storage
147 - jellyfin
148 - summary
149