Guida MikroTik
Sistema e alta affidabilitàAvanzato

Scripting RouterOS: variabili, cicli e gestione errori

Guida pratica al linguaggio di scripting di RouterOS v7: variabili, array, condizioni :if, cicli :foreach e :for, funzioni, e gestione robusta degli errori con :do/on-error, per automazioni affidabili.

Il linguaggio di scripting di RouterOS permette di automatizzare praticamente qualsiasi operazione: failover, manutenzioni, notifiche, sincronizzazioni. Padroneggiarne le basi (variabili, cicli, condizioni e soprattutto la gestione degli errori) è il passo che separa uno script 'che a volte funziona' da un'automazione di produzione affidabile.

Variabili: :local, :global e tipi

Dichiarazione e uso delle variabili
# :local — visibile solo nello script/funzione corrente (usalo quasi sempre)
:local nome "CORE-NAPOLI-01"
:local soglia 90
:local attivo true

# :global — persiste tra script ed esecuzioni (usalo con parsimonia)
:global ultimoBackup [/system/clock get date]

# Interpolazione in stringhe e concatenazione
:local msg ("Router " . $nome . " soglia=" . $soglia)
:put $msg

# Conversioni di tipo esplicite
:local n [:tonum "42"]
:local s [:tostr 42]

Condizioni :if con else

:if / else
:local cpu [/system/resource get cpu-load]

:if ($cpu > 90) do={
    :log warning "CPU critica: $cpu%"
} else={
    :if ($cpu > 70) do={
        :log info "CPU elevata: $cpu%"
    } else={
        # tutto ok, nessun log
    }
}

Cicli: :foreach, :for e :while

Iterare su oggetti e numeri
# :foreach — itera sugli ID restituiti da find (uso più comune)
# Esempio: logga ogni interfaccia che è down
:foreach i in=[/interface/find where running=no] do={
    :local nome [/interface get $i name]
    :log warning ("Interfaccia DOWN: " . $nome)
}

# :for — ciclo numerico
:for n from=1 to=5 do={
    :put ("iterazione " . $n)
}

# :while — ripeti finché la condizione è vera (attento ai loop infiniti)
:local i 0
:while ($i < 3) do={
    :put $i
    :set i ($i + 1)
}

Array e dizionari

Liste e mappe chiave-valore
# Array semplice
:local server {"0.it.pool.ntp.org"; "1.it.pool.ntp.org"}
:foreach s in=$server do={ :put $s }

# Array associativo (dizionario)
:local soglie {"cpu"=90; "mem"=20; "temp"=70}
:put ($soglie->"cpu")

# Numero di elementi
:put [:len $server]

Gestione degli errori: :do { } on-error={ }

Senza gestione errori, un comando che fallisce (es. host irraggiungibile, file inesistente) interrompe lo script: nelle automazioni questo significa operazioni lasciate a metà. Il costrutto :do { ... } on-error={ ... } cattura l'errore e ti permette di reagire (loggare, riprovare, notificare).

Pattern try/catch in RouterOS
# Prova a inviare un'email; se fallisce, logga invece di bloccare tutto
:do {
    /tool/e-mail send to="noc@dominio.it" subject="Test" body="ok"
    :log info "Email inviata con successo"
} on-error={
    :log error "Invio email FALLITO, controllare /tool/e-mail"
}

# Retry: prova fino a 3 volte con pausa tra i tentativi
:local ok false
:for try from=1 to=3 do={
    :if (!$ok) do={
        :do {
            /tool/fetch url="https://example.com/health" as-value output=user
            :set ok true
        } on-error={
            :log warning ("Tentativo $try fallito, riprovo")
            :delay 5s
        }
    }
}

Funzioni riutilizzabili

Definire e richiamare una funzione
# Definisci una funzione globale che logga e ritorna un valore
:global cpuAlta do={
    :local soglia $1
    :local cpu [/system/resource get cpu-load]
    :if ($cpu > $soglia) do={
        :log warning ("CPU oltre soglia: " . $cpu . "%")
        :return true
    }
    :return false
}

# Richiamala passando un argomento posizionale
:put [$cpuAlta 80]
Best practice di scripting: (1) usa SEMPRE :local salvo necessità reale di :global (le globali sopravvivono e creano effetti collaterali difficili da debuggare); (2) avvolgi nelle automazioni ogni operazione 'che può fallire' in :do/on-error; (3) logga con livelli sensati (:log info/warning/error) così il syslog racconta cosa è successo; (4) testa lo script con /system/script run PRIMA di metterlo nello scheduler; (5) assegna allo script solo le policy minime necessarie. Evita :delay lunghi negli script schedulati: bloccano lo scheduler.
scriptingscriptlinguaggiovariabililocalglobalarrayforeachforwhileifdo on-erroronerrorfunzionifindautomazioneRouterOS

Configura senza fatica con l'AI

In WispOS l'agente AI genera la configurazione RouterOS dalle tue parole e un tutor ti guida passo passo.

Prova WispOS