/
/
/
Ansible role that provisions my storage server.
1---
2# Storage Services Role - Main Tasks
3
4- name: Check if storage role is enabled
5 fail:
6 msg: "Storage role is disabled. Set storage_enabled: true to enable."
7 when: not storage_enabled
8 tags: always
9
10- name: Display storage role start message
11 debug:
12 msg: "Starting Storage Services deployment with {{ ansible_play_hosts | length }} host(s)"
13 tags: always
14
15# Validate vault secrets before proceeding
16- name: Include vault variable validation
17 include_tasks: validate-vault.yml
18 tags: [always, validation]
19
20# Prerequisites and system setup
21- name: Include prerequisites tasks
22 include_tasks: prerequisites.yml
23 tags:
24 - storage
25 - prerequisites
26 - setup
27
28# Docker network setup
29- name: Include docker network tasks
30 include_tasks: docker-network.yml
31 tags:
32 - storage
33 - docker
34 - network
35
36# Service deployments
37#
38# apply: makes service tags (--tags jellyfin, ...) reach the tasks inside; a
39# plain include_tasks only tags the include itself and runs none of its
40# children.
41- name: Include Jellyfin deployment
42 include_tasks:
43 file: jellyfin.yml
44 apply:
45 tags:
46 - storage
47 - jellyfin
48 - media
49 when: jellyfin_enabled
50 tags:
51 - storage
52 - jellyfin
53 - media
54
55- name: Include Arr Stack deployment
56 include_tasks:
57 file: arr-stack.yml
58 apply:
59 tags:
60 - storage
61 - arr-stack
62 - automation
63 when: arr_stack_enabled
64 tags:
65 - storage
66 - arr-stack
67 - automation
68
69- name: Include Navidrome deployment
70 include_tasks:
71 file: navidrome.yml
72 apply:
73 tags:
74 - storage
75 - navidrome
76 - music
77 when: navidrome_enabled
78 tags:
79 - storage
80 - navidrome
81 - music
82
83- name: Include gdu disk usage analyzer deployment
84 include_tasks:
85 file: gdu.yml
86 apply:
87 tags:
88 - storage
89 - gdu
90 - monitoring
91 when: gdu_enabled
92 tags:
93 - storage
94 - gdu
95 - monitoring
96
97- name: Include Calibre Stack deployment
98 include_tasks:
99 file: calibre-stack.yml
100 apply:
101 tags:
102 - storage
103 - calibre
104 - books
105 when: calibre_enabled
106 tags:
107 - storage
108 - calibre
109 - books
110
111- name: Include Nextcloud deployment
112 include_tasks:
113 file: nextcloud.yml
114 apply:
115 tags:
116 - storage
117 - nextcloud
118 - cloud
119 when: nextcloud_enabled
120 tags:
121 - storage
122 - nextcloud
123 - cloud
124
125- name: Include Restic Backup Server deployment
126 include_tasks:
127 file: restic-server.yml
128 apply:
129 tags:
130 - storage
131 - restic
132 - backup
133 when: restic_backup_server_enabled
134 tags:
135 - storage
136 - restic
137 - backup
138
139# Post-deployment validation
140- name: Include validation tasks
141 include_tasks: validation.yml
142 tags:
143 - storage
144 - validation
145 - health-check
146
147
148- name: Display storage deployment summary
149 debug:
150 msg: |
151 Storage Services Deployment Complete!
152
153 Services Status:
154 - Jellyfin (Media): {{ 'Enabled' if jellyfin_enabled else 'Disabled' }}
155 - Arr Stack (Automation): {{ 'Enabled' if arr_stack_enabled else 'Disabled' }}
156 - Navidrome: {{ 'Enabled' if navidrome_enabled else 'Disabled' }}
157 - gdu (Disk Usage): {{ 'Enabled' if gdu_enabled else 'Disabled' }}
158 - Calibre Stack (Books): {{ 'Enabled' if calibre_enabled else 'Disabled' }}
159 - Restic Backup: {{ 'Enabled' if restic_backup_server_enabled else 'Disabled' }}
160 - Nextcloud (Cloud): {{ 'Enabled' if nextcloud_enabled else 'Disabled' }}
161
162 Access Information:
163 {% if jellyfin_enabled %}
164 - Jellyfin: http://{{ ansible_default_ipv4.address }}:{{ jellyfin_host_port }}
165 {% endif %}
166 {% if arr_stack_enabled %}
167 - Sonarr (TV): http://{{ ansible_default_ipv4.address }}:{{ sonarr_host_port }}
168 - Radarr (Movies): http://{{ ansible_default_ipv4.address }}:{{ radarr_host_port }}
169 - Prowlarr (Indexers): http://{{ ansible_default_ipv4.address }}:{{ prowlarr_host_port }}
170 - LazyLibrarian (Books): http://{{ ansible_default_ipv4.address }}:{{ lazylibrarian_host_port }}
171 - Lidarr (Music): http://{{ ansible_default_ipv4.address }}:{{ lidarr_host_port }}
172 - Jellyseer (Requests): http://{{ ansible_default_ipv4.address }}:{{ jellyseer_host_port }}
173 - Flaresolverr (Cloudflare): http://{{ ansible_default_ipv4.address }}:{{ flaresolverr_host_port }}
174 {% endif %}
175 {% if navidrome_enabled %}
176 - Navidrome: http://{{ ansible_default_ipv4.address }}:{{ navidrome_host_port }}
177 {% endif %}
178 {% if gdu_enabled %}
179 - gdu (Disk Usage): http://{{ gdu_web_hostname }}:{{ gdu_host_port }}
180 {% endif %}
181 {% if calibre_enabled %}
182 - Calibre Server: http://{{ ansible_default_ipv4.address }}:{{ calibre_server_host_port }}
183 - Calibre-Web: http://{{ ansible_default_ipv4.address }}:{{ calibre_web_host_port }}
184 {% endif %}
185 {% if restic_backup_server_enabled %}
186 - Restic Backup: http://{{ ansible_default_ipv4.address }}:{{ restic_backup_host_port }}
187 {% endif %}
188 {% if nextcloud_enabled %}
189 - Nextcloud: http://{{ ansible_default_ipv4.address }}:{{ nextcloud_host_port }}
190 {% endif %}
191
192 Management Scripts: /usr/local/bin/storage-*
193
194 Service Directories:
195 - Jellyfin: {{ jellyfin_data_dir }}
196 - Arr Stack: {{ arr_config_dir }}
197 - Calibre: {{ calibre_config_dir }}
198 - gdu: {{ gdu_config_dir }}
199 - Restic: {{ restic_backup_config_dir }}
200 - Nextcloud: {{ nextcloud_config_dir }}
201
202 Media Paths: {{ storage_base_path }}
203 tags: always