-
Notifications
You must be signed in to change notification settings - Fork 1
/
clickhouse.py
131 lines (99 loc) · 3.48 KB
/
clickhouse.py
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
#!/usr/bin/python
# Copyright: (c) 2018, Denis Naumov <d.naumov@slurm.io>
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
DOCUMENTATION = r'''
---
module: clickhouse
short_description: This is clickhouse users management module
version_added: "1.0.0"
description: This is my longer description explaining my test module.
author:
- Denis Naumov (@coveredJaguar)
'''
EXAMPLES = r'''
# Pass in a message
- name: Connect to DBMS clickhouse and create user
clickhouse:
login_user: default
login_password: default
user: new username
password: new user's password
- name: Connect to DBMS clickhouse and delete user
clickhouse:
login_user: default
login_password: default
user: deleting username
state: absent
'''
RETURN = r'''
mutations:
description: List of executed mutation quieries
returned: always
type: list
sample: ['CREATE USER %(new_user)s {"new_user": "john"}']
version: '2.8'
'''
from contextlib import suppress
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils._text import to_native
CHClient = None
with suppress(ImportError):
from clickhouse_driver import Client as CHClient
def is_user_exist(ch_client, user):
return ch_client.execute("SELECT count() FROM system.users WHERE name = %(user)s", {"user": user})[0][0] > 0
def create_new_user(ch_client, user, password):
queries = []
if is_user_exist(ch_client, user):
return {"changed": False, "queries": queries}
query = "CREATE USER %(user)s IDENTIFIED BY %(password)s"
query_params = {"user": user, "password": password}
ch_client.execute(query, query_params)
queries.append(f"{query} {query_params}")
return {"changed": True, "queries": queries}
def delete_user(ch_client, user):
queries = []
if not is_user_exist(ch_client, user):
return {"changed": False, "queries": queries}
query = "DROP USER %(user)s"
query_params = {"user": user}
ch_client.execute(query, query_params)
queries.append(f"{query} {query_params}")
return {"changed": True, "queries": queries}
def main():
module_args = {
"login_user": {"type": "str", "required": True},
"login_password": {"type": "str", "required": True},
"user": {"type": "str", "required": True},
"password": {"type": "str", "required": False},
"state": {"type": "str", "required": False, "default": "new"}
}
result = {
"changed": False
}
module = AnsibleModule(
argument_spec=module_args,
supports_check_mode=True
)
if CHClient is None:
return module.fail_json("The clickhouse-driver module is required on host")
if module.check_mode:
module.exit_json(**result)
login_user = module.params["login_user"]
login_password = module.params["login_password"]
try:
ch_client = CHClient(host="localhost", user=login_user, password=login_password)
except Exception as e:
return module.fail_json(to_native(e))
state = module.params["state"]
user = module.params["user"]
if state == "new":
result = create_new_user(ch_client, user, module.params["password"])
elif state == "absent":
result = delete_user(ch_client, user)
else:
return module.fail_json(f"State {state} is unsupported by this module")
module.exit_json(**result)
if __name__ == '__main__':
main()