Skip to content

Commit ab439e4

Browse files
korowaazat
authored andcommitted
Handle deletion of stale configuration files
Now at pre-configure stage, for each directory managed by the role, a task sequence is launched that lists checks for any difference between actual directory contents and expected list of files, and deletes any files not present in expected list. The behavior is controlled by `clickhouse_delete_stale_files` role variable, and enabled by default. Tested via emulation of stale config files presence (side-effect playbook) and additional run of the role on top of it.
1 parent b9842dd commit ab439e4

File tree

7 files changed

+135
-18
lines changed

7 files changed

+135
-18
lines changed

defaults/main.yml

+4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
# client - setup only client
55
clickhouse_setup: full
66

7+
# If deletion of stale configuration files (once managed by the role,
8+
# but deleted from inventory variable later) is allowed
9+
clickhouse_delete_stale_files: true
10+
711
# NOTE: It is not recommended to use "latest", you should always pin version!
812
# clickhouse_version: ""
913

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
- name: Collect config file stats
3+
stat:
4+
path: "{{ item }}"
5+
register: __config_exists__
6+
7+
- name: Assert config file not exists
8+
assert:
9+
that: "{{ not __config_exists__.stat.exists }}"
10+
fail_msg: "Configuration file {{ item }} exists"

molecule/default/molecule.yml

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ scenario:
4848
- converge
4949
- idempotence
5050
- side_effect
51+
- converge
5152
- verify
5253
- cleanup
5354
- destroy

molecule/default/side_effect.yml

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
---
2+
- name: Side effect
3+
hosts: all
4+
gather_facts: false
5+
6+
tasks:
7+
- name: Emulating stale configuration files
8+
file:
9+
path: "{{ item }}"
10+
state: touch
11+
with_items:
12+
- /etc/clickhouse-server/config.d/00-stale-role-defined-override.yml
13+
- /etc/clickhouse-server/config.d/99-stale-user-defined-override.yml
14+
- /etc/clickhouse-server/users.d/99-stale-user-configuration.yml
15+
- /etc/clickhouse-server/dictionary.d/stale-dictionary.xml
16+
- /var/lib/clickhouse/format_schemas/stale.proto
17+
- /var/lib/clickhouse/top_level_domains/stale_tld.dat
18+
- /etc/clickhouse-client/format_schemas/stale.proto
19+
when: clickhouse_setup == "full"

molecule/default/verify.yml

+11
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,17 @@
162162
with_items:
163163
- "{{ user_defined_user_overrides }}"
164164

165+
- name: Assert stale configuration files have been deleted
166+
include_tasks: ./helpers/assert_config_not_exists.yml
167+
with_items:
168+
- /etc/clickhouse-server/config.d/00-stale-role-defined-override.yml
169+
- /etc/clickhouse-server/config.d/99-stale-user-defined-override.yml
170+
- /etc/clickhouse-server/users.d/99-stale-user-configuration.yml
171+
- /etc/clickhouse-server/dictionary.d/stale-dictionary.xml
172+
- /var/lib/clickhouse/format_schemas/stale.proto
173+
- /var/lib/clickhouse/top_level_domains/stale_tld.dat
174+
- /etc/clickhouse-client/format_schemas/stale.proto
175+
165176
- name: Assert configuration has been applied correctly
166177
include_tasks: ./helpers/assert_query_result.yml
167178
with_items:

tasks/helpers/cleanup_stale_files.yml

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
---
2+
# Sequence of tasks to detect and delete, if allowed, the files not
3+
# managed by the role anymore
4+
- name: List files
5+
find:
6+
paths: "{{ item.cleanup_directory }}"
7+
patterns: "{{ item.pattern }}"
8+
register: __cleanup_directory_files__
9+
- name: Check for stale files
10+
set_fact:
11+
__stale_files__: "{{
12+
__cleanup_directory_files__.files | map(attribute='path') | map('basename') |
13+
difference(item.expected_files)
14+
}}"
15+
- name: Files found, but cannot be deleted
16+
fail:
17+
msg: |
18+
Following stale files are found in {{ item.cleanup_directory }}:
19+
{{ _stale_files | join(', ') }}, but file deletion is not allowed.
20+
To delete these files, set `clickhouse_delete_stale_files` variable
21+
to `true`.
22+
when: __stale_files__ | length != 0 and not clickhouse_delete_stale_files
23+
ignore_errors: true
24+
- name: Delete stale files
25+
file:
26+
path: "{{ item.cleanup_directory }}/{{ stale }}"
27+
state: absent
28+
with_items: "{{ __stale_files__ }}"
29+
loop_control:
30+
loop_var: stale
31+
notify: "{{ item.restart | ternary(['restart-clickhouse'], []) }}"
32+
when: clickhouse_delete_stale_files

tasks/pre_configure.yml

+58-18
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@
106106
- name: Install attributes for the configuration files
107107
no_log: true
108108
vars:
109-
common:
109+
common_server_configs:
110110
# NOTE: role has "00-" prefix to give this override lowest priority
111111
- clickhouse-server/config.d/00-logger.yml
112112
- clickhouse-server/config.d/00-system_log.yml
@@ -131,11 +131,11 @@
131131
- file: clickhouse-server/config.d/00-memory.yml
132132
no_restart: true
133133
set_fact:
134-
_configs: "{{ _configs | default([]) + ((item is mapping) | ternary(
134+
_server_configs: "{{ _server_configs | default([]) + ((item is mapping) | ternary(
135135
[{'file': item.file, 'no_log': item.no_log | default(False), 'no_restart': item.no_restart | default(False)}],
136136
[{'file': item, 'no_log': False, 'no_restart': False}]
137137
)) }}" # noqa: jinja[spacing]
138-
loop: "{{ common + clickhouse_configuration_files + _config_no_restart | default([]) }}"
138+
loop: "{{ common_server_configs + clickhouse_configuration_files + _config_no_restart | default([]) }}"
139139
- name: Deploy clickhouse-server config overrides (requires restart)
140140
template:
141141
src: "{{ item.file }}.j2"
@@ -145,7 +145,7 @@
145145
mode: "u=r,go="
146146
notify: restart-clickhouse
147147
no_log: "{{ item.no_log }}"
148-
loop: "{{ _configs | selectattr('no_restart', 'eq', False) }}"
148+
loop: "{{ _server_configs | selectattr('no_restart', 'eq', False) }}"
149149
- name: Deploy clickhouse-server config overrides (without restart)
150150
template:
151151
src: "{{ item.file }}.j2"
@@ -154,27 +154,30 @@
154154
group: clickhouse
155155
mode: "u=r,go="
156156
no_log: "{{ item.no_log }}"
157-
loop: "{{ _configs | selectattr('no_restart', 'eq', True) }}"
158-
- name: Deploy role default clickhouse-server users overrides (requires restart)
159-
template:
160-
src: "{{ item }}.j2"
161-
dest: "/etc/clickhouse-server/users.d/{{ item | basename }}"
162-
owner: clickhouse
163-
group: clickhouse
164-
mode: "u=r,go="
165-
notify: restart-clickhouse
166-
loop:
167-
- clickhouse-server/users.d/00-overrides.yml
168-
- name: Deploy user provided clickhouse-server users overrides (requires restart)
157+
loop: "{{ _server_configs | selectattr('no_restart', 'eq', True) }}"
158+
- name: Set attributes for user configuration files
159+
no_log: true
160+
vars:
161+
common_user_configs:
162+
- clickhouse-server/users.d/00-overrides.yml
163+
set_fact:
164+
_user_configs: "{{
165+
_user_configs | default([]) + ((item is mapping) | ternary(
166+
[{'file': item.file, 'no_log': item.no_log | default(False)}],
167+
[{'file': item, 'no_log': False}]
168+
))
169+
}}" # noqa: jinja[spacing]
170+
loop: "{{ common_user_configs + clickhouse_user_files | default([]) }}"
171+
- name: Deploy clickhouse-server users overrides (requires restart)
169172
template:
170173
src: "{{ (item is mapping) | ternary(item.file, item) }}.j2"
171174
dest: "/etc/clickhouse-server/users.d/{{ (item is mapping) | ternary(item.file, item) | basename }}"
172175
owner: clickhouse
173176
group: clickhouse
174177
mode: "u=r,go="
175178
notify: restart-clickhouse
176-
no_log: "{{ (item is mapping) | ternary(item.no_log, False) }}"
177-
loop: "{{ clickhouse_user_files }}"
179+
no_log: "{{ item.no_log }}"
180+
loop: "{{ _user_configs }}"
178181
- name: Deploy dictionaries configuration (requires restart)
179182
template:
180183
src: "{{ item }}.j2"
@@ -185,6 +188,23 @@
185188
loop: "{{ clickhouse_dictionaries_config_files }}"
186189
notify: restart-clickhouse
187190

191+
- name: Cleanup stale server configuration files
192+
when: clickhouse_setup == "full"
193+
include_tasks: ./helpers/cleanup_stale_files.yml
194+
with_items:
195+
- cleanup_directory: /etc/clickhouse-server/config.d
196+
expected_files: "{{ _server_configs | map(attribute='file') | map('basename') }}"
197+
pattern: "*.yml"
198+
restart: true
199+
- cleanup_directory: /etc/clickhouse-server/users.d
200+
expected_files: "{{ _user_configs | map(attribute='file') | map('basename') }}"
201+
pattern: "*.yml"
202+
restart: true
203+
- cleanup_directory: "{{ clickhouse_dictionaries_config_path }}"
204+
expected_files: "{{ clickhouse_dictionaries_config_files | map('basename') }}"
205+
pattern: "*"
206+
restart: true
207+
188208
# format_schemas and top_level_domains by default are created by server process
189209
# according to `umask` server configuration parameter.
190210
# The role follows default ClickHouse umask value and gives full permissions to
@@ -223,6 +243,19 @@
223243
notify: restart-clickhouse
224244
loop: "{{ clickhouse_format_schema_files }}"
225245

246+
- name: Cleanup stale user files
247+
when: clickhouse_setup == "full"
248+
include_tasks: ./helpers/cleanup_stale_files.yml
249+
with_items:
250+
- cleanup_directory: "{{ clickhouse_top_level_domains_path }}"
251+
expected_files: "{{ clickhouse_top_level_domains_lists_files | map('basename') }}"
252+
pattern: "*"
253+
restart: true
254+
- cleanup_directory: "{{ clickhouse_format_schema_path }}"
255+
expected_files: "{{ clickhouse_format_schema_files | map('basename') }}"
256+
pattern: "*"
257+
restart: true
258+
226259
- name: Create clickhouse-server additional data directories
227260
file:
228261
dest: "{{ item.path }}"
@@ -269,3 +302,10 @@
269302
group: root
270303
loop:
271304
- clickhouse-client/config.xml
305+
- name: Cleanup stale format schemas
306+
include_tasks: ./helpers/cleanup_stale_files.yml
307+
with_items:
308+
- cleanup_directory: /etc/clickhouse-client/format_schemas
309+
expected_files: "{{ clickhouse_format_schema_files | map('basename') }}"
310+
pattern: "*"
311+
restart: false

0 commit comments

Comments
 (0)