Matteo Vignoli

Sviluppatore Web Full-Stack autodidatta, curioso per natura,
attualmente impiegato a Milano presso ContactLab per conto di Anoki S.r.L.

Automazioni quotidiane: controllare un log remoto con python e paramiko

  Tempo di lettura:

Una dei motivi per cui python mi appassiona sempre di più - oltre alla semplicità della sintassi - è la rapidità con cui si può buttare giù uno script che utilizza librerie anche complesse, debuggarlo al volo senza troppi fronzoli e osservare con quale leggerezza di byte ed esistenziale lo script fa il suo dovere. 👍

Questi sono alcuni dei motivi per cui in molti lo usano per automatizzare quelle operazioni quotidiane che portano via tempo e portano con sé noia, come rinominare file in batch o eseguire azioni ripetitive - si trovano ovunque, infatti, esempi di utilizzo di python per azioni di questo tipo, dai vari thread su Reddit ad un intero libro dedicato all'automazione delle attività più noiose.

Ho pensato bene anch'io, quindi, di approfittarne per risparmiare quel quarto d'ora che perdevo ogni mattina per monitorare alcuni log di applicativi in produzione scrivendo uno script che si collega alle macchine remote, legge i log giornalieri e, in base a delle regole specifiche per ogni applicativo, verifica che i processi abbiamo girato correttamente, all'orario stabilito, e ne controlla le numeriche.

Collegarsi via SSH con Paramiko

Una dei punti critici era quello di accedere a dei log su una macchina remota accessibile solo dalla rete interna tramite autenticazione. Dopo una veloce ricerca ho visto che una delle librerie più usate era paramiko, una implementazione in puro python del protocollo SSH2 con una bella documentazione e con quella che sembra una buona community alle spalle.

Poche righe di codice dopo e sono già in grado di eseguire comandi bash sul server remoto per leggere il contenuto del log:

import paramiko, re
from datetime import date
from config import config
  
data_log = date.todaty().strftime('%Y/%m/%d')
comando = 'tail /path/to/logs/{}/my_app.log'.format(data_log)

with paramiko.SSHClient() as ssh:
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(config['hostname', config['port'], config['username'], config['password'])
    stdin, stdout, stderr = ssh.exec_command(comando)   

In questo banalissimo script uso paramiko per connettermi via ssh (utilizzando username e password, ma l'ideale sarebbe un'autenticazione con chiave pubblica/privata, avendone la possibilità) ed eseguire un semplice comando in bash - qui un tail perchè ho bisogno solo di leggere solo le ultime righe, ma per altri log uso senza problemi cat o less, magari con un grep per filtrare già in partenza le righe da elaborare poi in python:


comando = 'less /path/to/logs/{}/my_app.log | grep espressione_filtro'.format(data_log)
reg_exp = re.compile("(?P<orario>(\d{2}:\d{2}:\d{2}\.\d{3})\s)", re.I) #esempio di regex

with paramiko.SSHClient() as ssh:
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(config['hostname', config['port'], config['username'], config['password'])
    stdin, stdout, stderr = ssh.exec_command(comando)
    
    risultati = []
    for riga in stdout.readlines():
       for gruppo in reg_exp.finditer(riga):
          risultati.append(gruppo.groupdict())
          

Questo ovviamente è solo un esempio - mancano i vari controlli, i report finali, ecc. ma è evidente come, in poche righe e pochissime ore di sviluppo, sia riuscito a sgravarmi da un'operazione ripetitiva che mi occupava un buon quarto d'ora ogni mattina, tutti i giorni lavorativi.

Il prossimo step è implementare una reportistica un po' più dettagliata (magari in html) da inviare via mail, rendere facilmente configurabile ed estendibile lo script e, soprattutto, renderlo portabile anche in ambienti dove non è possibile installare librerie aggiuntive: ho iniziato a sperimentare con PyInstaller e, nonostante le limitazioni relativamente all'OS e alla versione di python, sembra davvero molto promettente.

I "side project" di un programmatore

A quale progetto personale (side project) si stia lavorando è probabilmente uno degli argomenti di conversazione più frequenti usato dai programmatori di tutto il mondo, ed...

Ricevere una notifica Telegram quando il servizio mysql è down

Telegram, con i suoi bot e canali, è uno strumento estremamente versatile che si presta molto bene ad essere utilizzato come endpoint per ricevere warning e...

MatteoVignoli.it   Non perderti nulla da MatteoVignoli.it, ricevi aggiornamenti via mail.