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