feat: manage role
This commit is contained in:
parent
30f4484bd6
commit
98769717c4
7 changed files with 173 additions and 3 deletions
library
126
library/elasticsearch_role.py
Normal file
126
library/elasticsearch_role.py
Normal file
|
@ -0,0 +1,126 @@
|
|||
#!/usr/bin/python
|
||||
|
||||
from ansible.module_utils.basic import *
|
||||
from ansible.module_utils.elasticsearch_api import *
|
||||
|
||||
class ElasticsearchRole:
|
||||
def __init__(self, api_url, api_user, api_password, name, cluster, indices):
|
||||
self.api = ElasticsearchApi(
|
||||
api_url,
|
||||
api_user,
|
||||
api_password
|
||||
)
|
||||
self.api_url = api_url
|
||||
self.name = name
|
||||
self.cluster = cluster
|
||||
self.indices = indices
|
||||
self.exist = False
|
||||
self.data = {}
|
||||
|
||||
def get_data(self):
|
||||
status_code, data = self.api.get('_security/role/{}'.format(self.name))
|
||||
if status_code == 200:
|
||||
self.exist = True
|
||||
self.data = data[self.name]
|
||||
|
||||
def array_has_changed(self, list1, list2):
|
||||
for item in list1:
|
||||
if item not in list2:
|
||||
return True
|
||||
|
||||
for item in list2:
|
||||
if item not in list1:
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def cluster_has_changed(self):
|
||||
return self.array_has_changed(self.cluster, self.data['cluster'])
|
||||
|
||||
def same_indice(self, indice1, indice2):
|
||||
if self.array_has_changed(indice1['names'], indice2['names']):
|
||||
return False
|
||||
|
||||
if self.array_has_changed(indice1['privileges'], indice2['privileges']):
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def indices_have_changed(self):
|
||||
for indice1 in self.indices:
|
||||
exist = False
|
||||
for indice2 in self.data['indices']:
|
||||
if self.same_indice(indice1, indice2):
|
||||
exist = True
|
||||
break
|
||||
if not exist:
|
||||
return True
|
||||
|
||||
for indice1 in self.data['indices']:
|
||||
exist = False
|
||||
for indice2 in self.indices:
|
||||
if self.same_indice(indice1, indice2):
|
||||
exist = True
|
||||
break
|
||||
if not exist:
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def has_changed(self):
|
||||
if self.cluster_has_changed():
|
||||
return True
|
||||
|
||||
if self.indices_have_changed():
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def create(self):
|
||||
self.api.put(
|
||||
'_security/role/{}'.format(self.name),
|
||||
{
|
||||
'cluster': self.cluster,
|
||||
'indices': self.indices
|
||||
}
|
||||
)
|
||||
|
||||
def delete(self):
|
||||
self.api.delete('_security/role/{}'.format(self.name))
|
||||
|
||||
|
||||
def main():
|
||||
fields = {
|
||||
'name': { 'type': 'str', 'required': True },
|
||||
'indices': { 'type': 'list', 'default': [] },
|
||||
'cluster': { 'type': 'list', 'default': [] },
|
||||
'api_url': { 'type': 'str', 'default': 'http://127.0.0.1:9200' },
|
||||
'api_user': { 'type': 'str', 'default': None },
|
||||
'api_password': { 'type': 'str', 'default': None, 'no_log': True },
|
||||
'state': { 'type': 'str', 'default': 'present', 'choice': ['present', 'absent'] },
|
||||
}
|
||||
module = AnsibleModule(argument_spec=fields)
|
||||
changed = False
|
||||
|
||||
role = ElasticsearchRole(
|
||||
module.params['api_url'],
|
||||
module.params['api_user'],
|
||||
module.params['api_password'],
|
||||
module.params['name'],
|
||||
module.params['cluster'],
|
||||
module.params['indices'],
|
||||
)
|
||||
role.get_data()
|
||||
|
||||
if module.params['state'] == 'present':
|
||||
if not role.exist or role.has_changed():
|
||||
role.create()
|
||||
changed = True
|
||||
elif user.exist:
|
||||
role.delete()
|
||||
changed = True
|
||||
|
||||
module.exit_json(changed=changed)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
Loading…
Add table
Add a link
Reference in a new issue