Salut la communauté !
Voilà j'ai un petit problème ... Encore
J'ai créer un script python pour supprimer les doublons de mon index, dans le but de comparer des IP (par doublons) si l'IP existe dans deux bases de données différentes alors ils apparaissent en double dans mon index. il me suffit ensuite de supprimer tous les doublons pour obtenir une liste des IPs n'apparaissant que dans une seul liste.
Voici le script:
from elasticsearch import Elasticsearch
# Settings
es = Elasticsearch('http://localhost:9000/')
def search_datas():
# Corp de la requête pour rechercher les doublons
search_query = {
"aggs": {
"dup": {
"terms": {
"size": 20000,
"field": "ip_commune.keyword",
"min_doc_count": 2
}
}
}
}
# La requête qui va chercher tous les doublons dans l'index 'index-ip'
search_result = es.search(index="index-ip", body=search_query, doc_type='doc',
filter_path=['aggregations.dup.buckets.key'])
new_datas = []
try:
datas = search_result.get('aggregations').get('dup').get('buckets')
for key in datas:
value = key.get('key')
new_datas.append(value)
return new_datas
except:
pass
def delete_datas(datas):
# Corp de la requête pour effacer tous les doublons
delete_query = {
"query": {
"terms": {"ip_commune.keyword": datas}
}
}
if datas != None:
# La requête qui va chercher tous les doublons dans l'index 'index-ip'
es.delete_by_query(index="index-ip",body=delete_query, doc_type='doc')
else:
print('Pas de doublons')
pass
delete_datas(search_datas())
J'aimerais pouvoir le lancer dès que ma config Logstash d'aggregations des IP est lancer.
j'avais pensé à quelque chose du genre du filtre ruby:
filter {
ruby{
path => "/root/scripts/py_scripts/ip_compare.py"
}
}
mais pour python
Deux point ce soulève alors,
- est-ce possible de lancer ip_compart.py depuis la config logstash genre :
# Fichier pour comparaison d'adresse IP
input {
jdbc {
jdbc_driver_library => "/usr/share/java/mysql-connector-java-8.0.15.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://glpi_server:3306/my_db?useSSL=true&verifyServerCertificate=false&requireSSL=true"
jdbc_user => "surcouche"
jdbc_password_filepath => "/etc/mysql-ssl/.pcw"
jdbc_validate_connection => "true"
tracking_column_type => "timestamp"
tracking_column => "date_mod"
tags => ["ip-glpi"]
# schedule => "* * * * *"
statement => "SELECT DISTINCT name as ip_commune FROM glpi_ipaddresses where name not in ('','::','::1','::1/128','0.0.0.0','127.0.0.1')"
clean_run => "true"
}
jdbc {
jdbc_driver_library => "/usr/share/java/mysql-connector-java-8.0.15.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://ipam_server:3306/my_db?useSSL=true&verifyServerCertificate=false&requireSSL=true"
jdbc_user => "surcouche"
jdbc_password_filepath => "/etc/mysql-ssl/.pcw"
jdbc_validate_connection => "true"
# schedule => "* * * * *"
tags => ["ip-ipam"]
statement => "SELECT DISTINCT ip_addr as ip_commune FROM devices"
clean_run => "true"
}
}
filter {
ruby{
path => "/root/scripts/py_scripts/ip_compare.py"
}
}
output {
if "ip-glpi" in [tags] or "ip-ipam" in [tags] {
elasticsearch {
hosts => ["127.0.0.1:9000"]
index => "index-ip"
}
}
}
- et si j'utilise une technique similaire le script ne risque t'il pas de se lancer avant le stockage des données dans Elasticsearch ?
Je me demande quelle serais la meilleurs solution ! si vous avez un avis, il est bienvenue ! =)