forked from mother-of-all-self-hosting/mash-playbook
-
Notifications
You must be signed in to change notification settings - Fork 0
/
justfile
200 lines (165 loc) · 8.8 KB
/
justfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
# Shows help
default:
@just --list --justfile {{ justfile() }}
run_directory_path := justfile_directory() + "/run"
templates_directory_path := justfile_directory() + "/templates"
optimization_vars_files_file_path := run_directory_path + "/optimization-vars-files.state"
# Pulls external Ansible roles
roles: _requirements-yml
#!/usr/bin/env sh
if [ -x "$(command -v agru)" ]; then
echo "[NOTE] This command just updates the roles, but if you want to update everything at once (playbook, roles, etc.) - use 'just update'"
agru -r {{ justfile_directory() }}/requirements.yml
else
echo "[NOTE] You are using the standard ansible-galaxy tool to install roles, which is slow and lacks other features. We recommend installing the 'agru' tool to speed up the process: https://github.com/etkecc/agru#where-to-get"
echo "[NOTE] This command just updates the roles, but if you want to update everything at once (playbook, roles, etc.) - use 'just update'"
rm -rf roles/galaxy
ansible-galaxy install -r {{ justfile_directory() }}/requirements.yml -p roles/galaxy/ --force
fi
# Optimizes the playbook based on stored configuration (vars.yml paths)
optimize-restore:
#!/usr/bin/env sh
if [ -f "{{ optimization_vars_files_file_path }}" ]; then
just --justfile {{ justfile() }} \
_optimize-for-var-paths \
$(cat {{ optimization_vars_files_file_path }})
else
echo "Cannot restore optimization state from a file ($optimization_vars_files_file_path), because it doesn't exist"
exit 1
fi
# Clears optimizations and resets the playbook to a non-optimized state
optimize-reset: && _clean_template_derived_files
#!/usr/bin/env sh
rm -f {{ run_directory_path }}/*.srchash
rm -f {{ optimization_vars_files_file_path }}
# Optimizes the playbook based on the enabled components for all hosts in the inventory
optimize inventory_path='inventory': _reconfigure-for-all-hosts
_reconfigure-for-all-hosts inventory_path='inventory':
#!/usr/bin/env sh
just --justfile {{ justfile() }} \
_optimize-for-var-paths \
$(find {{ inventory_path }}/host_vars/ -maxdepth 2 -name 'vars.yml' -exec readlink -f {} \;)
# Optimizes the playbook based on the enabled components for a single host
optimize-for-host hostname inventory_path='inventory':
#!/usr/bin/env sh
just --justfile {{ justfile() }} \
_optimize-for-var-paths \
$(find {{ inventory_path }}/host_vars/{{ hostname }} -maxdepth 1 -name 'vars.yml' -exec readlink -f {} \;)
# Optimizes the playbook based on the enabled components found in the given vars.yml files
_optimize-for-var-paths +PATHS:
#!/usr/bin/env sh
echo '{{ PATHS }}' > {{ optimization_vars_files_file_path }}
just --justfile {{ justfile() }} _save_hash_for_file {{ templates_directory_path }}/requirements.yml {{ justfile_directory() }}/requirements.yml
just --justfile {{ justfile() }} _save_hash_for_file {{ templates_directory_path }}/setup.yml {{ justfile_directory() }}/setup.yml
just --justfile {{ justfile() }} _save_hash_for_file {{ templates_directory_path }}/group_vars_mash_servers {{ justfile_directory() }}/group_vars/mash_servers
/usr/bin/env python {{ justfile_directory() }}/bin/optimize.py \
--vars-paths='{{ PATHS }}' \
--src-requirements-yml-path={{ templates_directory_path }}/requirements.yml \
--dst-requirements-yml-path={{ justfile_directory() }}/requirements.yml \
--src-setup-yml-path={{ templates_directory_path }}/setup.yml \
--dst-setup-yml-path={{ justfile_directory() }}/setup.yml \
--src-group-vars-yml-path={{ templates_directory_path }}/group_vars_mash_servers \
--dst-group-vars-yml-path={{ justfile_directory() }}/group_vars/mash_servers
# Updates the playbook and installs the necessary Ansible roles pinned in requirements.yml. If a -u flag is passed, also updates the requirements.yml file with new role versions (if available)
update *flags: update-playbook-only
#!/usr/bin/env sh
if [ -x "$(command -v agru)" ]; then
echo {{ if flags == "" { "Installing roles pinned in requirements.yml..." } else if flags == "-u" { "Updating roles and pinning new versions in requirements.yml..." } else { "Unknown flags passed" } }}
agru -r {{ templates_directory_path }}/requirements.yml {{ flags }}
just --justfile {{ justfile() }} versions
just --justfile {{ justfile() }} opml
else
echo "[NOTE] You are using the standard ansible-galaxy tool to install roles, which is slow and lacks other features. We recommend installing the 'agru' tool to speed up the process: https://github.com/etkecc/agru#where-to-get"
echo "Installing roles..."
rm -rf roles/galaxy
ansible-galaxy install -r requirements.yml -p roles/galaxy/ --force
fi
# Updates the playbook without installing/updating Ansible roles
update-playbook-only:
@echo "Updating playbook..."
@git stash -q
@git pull -q
@-git stash pop -q
# Runs ansible-lint against all roles in the playbook
lint:
ansible-lint
# dumps an OPML file with extracted git feeds for roles
opml:
@echo "generating opml..."
@python bin/feeds.py . dump
# dumps versions of the components found in the roles to the VERSIONS.md file
versions:
@echo "generating versions..."
@python bin/versions.py
# Runs the playbook with --tags=install-all,start and optional arguments
install-all *extra_args: (run-tags "install-all,start" extra_args)
# Runs installation tasks for a single service
install-service service *extra_args:
just --justfile {{ justfile() }} run \
--tags=install-{{ service }},start-group \
--extra-vars=group={{ service }} \
--extra-vars=devture_systemd_service_manager_service_restart_mode=one-by-one {{ extra_args }}
# Runs the playbook with --tags=setup-all,start and optional arguments
setup-all *extra_args: (run-tags "setup-all,start" extra_args)
# Runs the playbook with the given list of arguments
run +extra_args: _requirements-yml _setup-yml _group-vars-mash-servers
ansible-playbook -i inventory/hosts setup.yml {{ extra_args }}
# Runs the playbook with the given list of comma-separated tags and optional arguments
run-tags tags *extra_args:
just --justfile {{ justfile() }} run --tags={{ tags }} {{ extra_args }}
# Starts all services
start-all *extra_args: (run-tags "start-all" extra_args)
# Starts a specific service group
start-group group *extra_args:
@just --justfile {{ justfile() }} run-tags start-group --extra-vars="group={{ group }}" {{ extra_args }}
# Stops all services
stop-all *extra_args: (run-tags "stop-all" extra_args)
# Stops a specific service group
stop-group group *extra_args:
@just --justfile {{ justfile() }} run-tags stop-group --extra-vars="group={{ group }}" {{ extra_args }}
# Prepares the requirements.yml file
_requirements-yml:
@just --justfile {{ justfile() }} _ensure_file_prepared {{ templates_directory_path }}/requirements.yml {{ justfile_directory() }}/requirements.yml
# Prepares the setup.yml file
_setup-yml:
@just --justfile {{ justfile() }} _ensure_file_prepared {{ templates_directory_path }}/setup.yml {{ justfile_directory() }}/setup.yml
# Prepares the group_vars/mash_servers file
_group-vars-mash-servers:
@just --justfile {{ justfile() }} _ensure_file_prepared {{ templates_directory_path }}/group_vars_mash_servers {{ justfile_directory() }}/group_vars/mash_servers
_ensure_file_prepared src_path dst_path:
#!/usr/bin/env sh
dst_file_name=$(basename "{{ dst_path }}")
hash_path={{ run_directory_path }}"/"$dst_file_name".srchash"
src_hash=$(md5sum {{ src_path }} | cut -d ' ' -f 1)
if [ ! -f "{{ dst_path }}" ] || [ ! -f "$hash_path" ]; then
cp {{ src_path }} {{ dst_path }}
echo $src_hash > $hash_path
else
current_hash=$(cat $hash_path)
if [ "$current_hash" != "$src_hash" ]; then
cp {{ src_path }} {{ dst_path }}
echo $src_hash > $hash_path
if [ -f "{{ optimization_vars_files_file_path }}" ]; then
just --justfile {{ justfile() }} \
_optimize-for-var-paths \
$(cat {{ optimization_vars_files_file_path }})
fi
fi
fi
_save_hash_for_file src_path dst_path:
#!/usr/bin/env sh
dst_file_name=$(basename "{{ dst_path }}")
hash_path={{ run_directory_path }}"/"$dst_file_name".srchash"
src_hash=$(md5sum {{ src_path }} | cut -d ' ' -f 1)
echo $src_hash > $hash_path
_clean_template_derived_files:
#!/usr/bin/env sh
if [ -f "{{ justfile_directory() }}/requirements.yml" ]; then
rm {{ justfile_directory() }}/requirements.yml
fi
if [ -f "{{ justfile_directory() }}/setup.yml" ]; then
rm {{ justfile_directory() }}/setup.yml
fi
if [ -f "{{ justfile_directory() }}/group_vars/mash_servers" ]; then
rm {{ justfile_directory() }}/group_vars/mash_servers
fi