Lancer un script python depuis une config Logstash

stack-monitoring
(Axel Dujardin) #1

Salut la communauté !

Voilà j'ai un petit problème ... Encore :smiley:
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 :confused:

Deux point ce soulève alors,

  1. 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"
	}
    }
}
  1. 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 ? :confused:

Je me demande quelle serais la meilleurs solution ! si vous avez un avis, il est bienvenue ! =)

(Gabriel Tessier) #2

Bonjour,
Y'a une discussion similaire ici juste au cas ou.

(system) closed #3

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.