AUTOMAZIONE DEI PROCESSI

Precedente
Programma
Seguente
Lo Zen e l'arte dell'automazione del sistema

Unix è un sistema operativo nato nei primi anni 70, grazie all'opera di due monumenti dell'informatica quali Ken Thompson, Dennis Ritchie (l'inventore del C, per intenderci) e vari altri.
Uno dei motivi che rende Unix un sistema operativo attuale e perfettamente adattabile a sistemi che ai tempi non si concepivano neppure è la usa filosofia di base: KISS (Keep It Simple, Stupid).
E' il principio dei tanti piccoli mattoni, ognuno necessario per fare bene un compito specifico, messi insieme per fare compiti più complessi. Questo approccio facilita il troubleshooting, riduce i tempi di sviluppo, non dovendo "reinventare la ruota" ogni volta, e, evidentemente, permette una scalabilità e una adattabilità ineguagliate.

La shell è un interprete di comandi che funge sia da layer fra il kernel del sistema operativo e l'utente sia come linguaggio di programmazzione avanzato.
Un programma in shell è chiamato script e presenta un metodo facile e veloce per automatizzare operazioni ripetitive.
Conoscere lo shell scripting language e saperlo applicare per risolvere problemi di ordinaria e straordinaria amministrazione è una delle funzioni basilari del system administrator.

Saper scrivere uno script shell non è complicato, poichè la sintassi è semplice e la filosofia su cui bisogna basarsi nella realizzazione è la stessa dalla quale nasce unix: spezzare un progetto laborioso in tanti e semplici task.

Un bravo e produttivo sistemista Unix, quindi, è colui in grado di mettere insieme i mattoni che gli servono, creando script di "collante" che inglobano altri script con funzioni specifiche, magari pure scritti in linguaggi diversi.
E' colui che è pienamente consapevole che la macchina è al suo servizio e non viceversa, che ne può vedere e cambiare gli elementi con un semplice vi, che riesce a non ripetere due volte la stessa operazione, perchè la prima volta che l'ha fatto ha già creato uno script che lo fa per lui.

L'arte dell'automazione dei processi è strettamente legata alla conoscenza dalla bash (o della shell che si utilizza) e delle sue capacità di scripting.
I principi di massima per impratichirsi sono semplici:
- Avere obiettivi chiari, facendosi un percorso logico dei processi da effettuare;
- Guardare gli script esistenti scritti da altri, notare come vengono affrontati i problemi, come si usano le variabili e i cicli logici;
- Impratichirsi costantemente;
- Approfondire lo studio delle opzioni dei programmi che servono. Spesso risolvono molti problemi e aprono nuove prospettive sui risultati che si possono raggiungere.

Una distribuzione Linux è di fatto un insieme di script e comandi (e il kernel, ovviamente), ed è un'ottima fonte di apprendimento di tecniche di scripting e automazione.

Esempio script shell
Ecco un esempio di semplice script shell per la compilazione di Openssh in una RedHat linux.
# script shell per compilazione di openssh [12-06-2001] Il simbolo # identifica un commento.
E' preferibile intitolare con poche parole lo script per rendere più facilmente intuibile la funzione di tale script. Inoltre specificare la data di creazione potrebbe evitare problemi di aggiornamenti dello script stesso
#!/bin/sh Invocazione dell'interprete dello script in questo caso è sh
OPT_CONFIGURE="--prefix=/usr --sysconfdir=/etc/ssh --with-openssl --with-pam --with-md5-passwords --with-tcp-wrappers"
EXTRA_VERSION=backup
ALLOW_IP="10.0.0.0/255.255.255.0"

Assegnazione di valori ripetitivi a delle variabili, per avere semplificazioni sia in fase di stesura sia in fase di upgrade o modifica di parametri.
In questo caso si assegna a OPT_CONFIGURE le opzioni del comando configure, EXTRAVERSION sarà un ulteriore estensione della directory di backup dei file di configurazione ed in ALLOW_IP si definiscono gli ip da cui si potrà accedere via ssh

function COMPILE ()
{
echo "BACKUP OLD CONFIGURATION"
cp -Rf /etc/ssh /etc/ssh.$EXTRA_VERSION
echo " Clean Directory..."
make clean
echo " START WITH GCC..."
./configure $OPT_CONFIGURE
make
make install
}
Inizializzazione della prima funzione di questo script. In questo caso particolare la funzione si chiama COMPILE e contiene tutti i comandi per poter compilare i sorgenti e backuppare i file di configurazione.
function COPY ()
{
echo "COPY INIT SCRIPT..."
cp contrib/redhat/sshd.init /etc/rc.d/init.d/sshd
echo "COPY PAM FILE..."
cp contrib/redhat/sshd.pam /etc/pam.d/sshd
}
Inizializzazione della funzione COPY, creata per eseguire la copia di file necessari per il corretto funzionamento di Openssh.
function IP ()
{
echo "OPEN PORT TO $ALLOW_IP"
echo "sshd: $ALLOW_IP" >> /etc/hosts.allow
echo CLOSE PORT 22 AT UNKNOW HOST
echo "sshd: ALL" >> /etc/hosts.deny
}
Inizializzazione della funzione IP, creata per aggiungere la corretta configurazione per abilitare i tcpwrappers
echo "--------------------------------------------------"
echo " !!! WARNING !!! RUN THIS SCRIPT IN SRC DIR "
echo "--------------------------------------------------"
echo ""
echo " DO YOU WANT RUN SSHD BY...?"
echo ""
echo " - INETD -----> INETD "
echo " - X -----> XINETD "
echo " - DAEMON ---> ...AS DAEMON "
echo " - UP -------> UPDATE OPENSSH "
read a

Visualizza a video un menu all'avvio dello script per rendere interattiva la scelta delle varie possibilità offerte dallo script.
Da evidenziare l'ultima riga: read a
Questa linea ci permette di redirezionare lo STDIN nella variabile a, in questo caso il valore verrà assegnato dall'utente.

case "$a" in
Il comando case ci permette di assegnare specifici comandi a seconda del valore che assume la variabile a
inetd | INETD )
COMPILE
cp -f /etc/inetd.conf /etc/inetd.conf.orig
echo "ADD SERVICE TO INETD..."
echo " ssh stream tcp nowait root /usr/sbin/tcpd /usr/sbin/sshd -i" >> /etc/inetd.conf
IP
COPY ;;

Se il valore di a è inetd o INETD esegue i comandi e le chiamate alle funzioni richimate fino al doppio punto e virgola ;;

Nel seguente caso viene richiamata la funzione COMPILE e si esegue una copia di backup del file di configurazione di inet.
Dopo di che si aggiunge la riga di configurazione per inet e vengono richiamate le funzioni IP e COPY

x | X )
COMPILE
touch /etc/xinetd.d/ssh
echo " # describe : OPENSSH DAEMON" >>/etc/xinetd.d/ssh
echo "service ssh" >>/etc/xinetd.d/ssh
echo " "
echo " {" >>/etc/xinetd.d/ssh
echo " socket_type = stream" >>/etc/xinetd.d/ssh
echo " protocol = tcp" >>/etc/xinetd.d/ssh
echo " instances = 10" >>/etc/xinetd.d/ssh
echo " nice = 10" >>/etc/xinetd.d/ssh
echo " wait = no" >>/etc/xinetd.d/ssh
echo " user = root" >>/etc/xinetd.d/ssh
echo " server = /usr/sbin/sshd" >>/etc/xinetd.d/ssh
echo " server_args = -i" >>/etc/xinetd.d/ssh
echo " "
echo " }" >>/etc/xinetd.d/ssh
IP
COPY ;;
Nel caso in cui a assuma il valoredi a è pari a x o X si esegue la compilazione dei sorgenti, si crea il file di configurazione per permettere ad xinetd di gestire il demone ssh e di seguito vengono richiamate le funzioni IP e COPY
daemon | DAEMON )
COMPILE
COPY ;;
Nel caso in cui il valore di a è pari a daemon o DAEMON si eseguono solo le funzioni di COMPILE E COPY
up | UP )
COMPILE
esac
Nel caso in cui il valore di a è pari a up o UP si esegue la funzione COMPILE.
Da sottolineare la presenza di esac che chiude il ciclo di case