Archivi tag: Script Bash

tux-banner

BASH: il problema del costrutto while e OpenSSH

Capita spesso in BASH di realizzare un costrutto che iteri il comando OpenSSH; capita spesso che questo avvenga a partire da una WHILE READ in quanto questo non è altrimenti sostituibile con un FOR o con un parallel-ssh (es. il file di forma tabellare fornisce più di un parametro a OpenSSH).

Esempio

while read HOST USER CMD; do ssh $USER@$HOST "$CMD"; done < lista

Ebbene, quello che otteniamo è l’esecuzione dell’OpenSSH solo in corrispondenza della prima riga del file senza alcun tipo di evidenza di errore. Nella magiorparte dei casi viene data la colpa al costrutto WHILE o al comando READ.
Nulla di più falso!

Cosa accade in realtà?

Nella realtà accade che il comando OpenSSH legge da STDIN, e il corpo istruzioni del costrutto WHILE READ non maschera lo standard input del costrutto, pertanto i comandi all’interno del corpo istruzioni possono attingere al medesimo STDIN. Quindi alla prima esecuzione di OpenSSH, questo consuma l’intero STDIN, lasciando la successiva iterazione priva di altri dati, portandola conseguentemente a corretta conclusione.

Soluzione 1
Utilizzare l’opzione -n del comando OpenSSH

while read HOST USER CMD
do
ssh -n $USER@$HOST "$CMD"
done < lista

Soluzione 2 (valida per somandi anche differenti da OpenSSH)

while read HOST USER CMD
do
ssh $USER@$HOST "$CMD" < /dev/null
done < lista
BROCADE_fnl_TM

FabricOS e configurazioni

Nella gestione di una fabbrica fiber channel realizzata con switch Brocade (o assimilabili) si ha a che fare con il sistema FabricOS (ne abbiamo già parlato in un precedente articolo). Questo ha tutta una serie di comandi per creare e modificare la sua configurazione.

A differenza del Cisco IOS, nel FabricOS la sintassi di configurazione differisce dalla sintassi nella visualizzazione della configurazione stessa. Pertanto chi è abituato a Cisco IOS trova difficoltoso “copiare” una parte della configurazione da uno switch ad un altro osservandone semplicemente la configurazione tramite i comandi alishow, zoneshow e cfgshow.

È la classica situazione in cui si trova il sistemista che deve risolvere il conflitto di due fabbriche segmentate su una connessione ISL. La soluzione passa per la clonazione della configurazione su tutti gli switch interessati.

Il comando configupload, salvando la configurazione dello switch in un formato ASCII su un server FTP o via SCP, potrebbe tornarci utile (come in molti consigliano). Ma l’utilità si ferma al poter individuare  le differenze, e soltanto a patto di riordinare le righe della configurazione prima di eseguire tale ricerca.

Applicare le opportune modifiche non è cosa diretta.

Nel file (pur potendo scegliere tra configurazione intera e riduzione al  solo chassis o al solo switch) sono presenti informazioni non replicabili su tutti gli switch.

La replica della configurazione al fine di sanare una segmentazione deve considerare solo  alias, zone e configurazioni, non parametri dello chassis o dello switch che sono parametri univoci (e devono rimanere tali), come nome, indirizzo, id di dominio, ecc. Pertanto un file generato da uno switch non potrà essere caricato su di un altro, se non al fine di un disaster recovery.

Inoltre una zona (ad esempio) in questi file è espressa con la seguente:

zone.Prod1_C_CXPROD_SPA0:Prod1_Adapter_C;CX4_PROD_SPA0

che è cosa diversa dal comando per istruirla:

zonecreate "Prod1_C_CXPROD_SPA0", "Prod1_Adapter_C;CX4_PROD_SPA0"

La cosa ottimale sarebbe poter avere una traduzione del formato del file di configurazione scaricato dallo switch reputato “modello” e poterla replicare sugli altri dopo averli ripuliti con il comando cfgclear (come molti tutorial insegnano).

Pertanto ci sarà molto utile il seguente script, progettato proprio a questo scopo:

#!/bin/bash
#
# usage: create_FOS_config.sh
#
#
awk -F. '/^alias/{ print "alicreate \""substr($2,1, index($2,":") - 1)"\", \"" substr($2, index($2,":") + 1)"\"" }' $1 | sort -k2
awk -F. '/^zone/ { print "zonecreate \""substr($2,1, index($2,":") - 1)"\", \"" substr($2, index($2,":") + 1)"\"" }' $1 | sort -k2
awk -F. '/^cfg/ { print "cfgcreate \""substr($2,1, index($2,":") - 1)"\", \"" substr($2, index($2,":") + 1)"\"" }' $1

L’ordinamento impostato nell’elenco degli alias e delle zone potrà essere utile per un esame manuale del contenuto di questa parte della configurazione una volta caricata.

Spero possa essere utile.