<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mia mamma usa Linux!</title>
	<atom:link href="http://www.miamammausalinux.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.miamammausalinux.org</link>
	<description>Perché niente è impossibile da capire... Se lo spieghi bene !</description>
	<lastBuildDate>Mon, 02 Jan 2012 11:31:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Incron: monitorare directory e rispondere ad eventi specifici</title>
		<link>http://www.miamammausalinux.org/2011/10/monitorare-directory-e-rispondere-ad-eventi-specifici/</link>
		<comments>http://www.miamammausalinux.org/2011/10/monitorare-directory-e-rispondere-ad-eventi-specifici/#comments</comments>
		<pubDate>Mon, 31 Oct 2011 09:13:15 +0000</pubDate>
		<dc:creator>Matteo Cappadonna</dc:creator>
				<category><![CDATA[Generale]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Utility]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=1488</guid>
		<description><![CDATA[Con questo articolo vedremo come, utilizzando un tool che dialoga direttamente con il kernel Linux, monitorare un particolare path e rispondere ad alcuni eventi lanciando diversi comandi. Come al solito mi piace analizzare una problematica reale per far comprendere meglio il problema e la soluzione che andremo ad implementare. Immaginiamo di avere una macchina Linux [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2011/10/inotify.png" alt="inotify" title="inotify" width="137" height="50" class="size-full wp-image-1499" /></p>
<p>Con questo articolo vedremo come, utilizzando un tool che dialoga direttamente con il kernel Linux, monitorare un particolare path e rispondere ad alcuni eventi lanciando diversi comandi.</p>
<p>Come al solito mi piace analizzare una problematica reale per far comprendere meglio il problema e la soluzione che andremo ad implementare.</p>
<p>Immaginiamo di avere una macchina Linux (in questo caso specifico andremo ad utilizzare un server CentOS) attestata sulla rete perimetrale/pubblica della nostra azienda.</p>
<p>Questa macchina ha delle directory utente che vengono utilizzate, da procedure automatiche presenti su server remoti di altre aziende, per caricare dei file che la nostra azienda ha necessità di elaborare.</p>
<p>La soluzione &#8220;quick &amp; dirty&#8221; sarebbe quella di accordarsi con l&#8217;azienda che caricherà il file sul nostro sistema sull&#8217;ora e definire una seguente procedura:</p>
<ul>
<li>Alle ore 00:00 viene avviato il trasferimento del file (di dimensione variabile) tramite scp</li>
<li>Alle ore 01:00 viene avviato tramite cron un job che prende il file e lo elabora</li>
</ul>
<p>Questa soluzione tendenzialmente può funzionare, ma possono verificarsi diversi problemi che possono bloccare la nostra procedura. Per esempio:</p>
<ul>
<li>Un problema sulle procedure dell&#8217;azienda remota tardano o falliscono, facendo slittare l&#8217;upload del file di più di un&#8217;ora. In questo caso il nostro job in partenza alle 01:00 fallirà poiché non troverà il file caricato.</li>
<li>Sempre un problema sulle procedure dell&#8217;azienda remota fa tardare l&#8217;avvio dell&#8217;upload del file. In questo caso, quando il nostro job parte, potrebbe tentare di elaborare un file non ancora completo</li>
<li>Le procedure partono correttamente ma, un lag di rete dato da N possibili motivi, fa allungare il tempo di trasferimento del file. Anche qui il nostro job potrebbe tentare di elaborare un file non ancora completamente trasferito.</li>
<li>Delle modifiche alle procedure remote fanno variare il nome del file (che era stato precedentemente accordato). In questo caso, anche se il trasferimento è completo, il nostro script (se non correttamente ingegnerizzato) potrebbe non trovare il file semplicemente perché non si chiama come ci si aspetterebbe</li>
<li>Sempre per modifiche alle procedure remote, il file potrebbe arrivare non normalizzato (quindi con permission sballate, etc.). In questo caso, magari, il nostro script potrebbe non essere in grado di leggere/scrivere o, più in generale, di elaborare il file</li>
</ul>
<p>Come appare evidente, le problematiche possono essere molteplici!!!<br />
Fortunatamente stiamo lavorando su linux e, il più delle volte, ci viene data la possibilità di risolvere i nostri problemi con un po&#8217; di ingegno!</p>
<p><strong>inotify</strong></p>
<p>inotify è un sottosistema del kernel linux che lavora a livello di filesystem e ci permette, a fronte di alcuni eventi catturati, di notificare le variazioni all&#8217;applicazione.<br />
E&#8217; stato incluso nel mainstream del kernel linux con la versione 2.6.13 (rilasciata a Giugno 2005), ma può essere compilato con la versione 2.6.12 (e precedenti), tramite l&#8217;utilizzo di una patch.</p>
<p>In poche parole, dato un path, il sottosistema ne controlla gli inode puntati, e reagisce ad uno o più eventi su essi. A fronte dello scatenarsi di un evento (definito <strong>mask</strong> &#8211; maschera), possono essere eseguite delle operazioni.</p>
<p>Alcuni eventi che possono essere monitorati sono i seguenti:</p>
<ul>
<li><strong>IN_ACCESS</strong> &#8211; E&#8217; stato fatto un&#8217;accesso in lettura ad un file</li>
<li><strong>IN_MODIFY</strong> &#8211; E&#8217; stata eseguita una modifica ad un file</li>
<li><strong>IN_ATTRIB</strong> &#8211; E&#8217; stata eseguita una modifica agli attributi di un file</li>
<li><strong>IN_OPEN</strong> &#8211; Un file è stato aperto</li>
<li><strong>IN_CLOSE_WRITE</strong> &#8211; Un file, aperto in scrittura, è stato chiuso</li>
<li><strong>IN_CLOSE_NOWRITE</strong> &#8211; Un file, aperto NON in scrittura, è stato chiuso</li>
<li><strong>IN_MOVED_FROM</strong> e <strong>IN_MOVED_TO</strong> &#8211; Un file è stato spostato o copiato</li>
<li><strong>IN_DELETE</strong> &#8211; Un file/directory è stato cancellato</li>
<li><strong>IN_CREATE</strong> &#8211; Un file/directory è stato creato</li>
<li><strong>IN_DELETE_SELF</strong> &#8211; Il file/directory monitorato è stato cancellato</li>
</ul>
<p><strong>incrond</strong></p>
<p>incrond è un demone che funziona in maniera molto simile a quello che è l&#8217;ormai conosciutissimo demone cron; la differenza sta nel fatto che, se cron lavora con giorni ed orari, incrond lavora invece con inotify.</p>
<p>Quello che possiamo fare per rendere la nostra procedura &#8220;intelligente&#8221; è andare a monitorare il path in cui l&#8217;azienda remota esegue l&#8217;upload del file e, al termine dell&#8217;upload, lanciare il job che elabora il file.<br />
Questo ci permette di evitare di legarsi a gli orari, e di lanciare il nostro job ogni volta che un file viene caricato, indipendentemente dall&#8217;ora o dal nome del file. Esattamente quello che ci interessa.</p>
<p>Intanto andiamo ad installare il demone, operazione estremamente semplice:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># yum install incrond</pre></div></div>

<p>A questo punto, la prima cosa da fare è creare il file /etc/incrond.allow contenente la lista degli utenti abilitati all&#8217;uso di incrond. Nel nostro caso abilitiamo l&#8217;utente <em>root</em> e l&#8217;utente <em>matteo</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># cat &gt; /etc/incrond.allow &lt;&lt;EOF
&gt;root
&gt;matteo
&gt;EOF
# cat /etc/incrond.allow
root
matteo</pre></div></div>

<p>Avviamo il demone ed assicuriamoci che sia abilitato per l&#8217;avvio automatico al boot della macchina:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># service incrond start
Starting incrond:                                          [  OK  ]
# chkconfig --list incrond
incrond        	0:off	1:off	2:off	3:off	4:off	5:off	6:off
# chkconfig incrond on</pre></div></div>

<p>Ok, adesso siamo pronti per il definire il nostro monitoraggio.</p>
<p>Poniamo, nel nostro esempio, che l&#8217;utente <em>matteo</em> sia l&#8217;utente che carica il file, e che lo carica nel path /home/matteo/uploads.</p>
<p>Iniziamo a definire la incrontab (vedrete che l&#8217;assonanza con cron non è solo nelle definizioni, ma anche nei comandi) per l&#8217;utente matteo. Il comando è semplicissimo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># su - matteo
$ incrontab -e</pre></div></div>

<p>Questo apre il nostro editor di default e ci permette di compilare la incrontab.<br />
Questa incrontab è composta da 3 campi (che vedremo di seguito) separati da spazio</p>
<p><strong>ATTENZIONE</strong> &#8211; I campi DEVONO essere separati dal carattere di spaziatura. Separare i campi con il consueto TAB porta a problemi di interpretazione della incrontab da parte del demone incrond (dai, è tutto molto bello, un piccolo difetto lo possiamo anche concedere <img src='http://www.miamammausalinux.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ).</p>
<p>I tre campi sono, nell&#8217;ordine:</p>
<ul>
<li><strong>path</strong> &#8211; Il path ASSOLUTO che si desidera monitorare</li>
<li><strong>mask</strong> &#8211; L&#8217;evento che si vuole monitorare. Sono supportati tutte le maschere che sono state descritte prima, più la maschera IN_ALL_EVENTS che, semplicemente, cattura tutti gli eventi (ottima per il debugging)</li>
<li><strong>command</strong>- Il comando da eseguire quando viene catturato l&#8217;evento. Da notare che in questo comando possiamo utilizzare delle variabili di inotify che ci vengono passate direttamente dal demone. Queste variabili sono:
<ul>
<li><strong>$@</strong> &#8211; Il path monitorato</li>
<li><strong>$#</strong> &#8211; Il file sul quale si è scatenato l&#8217;evento</li>
<li><strong>$%</strong> &#8211; L&#8217;evento, in forma testuale, che si è verificato</li>
<li><strong>$&amp;</strong> &#8211; L&#8217;evento, in forma numerica, che si è verificato</li>
<li><strong>$$</strong> &#8211; Il carattere $</li>
</ul>
</li>
</ul>
<p>Semplice, non trovate?</p>
<p>Allora, torniamo all&#8217;esempio. Il nostro job si trova nella directory /home/matteo/scripts/, si chiama <em>elaborazione.sh</em> ed accetta come parametro il nome del file da elaborare.</p>
<p>Facciamo un&#8217;attimo il punto della situazione. In un certo momento (non sappiamo quale), la procedura remota andrà a caricare, con scp, il nostro file.<br />
Una volta effettuata la connessione con successo, il file verrà in primo luogo creato (IN_CREATE), aperto in scrittura (IN_OPEN), scritto (una sequenza di IN_MODIFY) ed infine chiuso (IN_CLOSE_WRITE, visto che era stato aperto in scrittura).</p>
<p>Quindi, l&#8217;evento che andrà a determinare la fine del trasferimento è IN_CLOSE_WRITE. Andiamo quindi a compilare la incrontab dell&#8217;utente matteo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">/home/matteo/uploads IN_CLOSE_WRITE /home/matteo/scripts/elaborazione.sh $@/$#</pre></div></div>

<p>Salviamo usciamo ed assicuriamoci che la nuova incrontab sia stata letta ed interpretata dal sistema:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">table updated
$ exit
# tail -1 /var/log/cron
Oct 27 10:30:39 myserver incrond[889]: table for user matteo changed, reloading</pre></div></div>

<p>Possiamo testare se funziona caricando un dummy file (supponiamo che i file contenti il testo &#8220;dummy&#8221; vengano ignorati dal nostro script) da una macchina remota:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">client$ cat &gt; dummyfile &lt;&lt;EOF
&gt;dummy
&gt;EOF
client$ cat dummyfile
dummy
client$ scp dummyfile matteo@myserver:uploads/
Password:</pre></div></div>

<p>Torniamo sul server e, dal log di cron, vediamo che incrond ha catturato l&#8217;evento ed ha eseguito il nostro elaboratore:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># tail -1 /var/log/cron
Oct 27 10:35:43 myserver incrond[889]: (matteo) CMD (/home/matteo/scripts/elaborazione.sh /home/matteo/uploads/dummyfile)</pre></div></div>

<p>&nbsp;</p>
<p><strong>Conclusioni</strong></p>
<p>Abbiamo visto come installare e configurare incrond per monitorare il cambio di stato di un file in una directory.<br />
Questa è una possibile soluzione pratica ad un problema che, tendenzialmente, si verifica abbastanza di frequente in ambienti enterprise, in cui ci sono flussi di lavoro locali/remoti che devono lavorare in relazione gli uni con gli altri.</p>
<p>In realtà, gli utilizzi di inotify sono estremamente ampi; per esempio, è il sistema che viene normalmente utilizzato dagli indicizzatori di filesystem su linux (per esempio, Beagle di SUSE).<br />
Andando a monitorare l&#8217;intero filesystem (/) ed avendo le notifiche sulle modifiche di qualsiasi file al suo interno, l&#8217;indicizzatore può aggiornare i suoi database senza doversi rileggere l&#8217;intero filesystem.</p>
<p>Un&#8217;altro utilizzo può essere quello di monitorare il file di log di un&#8217;applicazione. Quando questa applicazione andrà a loggare qualcosa, possiamo mandare una mail contenente il file di configurazione a qualcuno.</p>
<p>Il limite è il vostro ingegno <img src='http://www.miamammausalinux.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2011/10/monitorare-directory-e-rispondere-ad-eventi-specifici/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Configurare Nagios per ricevere Trap SNMP</title>
		<link>http://www.miamammausalinux.org/2011/09/configurare-nagios-per-ricevere-trap-snmp/</link>
		<comments>http://www.miamammausalinux.org/2011/09/configurare-nagios-per-ricevere-trap-snmp/#comments</comments>
		<pubDate>Tue, 20 Sep 2011 12:58:38 +0000</pubDate>
		<dc:creator>Matteo Cappadonna</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[Nagios]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=1454</guid>
		<description><![CDATA[Per sua stessa natura, Nagios funziona generalmente in maniera &#8220;attiva&#8221;, andando ad eseguire lui stesso i check verso gli host remoti, tramite script già forniti o custom, oppure interrogando direttamente un demone NRPE presente sulla macchina remota, e che in genere esegue check locali. Nagios, però, può essere configurato per eseguire dei check &#8220;passivi&#8221;, ovvero [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/nagios.png" alt="nagios" width="100" class="alignnone size-full wp-image-174" /></p>
<p>Per sua stessa natura, Nagios funziona generalmente in maniera &#8220;attiva&#8221;, andando ad eseguire lui stesso i check verso gli host remoti, tramite script già forniti o custom, oppure interrogando direttamente un demone NRPE presente sulla macchina remota, e che in genere esegue check locali.</p>
<p>Nagios, però, può essere configurato per eseguire dei check &#8220;passivi&#8221;, ovvero fare in modo che un check che giri, possa essere messo in stati particolari da programmi estetrni. Questo è quello che normalmente succede quando si lavora sull&#8217;interfaccia web e si imposta, per esempio, un Acknowledge su un servizio, o si disabilitano le notifiche.</p>
<p>La cosa interessante che andremo a fare in questo tutorial è un&#8217;ulteriore step. In pratica faremo in modo che non solo il server su cui gira Nagios possa ricevere delle trap SNMP, ma che Nagios stesso reagisca, in maniera predeterminata, a queste trap.</p>
<p>Facciamo un&#8217;esempio pratico (sarà poi quello utilizzato nel tutorial, e che è stato personalmente testato da me): un bilanciatore hardware F5 è stato configurato per lanciare delle trap verso una macchina Nagios. Questo bilanciatore invia non solo trap relative al suo stato, ma anche delle trap che indicano lo stato di un host reale bilanciato.<br />
In pratica, quello che si otterrà è il seguente flusso di eventi:</p>
<ol>
<li>L&#8217;host reale ha qualche problema, e va in down (fisicamente, o anche il solo servizio bilanciato dall&#8217;F5)</li>
<li>Il bilanciatore se ne accorge, disabilita il reale dal pool legato al VIP (Virtual IP)</li>
<li>Il bilanciatore manda una trap verso il server su cui gira Nagios, identificando che un particolare host va in down</li>
<li>Il server cattura la trap, la interpreta, ed inietta direttamente in Nagios un comando</li>
<li>Nagios mette un particolare servizio in stato CRITICO, scatenando anche le notifiche del caso</li>
</ol>
<p>In questo caso vediamo che non ci sono latenze dovute al timeslice di check di Nagios, ma la notifica è immediata alla verifica del problema.</p>
<p>Prima di entrare nel vivo del tutorial, tengo a precisare non verrà trattata l&#8217;installazione e/o la configurazione di Nagios (se non per quanto riguarda le parti relative al tutorial stesso), e l&#8217;ambiente su cui è stato testato il tutto gira attualmente con questo OS/questi software:</p>
<ul>
<li>Debian GNU/Linux 6.0</li>
<li>Nagios3 presente sui repository Debian (Nagios 3.2.1-2)</li>
</ul>
<p>Quindi farò riferimento ai path di default di questo sistema.<br />
Bando alle ciance, andiamo ad incominciare <img src='http://www.miamammausalinux.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<p><strong>Configurare il sistema per ricevere le trap SNMP</strong></p>
<p>Il primo passo è quello di far si che il nostro server (sul quale già sta girando Nagios) possa ricevere delle trap SNMP.<br />
Niente di più semplice, dovreste avere già installato il pacchetto snmpd, nel caso in cui non lo fosse, un semplice</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># apt-get install snmpd</pre></div></div>

<p>vi risolverà il problema.<br />
Questo pacchetto contiene un demone in grado di ricevere delle trap snmp. Per configurarlo editate il file /etc/default/snmpd aggiungendo/modificando le seguenti variabili:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">TRAPDRUN=yes
TRAPDOPTS='-On -u snmptt -p /var/run/snmptrapd.pid'</pre></div></div>

<p>Facendola breve diciamo di far partire il demone per le trap (TRAPDRUN=yes) e lo facciamo lanciare con le seguenti opzioni:</p>
<ul>
<li><strong>-On</strong>     Fa si che il demone usi gli OID in formato numerico, ed evita che il traduttore debba eseguire la traduzione dal formato testuale a quello numerico</li>
<li><strong>-u snmptt</strong>     Fa girare il demone con l&#8217;utente snmptt</li>
<li><strong>-p /var/run/snmptrapd.pid</strong>     Definisce il PIDfile in cui andare a scrivere il pid del processo</li>
</ul>
<p>Andiamo quindi a definire cosa il demone snmptrapd deve fare alla ricezione di una trap. Modifichiamo quindi il file<br />
/etc/snmp/snmptrapd.conf inserendo le seguenti direttive alla fine:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">disableAuthorization yes
traphandle default /usr/sbin/smptt</pre></div></div>

<p>In questo caso, diciamo al demone di disattivare l&#8217;autenticazione per l&#8217;invio delle trap (per questo tutorial useremo il metodo KISS: Keep It Simple and Stupid), e diciamo al demone di prendere tutte le trap e girarle al software /usr/sbin/smptt (di cui parleremo a breve).<br />
Aspettiamo a riavviare il demone poiché dobbiamo prima assicurarci di aver installato SNMPTT.</p>
<p>&nbsp;</p>
<p><strong>Configurare il traduttore di trap SNMPTT</strong></p>
<p>Il traduttore è una parte fondamentale. E&#8217; quel software che si occupa, una volta ricevuta la trap, di interpretarla, tradurla e scriverla da qualche parte.<br />
La traduzione viene fatta utilizzando dei file .MIB che altro non sono che dizionari contenenti un riferimento TRAP -&gt; MESSAGGIO.<br />
Praticamente tutti i produttori di hardware che emettono trap SNMP forniscono i file .MIB necessari alla traduzione, e la F5 non è da meno.</p>
<p>Intanto installiamo il traduttore:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># apt-get install snmptt</pre></div></div>

<p>Una volta installato, andiamo a modificare il file di configurazione /etc/snmp/snmptt.ini con i seguenti parametri:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">mode = standalone          # Questo perché viene invocato da snmptrapd e non deve girare come demone
dns_enable = 0             # Evitiamo che risolva l'hostname per ogni trap che gli arriva
strip_domain = 0           # Diciamogli di non rimuovere il dominio dall'eventuale hostname
net_snmp_perl_enable = 1   # Può utilizzare il perl la traduzione
translate_value_oids = 1   # Traduce gli OID in formato testuale leggibile breve
translate_enterprise_oid_format = 1   # come sopra
translate_trap_oid_format = 1         # come sopra
translate_varname_oid_format = 1      # come sopra
log_enable = 1             # Abilita il logging delle trap
syslog_enable = 1          # Abilita il logging delle trap sul syslog
syslog_level = info        # Definisce il livello di logging per le trap su syslog</pre></div></div>

<p>A questo punto portiamo sulla macchina i vari files .MIB relativi all&#8217;hardware che andrà a scatenare le trap e traduciamo questi file in formato comprensibile con snmptt. Nulla di più semplice:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># mkdir /etc/snmp/mibs    # In questa directory metteremo tutti i mib tradotti
# snmpttconvertmib --in=F5-BIGIP-COMMON.mib --out=F5-BIGIP-COMMON.conf
# mv F5-BIGIP-COMMON.conf /etc/snmp/mibs/</pre></div></div>

<p>&nbsp;</p>
<p>Lanciamo il comando per tutti i MIB che ci fornisce il produttore.<br />
A questo punto, riapriamo il file di configurazione di snmptt (/etc/snmp/snmptt.ini) e terminiamo la configurazione aggiungendo/modificando alla fine:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">snmptt_conf_files = &amp;lt;&amp;lt;END
/etc/snmp/snmptt.conf
/etc/snmp/mibs/F5-BIGIP-COMMON.conf
END</pre></div></div>

<p>Riga per riga, andiamo a mettere tutti i file .conf che abbiamo generato con smpttconvertmib. A questo punto possiamo restartare il demone SNMPD (così da far partire il gestore di trap) e verificare che sia effettivamente partito:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># /etc/init.d/snmpd restart
# cat /var/run/snmptrapd.pid
7464</pre></div></div>

<p>Perfetto, mettiamoci in tali sul file del syslog (per default il /var/log/messages) e dovremmo iniziare a veder passare le trap:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># tail -f /var/log/messages
Sep 20 11:23:40 nagios-mi snmptt[111]: .1.3.6.1.4.1.3375.2.4.0.29 Normal &quot;Status Events&quot; 192.168.0.1 - The system is in an unusable situation. AUDIT - user admin - RAW: httpd(mod_auth_pam): user=admin(admin) partition=[All] level=Administrator tty=1 host=10.10.0.1 attempts=1 start=\&quot;Tue Sep 20 11:03:00 2011\&quot; end=\&quot;Tue Sep 20 11:23:30 2011\&quot;.</pre></div></div>

<p>Ottimo, riceviamo le trap, ora dobbiamo trovare il modo di dire a Nagios che questa trap ha un significato, dirgli quale, e di scatenare un evento… procediamo <img src='http://www.miamammausalinux.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>&nbsp;</p>
<p><strong>Catturare le trap</strong></p>
<p>Ci viene in aiuto un&#8217;ottimo tool di nome SEC. Questo tool, in maniera generale, permette di analizzare live il contenuto di un file (quindi resta in ascolto ed analizza i nuovi contenuti) e di eseguire determinate operazioni a verificarsi di particolari eventi.<br />
Nel nostro caso, lo metteremo in ascolto sul file in cui vengono slogate le trap /var/log/messages e, con il match su di una particolare RegExp, viene lanciato uno script con determinati parametri.<br />
SEC è uno script in perl, ma ne esiste comunque una versione pacchettizzata per debian, dunque:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># apt-get install sec</pre></div></div>

<p>Una volta installato, andiamo a modificare il file di configurazione /etc/sec.conf, inserendo i seguenti parametri:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">type=Single
ptype=RegExp
pattern=.*(Normal|INFORMATIONAL|MINOR|WARNING|SEVERE|MAJOR|CRITICAL)\ \&quot;Status Events\&quot;\ (\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b)\ \-\ (A service is detected (UP|DOWN)\.\ Pool\ member\ (\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b)(.*)|(.*))
desc=snmptrap received from $2
action=shellcmd /usr/lib/nagios/eventhandlers/snmptraphandling.sh $2 $1 &quot;$3&quot; $4 $5</pre></div></div>

<p>In pratica viene detto a SEC di eseguire la &#8220;action&#8221; quando un testo fa match con la regular expression definita in pattern. Senza stare li a parlare di regular expression (potremmo andare avanti per giorni e giorni), se arriva una trap SNMP con il seguente testo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Sep 20 11:23:40 nagios-mi snmptt[111]: .1.3.6.1.4.1.3375.2.4.0.29 Normal &quot;Status Events&quot; 192.168.0.1 - The system is in an unusable situation. AUDIT - user admin - RAW: httpd(mod_auth_pam): user=admin(admin) partition=[All] level=Administrator tty=1 host=10.10.0.1 attempts=1 start=\&quot;Tue Sep 20 11:03:00 2011\&quot; end=\&quot;Tue Sep 20 11:23:30 2011\&quot;.</pre></div></div>

<p>otteniamo in output le seguenti variabili:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$1 = Normal
$2 = 192.168.0.1
$3 = The system is in an unusable situation. AUDIT - user admin - RAW: httpd(mod_auth_pam): user=admin(admin) partition=[All] level=Administrator tty=1 host=10.10.0.1 attempts=1 start=\&quot;Tue Sep 20 11:03:00 2011\&quot; end=\&quot;Tue Sep 20 11:23:30
$4 =
$5 =</pre></div></div>

<p>Come vediamo le ultime due variabili sono vuote. Nel caso, invece, ci arrivi una trap formata in quest&#8217;altra maniera (che indica lo stato UP/DOWN di un server fisico controllato dal bilanciatore):</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Sep 20 11:47:33 nagios-mi snmptt[111]: .1.3.6.1.4.1.3375.2.4.0.10 Normal &quot;Status Events&quot; 192.168.0.1 - A service is detected DOWN. Pool member 192.168.0.100:18009 monitor status down. 192.168.0.100 18009</pre></div></div>

<p>otteniamo, invece, in output le seguenti variabili:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$1 = Normal
$2 = 192.168.0.1
$3 = A service is detected DOWN. Pool member
$4 = DOWN
$5 = 192.168.0.100</pre></div></div>

<p>In quest&#8217;altro caso le ultime due variabili sono valorizzate ed identificano, rispettivamente, lo stato del reale (UP o DOWN) ed il reale in question (192.168.0.100).</p>
<p>Ovviamente, questa RegExp è stata costruita in funzione di come SNMPTT, con i MIB forniti da F5, traduce le trap. Hardware differente, con MIB differenti, tradurranno le trap in maniera differente, e sarà quindi necessario andare a trovare una RegExp funzionante per quella casistica.</p>
<p>Ne approfitto per segnalare il link <a href="http://gskinner.com/RegExr/" target="_blank">http://gskinner.com/RegExr/</a> veramente molto comodo per scrivere e testare le RegExp.</p>
<p>Quindi, abbiamo intercettato le trap con SEC, ed eseguiamo questo script /usr/lib/nagios/eventhandlers/snmptraphandling.sh passandogli le 5 variabili ottenute dalla RegExp, siano esse valorizzate o meno. Ma cosa fa questo script?</p>
<p>&nbsp;</p>
<p><strong>snmptraphandling.sh</strong></p>
<p>Ho scritto personalmente questo script, basandomi su un&#8217;idea di Francois Meehan, autore di uno script python simile ma meno specializzato.</p>
<p>Potete scaricarlo da qui: <a href="http://www.miamammausalinux.org/wp-content/uploads/2011/09/snmptraphandling.zip">snmptraphandling.zip</a></p>
<p>Questa versione in bash accetta in ingresso le seguenti variabili (nel seguente ordine):</p>
<p>HOST: Obbligatoria, identifica l&#8217;host che ha inviato la trap<br />
SEVERITY: Obbligatoria, identifica il &#8220;peso&#8221; della trap (Normal, critical, etc.) così come viene definita da F5<br />
&#8220;DATA&#8221;: Obbligatoria dentro i doppi apici. Contiene un testo che identifica meglio la trap, una descrizione<br />
UP|DOWN: Opzionale, identifica lo stato di un reale<br />
ALARMEDHOST: Opzionale, identifica l&#8217;host al quale viene applicata la variabile precedente.</p>
<p>Intanto lo script definisce, a seconda della SEVERITY, che valori applicare al Nagios.<br />
Inoltre, nel caso vengano specificate anche le ultime due variabili, esegue operazioni differenti per scatenare allarmi specifici.</p>
<p>Ma come dialoga con Nagios? Semplicissimo, costruisce un comando ad-hoc interpretabile da Nagios, e lo inetta nel file</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">/var/lib/nagios3/rw/nagios.cmd</pre></div></div>

<p>Questo file è specializzato per inviare segnali a Nagios e fargli eseguire operazioni particolari.</p>
<p>In pratica, all&#8217;arrivo di una trap viene scatenato un evento indirizzato all&#8217;host $HOST, per un servizio chiamato:</p>
<p>snmp_trap_handling_$HOST-…. Nel caso in cui non siano specificate le ultime 2 variabili<br />
snmp_trap_handling_$ALARMED_HOST Nel caso in cui siano specificate le ultime 2 variabili.</p>
<p>Ma prendiamo in mano un&#8217;esempio completo, così da essere più chiari.<br />
Ci arriva dal bilanciatore, per esempio, una trap SNMP che ci identifica che un&#8217;host è andato giù; all&#8217;interno del file<br />
/var/log/messages verrà scritto (da SNMPTT) il seguente messaggio:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Sep 20 11:47:33 nagios-mi snmptt[111]: .1.3.6.1.4.1.3375.2.4.0.10 Normal &quot;Status Events&quot; 192.168.0.1 - A service is detected DOWN. Pool member 192.168.0.100:18009 monitor status down. 192.168.0.100 18009</pre></div></div>

<p>SEC vedrà che questo testo fa match con la RegExp che gli abbiamo applicato, e lancerà questo comando:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">/usr/lib/nagios/eventhandlers/snmptraphandling.sh 192.168.0.1 Normal \
&quot;A service is detected DOWN. Pool member&quot; DOWN 192.168.0.100</pre></div></div>

<p>Lo script prenderà questi valori, li andrà ad elaborare (per esempio, cercando nelle configurazioni di nagios, andrà a tradurre 192.168.0.1 con bil-f5, che altro non è che il nome dell&#8217;host specificato in nagios) ed inietterà il seguente testo nel file<br />
/var/lib/nagios3/rw/nagios.cmd:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">[1316513822] PROCESS_SERVICE_CHECK_RESULT;bil-f5;snmp_trap_handling_192.168.0.100;2;A service is detected DOWN. Pool member 192.168.0.100:18009 monitor status down. 192.168.0.100</pre></div></div>

<p>Questo testo fa si che il servizio &#8220;snmp_trap_handling_192.168.0.100&#8243; venga applicato lo stato 2, ovvero il CRITICAL per Nagios.</p>
<p><strong>Configurare Nagios</strong></p>
<p>Per configurare il Nagios, andremo a creare 3 strutture nuove: la prima è un servizio template che funziona in passivo e che viene usato per creare qualsiasi servizio relativo alle trap snmp; la seconda è l&#8217;host che identifica il bilanciatore; la terza è il servizio vero e proprio che verrà messo in critical o meno all&#8217;arrivo della trap.<br />
Quindi:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">define service {
name generic-snmptrap
active_checks_enabled 1
passive_checks_enabled 1 ; Passive service checks are enabled
is_volatile 1
initial_state o
check_period never
notification_interval 120
notification_options w,u,c,r
notification_period 24x7
check_command return-ok
max_check_attempts 1
check_freshness 0
stalking_options o,w,u,c
register 0 ; Not register. Its just a template
}</pre></div></div>

<p>Notiamo alcune configurazioni particolari:</p>
<p>passive_checks_enabled 1 Determina che il servizio risponde a check passivi</p>
<p>active_checks_enabled 1 Attiva anche i check attivi. Questo è stato fatto solo perché personalmente trovo che<br />
Nagios debba sempre mostrare uno stato completamente verde. Disattivando i<br />
check attivi, nel TacticalOverview di Nagios avremmo un host segnalato in rosso.</p>
<p>check_period never Non vengono mai schedati check per questo servizio (questo perché il servizio<br />
risponde a delle trap e non esegue direttamente i check)</p>
<p>check_command return-ok Attivando i check attivi, è necessario definite un check_command. Ho usato<br />
return-ok che è un check standard di Nagios che ritorna sempre un stato OK</p>
<p>stalking_options o,w,u,c Questo serve per evitare che mille trap dello stesso tipo vadano a saturare il<br />
Nagios</p>
<p>A questo punto definiamo l&#8217;host:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">define host{
use generic-host
host_name bil-f5
alias bil-f5
address 192.168.0.1
}</pre></div></div>

<p>ed infine il servizio:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">define service{
use generic-snmptrap
host_name bil-f5
service_description snmp_trap_handling_192.168.0.100
}</pre></div></div>

<p>Vediamo quindi che, il match che esegue il Nagios, è sulla descrizione del servizio.</p>
<p>&nbsp;</p>
<p><strong>Conclusioni</strong></p>
<p>Abbiamo infine visto il giro del fumo. Sembrano tante parole ed il tutto molto complicato, ma vi assicuro che, una volta implementato, va tutto liscio come l&#8217;olio.</p>
<p>Buon lavoro <img src='http://www.miamammausalinux.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2011/09/configurare-nagios-per-ricevere-trap-snmp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Seminario &#8220;Evoluzione dell&#8217;alta affidabilita&#8217; su Linux&#8221;: video cinque e sei di sei &#8211; &#8220;Il Progetto&#8221;</title>
		<link>http://www.miamammausalinux.org/2011/08/seminario-evoluzione-dellalta-affidabilita-su-linux-video-cinque-e-sei-di-sei-il-progetto/</link>
		<comments>http://www.miamammausalinux.org/2011/08/seminario-evoluzione-dellalta-affidabilita-su-linux-video-cinque-e-sei-di-sei-il-progetto/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 12:59:26 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Generale]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[Corosync]]></category>
		<category><![CDATA[Heartbeat]]></category>
		<category><![CDATA[OpenAIS]]></category>
		<category><![CDATA[Pacemaker]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=1444</guid>
		<description><![CDATA[Ecco le parti finali del seminario di miamammausalinux.org, intitolato &#8220;Evoluzione dell&#8217;alta affidabilita&#8217; su Linux&#8221; che si è svolto nella giornata del 24 giugno 2011, presso l&#8217;hotel Holiday Inn di Rho. La quinta e la sesta parte descrivono nel dettaglio la soluzione operativa di un sistema cluster in modalità active-active, mediante configurazioni e test funzionali. Parte [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2008/11/miamammausalinux_avatar.png" alt="" title="miamammausalinux" width="124" height="125" class="alignnone size-full wp-image-761" /></p>
<p>Ecco le parti finali del seminario di <em>miamammausalinux.org</em>, intitolato &#8220;<strong>Evoluzione dell&#8217;alta affidabilita&#8217; su Linux</strong>&#8221; che si è svolto nella giornata del 24 giugno 2011, presso l&#8217;hotel Holiday Inn di Rho.</p>
<p>La quinta e la sesta parte descrivono nel dettaglio la soluzione operativa di un sistema cluster in modalità active-active, mediante configurazioni e test funzionali.</p>
<p>Parte cinque di sei &#8211; Il Progetto (parte prima):</p>
<p><script type='text/javascript' src='http://www.miamammausalinux.org/wp-content/plugins/hana-flv-player/flowplayer/html/flashembed.min.js'></script>
<div >
<div id='hana_flv_flow_1'>*Video:evoluzione dell'alta affidabilita' su linux &#8211; 5 di 6 &#8211; il progetto, parte prima</div>
</div>

<script type='text/javascript'>
    flashembed('hana_flv_flow_1',
      { src:'http://www.miamammausalinux.org/wp-content/plugins/hana-flv-player/flowplayer/FlowPlayerDark.swf', wmode: 'transparent', width: 342,  height: 192 },
      { config: { videoFile: 'http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%205%20di%206%20-%20Il%20Progetto,%20parte%20prima.flv', autoPlay: false ,loop: false, autoRewind: false, autoBuffering: false,
			splashImageFile: 'http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%205%20di%206%20-%20Il%20Progetto,%20parte%20prima.jpg', initialScale: 'scale' 

	    }}
    );
</script></p>
<p>Parte sei di sei &#8211; Il Progetto (parte seconda):</p>
<p>
<div >
<div id='hana_flv_flow_2'>*Video:evoluzione dell'alta affidabilita' su linux &#8211; 6 di 6 &#8211; il progetto, parte seconda</div>
</div>

<script type='text/javascript'>
    flashembed('hana_flv_flow_2',
      { src:'http://www.miamammausalinux.org/wp-content/plugins/hana-flv-player/flowplayer/FlowPlayerDark.swf', wmode: 'transparent', width: 342,  height: 192 },
      { config: { videoFile: 'http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%206%20di%206%20-%20Il%20Progetto,%20parte%20seconda.flv', autoPlay: false ,loop: false, autoRewind: false, autoBuffering: false,
			splashImageFile: 'http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%206%20di%206%20-%20Il%20Progetto,%20parte%20seconda.jpg', initialScale: 'scale' 

	    }}
    );
</script></p>
<p>Serie completa:</p>
<ul>
<li>Seminario “Evoluzione dell’alta affidabilita’ su Linux”: <a href="http://www.miamammausalinux.org/2011/07/seminario-evoluzione-dellalta-affidabilita-su-linux-video-uno-e-due-di-sei-introduzione-e-cluster/" title="Prima parte">video uno e due di sei – “Introduzione” e “Cluster”</a>
</li>
<li>Seminario “Evoluzione dell’alta affidabilita’ su Linux”: <a href="http://www.miamammausalinux.org/2011/07/seminario-evoluzione-dellalta-affidabilita-su-linux-video-tre-e-quattro-di-sei-heartbeatcorosync-e-drbd/" title="Seconda parte">video tre e quattro di sei – “Heartbeat/Corosync” e “DRBD”</a>
</li>
<li>Seminario “Evoluzione dell’alta affidabilita’ su Linux”: <a href="http://www.miamammausalinux.org/2011/08/seminario-evoluzione-dellalta-affidabilita-su-linux-video-cinque-e-sei-di-sei-il-progetto/" title="Terza parte">video cinque e sei di sei – “Il Progetto”</a>
</li>
</ul>
<p><em>Un ringraziamento particolare a <strong>Lorenzo</strong>, per il preziosissimo supporto video che ci ha permesso di condividere l&#8217;evento con quanti non sono riusciti a partecipare.</em></p>
<p><strong>Buona visione!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2011/08/seminario-evoluzione-dellalta-affidabilita-su-linux-video-cinque-e-sei-di-sei-il-progetto/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Seminario &#8220;Evoluzione dell&#8217;alta affidabilita&#8217; su Linux&#8221;: video tre e quattro di sei &#8211; &#8220;Heartbeat/Corosync&#8221; e &#8220;DRBD&#8221;</title>
		<link>http://www.miamammausalinux.org/2011/07/seminario-evoluzione-dellalta-affidabilita-su-linux-video-tre-e-quattro-di-sei-heartbeatcorosync-e-drbd/</link>
		<comments>http://www.miamammausalinux.org/2011/07/seminario-evoluzione-dellalta-affidabilita-su-linux-video-tre-e-quattro-di-sei-heartbeatcorosync-e-drbd/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 09:34:08 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Corosync]]></category>
		<category><![CDATA[DRBD]]></category>
		<category><![CDATA[Heartbeat]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[Pacemaker]]></category>
		<category><![CDATA[Seminari]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[OpenAIS]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=1429</guid>
		<description><![CDATA[Ecco presentate le parti centrali del seminario di miamammausalinux.org, intitolato &#8220;Evoluzione dell&#8217;alta affidabilita&#8217; su Linux&#8221; che si è svolto nella giornata del 24 giugno 2011, presso l&#8217;hotel Holiday Inn di Rho. La terza parte introduce Heartbeat e Corosync, mentre nella quarta si approfondisce l&#8217;argomento DRBD. Parte tre di sei &#8211; Heartbeat e Corosync: *Video: evoluzione [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2008/11/miamammausalinux_avatar.png" alt="" title="miamammausalinux" width="124" height="125" class="alignnone size-full wp-image-761" /></p>
<p>Ecco presentate le parti centrali del seminario di <em>miamammausalinux.org</em>, intitolato &#8220;<strong>Evoluzione dell&#8217;alta affidabilita&#8217; su Linux</strong>&#8221; che si è svolto nella giornata del 24 giugno 2011, presso l&#8217;hotel Holiday Inn di Rho.</p>
<p>La terza parte introduce Heartbeat e Corosync, mentre nella quarta si approfondisce l&#8217;argomento DRBD.</p>
<p>Parte tre di sei &#8211; Heartbeat e Corosync:</p>
<p>
<div >
<div id='hana_flv_flow_3'>*Video:evoluzione dell'alta affidabilita' su linux &#8211; 3 di 6 &#8211; heartbeat e corosync</div>
</div>

<script type='text/javascript'>
    flashembed('hana_flv_flow_3',
      { src:'http://www.miamammausalinux.org/wp-content/plugins/hana-flv-player/flowplayer/FlowPlayerDark.swf', wmode: 'transparent', width: 342,  height: 192 },
      { config: { videoFile: 'http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%203%20di%206%20-%20Heartbeat%20e%20Corosync.flv', autoPlay: false ,loop: false, autoRewind: false, autoBuffering: false,
			splashImageFile: 'http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%203%20di%206%20-%20Heartbeat%20e%20Corosync.jpg', initialScale: 'scale' 

	    }}
    );
</script></p>
<p>Parte quattro di sei &#8211; DRBD:</p>
<p>
<div >
<div id='hana_flv_flow_4'>*Video:evoluzione dell'alta affidabilita' su linux &#8211; 4 di 6 &#8211; drbd</div>
</div>

<script type='text/javascript'>
    flashembed('hana_flv_flow_4',
      { src:'http://www.miamammausalinux.org/wp-content/plugins/hana-flv-player/flowplayer/FlowPlayerDark.swf', wmode: 'transparent', width: 342,  height: 192 },
      { config: { videoFile: 'http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%204%20di%206%20-%20DRBD.flv', autoPlay: false ,loop: false, autoRewind: false, autoBuffering: false,
			splashImageFile: 'http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%204%20di%206%20-%20DRBD.jpg', initialScale: 'scale' 

	    }}
    );
</script></p>
<p>Serie completa:</p>
<ul>
<li>Seminario “Evoluzione dell’alta affidabilita’ su Linux”: <a href="http://www.miamammausalinux.org/2011/07/seminario-evoluzione-dellalta-affidabilita-su-linux-video-uno-e-due-di-sei-introduzione-e-cluster/" title="Prima parte">video uno e due di sei – “Introduzione” e “Cluster”</a>
</li>
<li>Seminario “Evoluzione dell’alta affidabilita’ su Linux”: <a href="http://www.miamammausalinux.org/2011/07/seminario-evoluzione-dellalta-affidabilita-su-linux-video-tre-e-quattro-di-sei-heartbeatcorosync-e-drbd/" title="Seconda parte">video tre e quattro di sei – “Heartbeat/Corosync” e “DRBD”</a>
</li>
<li>Seminario “Evoluzione dell’alta affidabilita’ su Linux”: <a href="http://www.miamammausalinux.org/2011/08/seminario-evoluzione-dellalta-affidabilita-su-linux-video-cinque-e-sei-di-sei-il-progetto/" title="Terza parte">video cinque e sei di sei – “Il Progetto”</a>
</li>
</ul>
<p><em>Un ringraziamento particolare a <strong>Lorenzo</strong>, per il preziosissimo supporto video che ci ha permesso di condividere l&#8217;evento con quanti non sono riusciti a partecipare.</em></p>
<p><strong>Buona visione!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2011/07/seminario-evoluzione-dellalta-affidabilita-su-linux-video-tre-e-quattro-di-sei-heartbeatcorosync-e-drbd/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
<enclosure url="http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%203%20di%206%20-%20Heartbeat%20e%20Corosync.flv" length="286582745" type="video/x-flv" />
<enclosure url="http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%204%20di%206%20-%20DRBD.flv" length="220475208" type="video/x-flv" />
		</item>
		<item>
		<title>Seminario &#8220;Evoluzione dell&#8217;alta affidabilita&#8217; su Linux&#8221;: video uno e due di sei &#8211; &#8220;Introduzione&#8221; e &#8220;Cluster&#8221;</title>
		<link>http://www.miamammausalinux.org/2011/07/seminario-evoluzione-dellalta-affidabilita-su-linux-video-uno-e-due-di-sei-introduzione-e-cluster/</link>
		<comments>http://www.miamammausalinux.org/2011/07/seminario-evoluzione-dellalta-affidabilita-su-linux-video-uno-e-due-di-sei-introduzione-e-cluster/#comments</comments>
		<pubDate>Mon, 11 Jul 2011 09:58:33 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Corosync]]></category>
		<category><![CDATA[DRBD]]></category>
		<category><![CDATA[Heartbeat]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[Pacemaker]]></category>
		<category><![CDATA[Seminari]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[OpenAIS]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=1400</guid>
		<description><![CDATA[Nella giornata del 24 giugno 2011, presso l&#8217;hotel Holiday Inn di Rho si è svolto il primo seminario di miamammausalinux.org, intitolato &#8220;Evoluzione dell&#8217;alta affidabilita&#8217; su Linux&#8220;. Viste le numerose richieste ricevute e rispettando sempre la filosofia alla base del progetto miamammausalinux.org, il video del seminario viene proposto integralmente nelle sue sei parti, insieme alla documentazione [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2008/11/miamammausalinux_avatar.png" alt="" title="miamammausalinux" width="124" height="125" class="alignnone size-full wp-image-761" /></p>
<p>Nella giornata del 24 giugno 2011, presso l&#8217;hotel Holiday Inn di Rho si è svolto il primo seminario di <em>miamammausalinux.org</em>, intitolato &#8220;<strong>Evoluzione dell&#8217;alta affidabilita&#8217; su Linux</strong>&#8220;.</p>
<p>Viste le numerose richieste ricevute e rispettando sempre la filosofia alla base del progetto <strong>miamammausalinux.org</strong>, il video del seminario viene proposto integralmente nelle sue sei parti, insieme alla documentazione fornita ai partecipanti.</p>
<p>Ecco le prime due parti.</p>
<p>Parte uno di sei &#8211; Introduzione:</p>
<p>
<div >
<div id='hana_flv_flow_5'>*Video:evoluzione dell'alta affidabilita' su linux &#8211; 1 di 6 &#8211; introduzione</div>
</div>

<script type='text/javascript'>
    flashembed('hana_flv_flow_5',
      { src:'http://www.miamammausalinux.org/wp-content/plugins/hana-flv-player/flowplayer/FlowPlayerDark.swf', wmode: 'transparent', width: 342,  height: 192 },
      { config: { videoFile: 'http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%201%20di%206%20-%20Introduzione.flv', autoPlay: false ,loop: false, autoRewind: false, autoBuffering: false,
			splashImageFile: 'http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%201%20di%206%20-%20Introduzione.jpg', initialScale: 'scale' 

	    }}
    );
</script></p>
<p>Parte due di sei &#8211; Cluster:</p>
<p>
<div >
<div id='hana_flv_flow_6'>*Video:evoluzione dell'alta affidabilita' su linux &#8211; 1 di 6 &#8211; cluster</div>
</div>

<script type='text/javascript'>
    flashembed('hana_flv_flow_6',
      { src:'http://www.miamammausalinux.org/wp-content/plugins/hana-flv-player/flowplayer/FlowPlayerDark.swf', wmode: 'transparent', width: 342,  height: 192 },
      { config: { videoFile: 'http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%202%20di%206%20-%20Cluster.flv', autoPlay: false ,loop: false, autoRewind: false, autoBuffering: false,
			splashImageFile: 'http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%202%20di%206%20-%20Cluster.jpg', initialScale: 'scale' 

	    }}
    );
</script></p>
<p>Ed ecco il link alla documentazione:</p>
<div id="attachment_1420" class="wp-caption alignnone" style="width: 210px"><a href="http://www.miamammausalinux.org/wp-content/uploads/2011/07/Evoluzione-dellalta-affidabilita-su-Linux-Libretti.pdf"><img src="http://www.miamammausalinux.org/wp-content/uploads/2011/07/Evoluzione-dellalta-affidabilita-su-Linux-Copertina.png" alt="Evoluzione dell&#039;alta affidabilita&#039; su Linux - Documentazione" title="Evoluzione dell&#039;alta affidabilita&#039; su Linux - Documentazione" width="200" height="150" class="size-full wp-image-1420" /></a><p class="wp-caption-text">Evoluzione dell&#039;alta affidabilita&#039; su Linux - Documentazione</p></div>
<p>Serie completa:</p>
<ul>
<li>Seminario “Evoluzione dell’alta affidabilita’ su Linux”: <a href="http://www.miamammausalinux.org/2011/07/seminario-evoluzione-dellalta-affidabilita-su-linux-video-uno-e-due-di-sei-introduzione-e-cluster/" title="Prima parte">video uno e due di sei – “Introduzione” e “Cluster”</a>
</li>
<li>Seminario “Evoluzione dell’alta affidabilita’ su Linux”: <a href="http://www.miamammausalinux.org/2011/07/seminario-evoluzione-dellalta-affidabilita-su-linux-video-tre-e-quattro-di-sei-heartbeatcorosync-e-drbd/" title="Seconda parte">video tre e quattro di sei – “Heartbeat/Corosync” e “DRBD”</a>
</li>
<li>Seminario “Evoluzione dell’alta affidabilita’ su Linux”: <a href="http://www.miamammausalinux.org/2011/08/seminario-evoluzione-dellalta-affidabilita-su-linux-video-cinque-e-sei-di-sei-il-progetto/" title="Terza parte">video cinque e sei di sei – “Il Progetto”</a>
</li>
</ul>
<p><em>Un ringraziamento particolare a <strong>Lorenzo</strong>, per il preziosissimo supporto video che ci ha permesso di condividere l&#8217;evento con quanti non sono riusciti a partecipare.</em></p>
<p><strong>Buona visione!</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2011/07/seminario-evoluzione-dellalta-affidabilita-su-linux-video-uno-e-due-di-sei-introduzione-e-cluster/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
<enclosure url="http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%201%20di%206%20-%20Introduzione.flv" length="49884991" type="video/x-flv" />
<enclosure url="http://www.miamammausalinux.org/wp-content/uploads/videos/20110624%20-%20Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux/Evoluzione%20dell%27alta%20affidabilita%27%20su%20Linux%20-%202%20di%206%20-%20Cluster.flv" length="124588471" type="video/x-flv" />
		</item>
		<item>
		<title>Implementazione di un server di virtualizzazione con KVM</title>
		<link>http://www.miamammausalinux.org/2011/06/implementazione-di-un-server-di-virtualizzazione-con-kvm/</link>
		<comments>http://www.miamammausalinux.org/2011/06/implementazione-di-un-server-di-virtualizzazione-con-kvm/#comments</comments>
		<pubDate>Thu, 09 Jun 2011 09:30:12 +0000</pubDate>
		<dc:creator>Francesco Pedrini</dc:creator>
				<category><![CDATA[KVM]]></category>
		<category><![CDATA[Virtualizzazione]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=1168</guid>
		<description><![CDATA[Nel precedente articolo &#8220;Introduzione alla virtualizzazione con KVM&#8221; sono stati introdotti gli aspetti base della virtualizzazione basata su KVM. In questo articolo vedremo come implementare una completa soluzione di Virtualizzazione basata su KVM e Debian. In particolare useremo Debian Squeeze, l&#8217;attuale release stable di Debian. Prerequisiti Per utilizzare KVM è necessario avere un processore dotato [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2010/07/kvm.png" alt="kvm" title="kvm" width="100" height="31" class="alignnone size-full wp-image-1116" /></p>
<p>Nel precedente articolo &#8220;<a href="http://www.miamammausalinux.org/2010/07/introduzione-alla-virtualizzazione-con-kvm/">Introduzione alla virtualizzazione con KVM</a>&#8221; sono stati introdotti gli aspetti base della virtualizzazione basata su KVM.<br />
In questo articolo vedremo come implementare una completa soluzione di Virtualizzazione basata su KVM e Debian.</p>
<p>In particolare useremo <a href="http://www.debian.org/releases/squeeze/index.it.html">Debian Squeeze</a>, l&#8217;attuale release stable di Debian.</p>
<h3>Prerequisiti</h3>
<p>Per utilizzare KVM è necessario avere un processore dotato di <a href="http://it.wikipedia.org/wiki/Virtualizzazione_X86">estensioni per la virtualizzazione</a>, per verificare che siano presenti è sufficiente lanciare il seguente comando:</p>

<div class="wp_syntax"><div class="code"><pre class="code" style="font-family:monospace;"># egrep -c '(vmx|svm)' /proc/cpuinfo
8</pre></div></div>

<p>Se il comando (come nell&#8217;esempio) restituisce &#8220;1&#8243; o un numero maggiore le estensioni sono state rilevate, mentre se restituisce 0, significa che il vostro processore non dispone di tali estensioni, quindi dovrete usare una soluzione differente come ad esempio <a href="http://www.xen.org/">Xen</a> o <a href="http://www.virtualbox.org/">VirtualBox</a>.</p>
<p>Nel caso in cui vogliate creare VirtualMachine con un quantitativo di RAM superiore ai 2 GB è necessario avere un processore con architettura <a href="http://en.wikipedia.org/wiki/X86-64">X86-64</a>. Anche in questo caso possiamo estrarre questa informazione dal file <em>/proc/cpuinfo</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="code" style="font-family:monospace;"># egrep -c ' lm ' /proc/cpuinfo
8</pre></div></div>

<p>Anche in questo caso, se il comando (come nell&#8217;esempio) restituisce un numero diverso da 0, il vostro processore potrà eseguire software a 64 bit.</p>
<p>L&#8217;ulteriore componente in gioco è il kernel del vostro sistema, che deve essere compilato con il supporto ai 64 bit, per controllare è sufficiente lanciare &#8216;uname&#8217;:</p>

<div class="wp_syntax"><div class="code"><pre class="code" style="font-family:monospace;"># uname -m
x86_64</pre></div></div>

<p>che dovrà restituire appunto &#8220;x86_64&#8243;.<br />
Nel caso il vostro processore sia a 64 bit ma sistema operativo installato a 32, non preoccupatevi, non è necessario effettuare una nuova installazione. Linux infatti è in grado di far girare uno <em>userland</em> a 32 bit su un kernel a 64 bit e nei repository Debian per l&#8217;architettura i386 è presente proprio il pacchetto che ci interessa, installabile con un colpo di Apt:</p>

<div class="wp_syntax"><div class="code"><pre class="code" style="font-family:monospace;"># apt-get install linux-image-2.6-amd64</pre></div></div>

<p>Al contrario delle estensioni per la virtualizzazione, non avere un processore x86_64 non pregiudica la funzionalità di KVM, semplicemente si potranno creare macchine virtuali con al massimo 2 Gb di RAM, quantitativo più che sufficiente per macchine virtuali di test.</p>
<p>Come ultimo prerequisito è necessario procurarsi un client <em>VNC</em> da installare sulla propria workstation, in questo caso si può proprio dire che uno vale l&#8217;altro, l&#8217;uso che se ne farà è davvero semplice e non richiede alcuna caratteristica avanzata.</p>
<h3>Installazione e configurazione</h3>
<p>Il processo di installazione è davvero molto semplice:</p>

<div class="wp_syntax"><div class="code"><pre class="code" style="font-family:monospace;"># apt-get install qemu-kvm libvirt-bin</pre></div></div>

<p>APT scaricherà tutti i pacchetti necessari per preparare il vostro sistema alla virtualizzazione.</p>
<p>È possibile fare in modo che un utente non privilegiato possa creare e gestire le VM semplicemente aggiungendo l&#8217;utente al gruppo &#8216;libvirt&#8217;:</p>

<div class="wp_syntax"><div class="code"><pre class="code" style="font-family:monospace;"># adduser fpedrini libvirt</pre></div></div>

<p>ed effettuare nuovamente la login al sistema per acquisire il nuovo gruppo.</p>
<p>Per verificare che tutto sia funzionante è necessario utilizzare il comando <em>virsh</em>, parte del pacchetto <em>libvirt-bin</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="code" style="font-family:monospace;"># virsh --connect qemu:///system list</pre></div></div>

<p>che mostrerà un output simile al seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="code" style="font-family:monospace;"> Id Name                 State
----------------------------------
&nbsp;
#</pre></div></div>

<p><em>virsh</em> è una shell interattiva che permette di gestire il proprio ambiente di virtualizzazione indipendentemente dall&#8217;Hypervisor (vedi <a href="http://www.miamammausalinux.org/2010/07/introduzione-alla-virtualizzazione-con-kvm/">precedente articolo</a>) utilizzato, di cui comunque parleremo in maniera approfondita più avanti.</p>
<p>Come ultimo passo, per fare in modo che le virtual machine possano connettersi alla stessa rete presso cui il server è collegato, sarà necessario creare un <em>bridge</em>. Viceversa è possibile sfruttare le reti interne gestite da <em>virsh</em> via <em>libvirt</em>, ma questo tipo di configurazione non è trattata in questo articolo.<br />
Per creare un <em>bridge</em> è necessario installare il pacchetto <em>bridge-utils</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="code" style="font-family:monospace;"># apt-get install bridge-utils</pre></div></div>

<p>E&#8217; quindi sufficiente modificare la configurazione delle interfacce di rete in <em>/etc/network/interfaces</em>, creando una nuova <em>stanza</em> all&#8217;interno del file e fare in modo che l&#8217;interfaccia primaria diventi il bridge (per esempio br0):</p>

<div class="wp_syntax"><div class="code"><pre class="code" style="font-family:monospace;">auto br0
iface br0 inet static
        address 192.168.0.100
        network 192.168.0.0
        netmask 255.255.255.0
        broadcast 192.168.0.255
        gateway 192.168.0.1
        bridge_ports eth0
        bridge_fd 9
        bridge_hello 2
        bridge_maxage 12
        bridge_stp off</pre></div></div>

<p>Oltre alle normali opzioni (address/network/broadcast/netmask e gateway) sono presenti anche le opzioni usate per la creazione del bridge, e la più importante è <em>bridge_ports</em>, che indica al sistema quale interfaccia fisica deve essere usata per la costruzione del bridge.</p>
<p>Riavviando il servizio di networking:</p>

<div class="wp_syntax"><div class="code"><pre class="code" style="font-family:monospace;"># /etc/init.d/networking restart</pre></div></div>

<p>il <em>bridge</em> verrà attivato.</p>
<h3>Creazione della prima Macchina Virtuale</h3>
<p>Una volta installati i vari pacchetti necessari per la virtualizzazione e configurata la rete è possibile installare la prima virtual machine, sfruttando il comando <em>virt-install</em>.</p>
<p>Virt-install e&#8217; un tool della suite di <em>libvirt</em> che permette di automatizzare i passaggi di base necessari alla creazione della VM, come ad esempio la creazione del file che fungerà da disco virtuale o la configurazione del file XML che contiene la definizione della Virtual Machine.</p>
<p>Se ad esempio volessimo installare una VM che faccia girare una nuova istanza di <em>Debian Squeeze</em>, il comando da lanciare sarà simile al seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="code" style="font-family:monospace;"># virt-install --connect qemu:///system -n squeeze-vm -r 512 --vcpus=2 --disk path=/virtuals/squeeze-vm10.img,size=10 -c /dev/cdrom --vnc --noautoconsole --os-type linux --os-variant debiansqueeze --accelerate  --hvm --network=bridge:br0</pre></div></div>

<p>Quello che all&#8217;inizio può sembrare un comando difficile e complesso, si rivela in realtà una lista di opzioni abbastanza facile da ricordare quando se ne conosce il significato:</p>
<ul>
<li><em>&#8211;connect qemu:///system</em> indica a virt-install quale deve essere l&#8217;hypervisor target</li>
<li><em>-n</em> indica il nome della Virtual Machine, in questo caso <em>squeeze-vm</em></li>
<li><em>-r</em> indica il quantitativo della ram virtuale in megabytes</li>
<li><em>&#8211;vcpus=2</em> indica il quantitativo di cpu virtuali da assegnare alla VM. Test prestazionali indicano che su processori multicore come quelli odierni, assegnare più di due vcpu ad un sistema guest non porta ad alcun aumento di performance. Il numero di processori dedicati infatti serve semplicemente a far capire al sistema guest che sta girando in un ambiente SMP. Ci penserà l&#8217;hypervisor a dividere il carico sui core del sistema host</li>
<li><em>&#8211;disk-path=/virtuals/squeeze-vm,size=10</em> indica a virt-install dove creare l&#8217;immagine per il disco virtuale e la sua dimensione. Può anche essere usato un dispositivo a blocchi (come ad esempio /dev/sdb1, la prima partizione del secondo disco del sistema host o un volume LVM), in questo caso l&#8217;opzione size non avrà alcun effetto.</li>
<li><em>-c /dev/cdrom</em> indica a virt-install il path dell&#8217;immagine di installazione del sistema guest. È possibile utilizzare anche un normale file .iso</li>
<li><em>&#8211;vnc</em> indica a virt-install di abilitare la console VNC non appena la macchina virtuale è stata creata.</li>
<li><em>&#8211;os-type linux &#8211;os-variant debiansqueeze</em> indicano a virt-install che tipo di sistema operativo verrà installato sul guest</li>
<li><em>&#8211;accelerate &#8211;hvm</em> indica a virt-install che il guest dovrà sfruttare l&#8217;accelerazione fornita da KVM. Ricordiamo che in realtà Qemu e KVM sono legati a doppio filo e il secondo può essere visto come un <em>acceleratore</em> per Qemu. inoltre la seconda opzione specifica che il guest dovrà essere un sistema completamente virtualizzato (e non <em>paravirtualizzato</em> come succederebbe con Xen)</li>
<li><em>&#8211;network=bridge:br0</em> indica a virt-install quale sarà il bridge da usare per connettere questa virtual machine alla rete</li>
</ul>
<p>Una volta premuto invio, l&#8217;output si presenterà in maniera simile alla seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="code" style="font-family:monospace;">Starting install...
Creating domain...                                                                                                                                                      |    0 B     00:00     
Domain installation still in progress. Waiting for installation to complete.</pre></div></div>

<p>a questo punto collegandosi mediante un client <em>VNC</em> (ad esempio <em>vncviewer</em>) al server è possibile completare l&#8217;installazione via console, come se si trattasse di una normale installazione Debian.</p>
<p>Dal momento che VNC non è un protocollo cifrato, è preferibile utilizzare un <em>tunnel SSH</em> (come spiegato in <a href="http://www.miamammausalinux.org/2009/04/ssh-tips-and-tricks-reprise/">questo articolo</a>) dalla propria workstation al server di virtualizzazione, puntando quindi il proprio <em>client VNC</em> alla porta aperta dal tunnel su <em>localhost</em>. </p>
<h3>Gestione delle Virtual Machine</h3>
<p>Gestire le virtual machine è possibile sempre mediante la comoda shell interattiva <em>virsh</em> di cui è stato fatto cenno poco sopra.</p>
<p>Virsh è il tool principe per la gestione delle macchine virtuali in quanto permette di eseguire con semplicità anche i compiti più complessi tramite una comoda interfaccia testuale.</p>
<p>Per lanciare virsh sarà necessario lanciare il comando:</p>

<div class="wp_syntax"><div class="code"><pre class="code" style="font-family:monospace;"># virsh --connect qemu:///system</pre></div></div>

<p>Si presenterà quindi una vera e propria shell interattiva:</p>

<div class="wp_syntax"><div class="code"><pre class="code" style="font-family:monospace;">Welcome to virsh, the virtualization interactive terminal.
&nbsp;
Type:  'help' for help with commands
       'quit' to quit
&nbsp;
virsh #</pre></div></div>

<p>Per ottenere la lista dei comandi disponibili è sufficiente scrivere <em>help</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="code" style="font-family:monospace;">virsh # help
Commands:
&nbsp;
    help            print help
    attach-device   attach device from an XML file
    attach-disk     attach disk device
    attach-interface attach network interface
    autostart       autostart a domain
    capabilities    capabilities
    cd              change the current directory
    connect         (re)connect to hypervisor
    ....
    version         show version
    vncdisplay      vnc display
    snapshot-create Create a snapshot
    snapshot-current Get the current snapshot
    snapshot-delete Delete a domain snapshot
    snapshot-dumpxml Dump XML for a domain snapshot
    snapshot-list   List snapshots for a domain
    snapshot-revert Revert a domain to a snapshot</pre></div></div>

<p>I comandi disponibili per virsh sono moltissimi e permettono di gestire qualsiasi aspetto di una macchina virtuale, dal suo stato, alla gestione dei dischi virtuali, fino alla gestione delle reti interne.</p>
<p>I comandi sicuramente più utilizzati sono quelli relativi all&#8217;esecuzione di un guest, cioè <em>list</em>,<em>start</em>, <em>shutdown</em> e <em>reboot</em>, <em>destroy</em>, <em>suspend</em> e <em>resume</em>.</p>
<p>Tutti questi comandi risultano abbastanza autoesplicativi e, ad eccezione di <em>list</em> tutti necessitano del nome del sistema guest su cui dovranno agire. Il comando <em>list</em> invece accetta due parametri: <em>&#8211;all</em> e <em>&#8211;inactive</em>, che agiranno come filtri per visualizzare rispettivamente tutte le virtual machine o i soli guest inattivi, se invocato senza alcun parametro, verrà visualizzato l&#8217;elenco delle macchine virtuali avviate.</p>
<p>Come detto sopra, i comandi risultano abbastanza chiari, ma è bene fare attenzione ad un paio di dettagli, vediamo con ordine:</p>
<ul>
<li><em>start</em> è sicuramente il più semplice, permette di avviare la virtual machine. In aggiunta, è utile citare il comando <em>autostart</em> che permette di comunicare a libvirt di avviare automaticamente le virtual machine all&#8217;avvio del sistema.</li>
<li><em>shutdown</em> permette di inviare al sistema guest un segnale di shutdown, simulando ciò che accade sulle macchine fisiche quando viene premuto il tasto di accensione</li>
<li><em>reboot</em> invia alla macchina virtuale il segnale di reboot che avvierà un processo di riavvio pulito del sistema.</li>
<li><em>destroy</em> fa in modo che il processo della virtual machine venga ucciso. Dal punto di vista della virtual machine questo è l&#8217;equivalente di un blackout, la corrente viene interrotta bruscamente. Ovviamente come succede per le macchine reali, questo comando potrebbe creare inconsistenze sul filesystem del guest anche se ovviamente non causerà alcun danno reale all&#8217;hardware</li>
<li><em>suspend</em> fa in modo che l&#8217;esecuzione della virtual machine venga interrotta. La ram rimarrà comunque occupata, ma la macchina virtuale non occuperà più alcuna risorsa relativa a CPU, HD e rete fino al resume.</li>
<li><em>resume</em> permette di far uscire la virtual machine dallo stato di ibernazione attivato con <em>suspend</em></li>
</ul>
<p>Menzione particolare meritano anche i comandi <em>save</em> e <em>restore</em>.<br />
<em>Save</em> richiede, oltre al nome della virtual machine anche un parametro aggiuntivo, cioè il filename dove salvare lo <em>stato</em> del sistema guest. Al contrario di <em>suspend</em>, questo comando permette di salvare tutto ciò che concerne la virtual machine (ram, registri del processore, interrupts, eccetera, eccetera&#8230;) in un file, e terminare il processo del sistema guest. Questo fa si  che una Virtual Machine possa essere spostata completamente da un host all&#8217;altro senza che il sistema e le applicazioni al suo interno ne risentano minimamente.<br />
<em>Restore</em>, come la sua controparte richiede come parametro aggiuntivo il file da cui leggere lo stato della virtual machine da ripristinare.</p>
<h3>Conclusioni</h3>
<p>Questo articolo, per quanto lungo, rimane sempre e comunque una rapida introduzione al vasto argomento della virtualizzazione, tematica che grazie ai recenti miglioramenti di libvirt e dei tool a corredo sta diventando sempre più vasta e interessante.</p>
<p>Ciò nonostante credo che usando come base le informazioni qui contenute si possano creare ambienti di virtualizzazione in grado di competere (e in parecchi casi persino surclassare) le soluzioni di virtualizzazione proprietarie più blasonate. </p>
<p>Basti pensare che i grandi player del mondo della virtualizzazione (Amazon, RackSpace e Google, giusto per citare i più grandi) utilizzano soluzioni basate proprio sui software descritti in questo articolo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2011/06/implementazione-di-un-server-di-virtualizzazione-con-kvm/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>I seminari di Mia Mamma Usa Linux: evoluzione dell&#8217;alta affidabilità su Linux</title>
		<link>http://www.miamammausalinux.org/2011/05/i-seminari-di-mia-mamma-usa-linux-evoluzione-dellalta-affidabilita-su-linux/</link>
		<comments>http://www.miamammausalinux.org/2011/05/i-seminari-di-mia-mamma-usa-linux-evoluzione-dellalta-affidabilita-su-linux/#comments</comments>
		<pubDate>Mon, 16 May 2011 10:36:50 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Corosync]]></category>
		<category><![CDATA[DRBD]]></category>
		<category><![CDATA[Heartbeat]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[Pacemaker]]></category>
		<category><![CDATA[Seminari]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>
		<category><![CDATA[OpenAIS]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=1341</guid>
		<description><![CDATA[MMUL e Linbit, nell&#8217;ambito del progetto &#8220;I seminari di Mia Mamma Usa Linux&#8220;, sono liete di invitarvi all&#8217;evento gratuito: Evoluzione dell&#8217;alta affidabilità su Linux Venerdì 24 Giugno 2011 9:00 &#8211; 17:30 HOLIDAY INN MILAN RHO FAIR Via Alessandro Volta, snc 20017 Rho Milano &#8211; Italy Evoluzione dell&#039;alta affidabilita&#039; su Linux Un seminario gratuito, che nel [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.mmul.it">MMUL</a> e <a href="http://www.linbit.com">Linbit</a>, nell&#8217;ambito del progetto &#8220;<em>I seminari di Mia Mamma Usa Linux</em>&#8220;, sono liete di invitarvi all&#8217;evento gratuito:</p>
<p><strong>Evoluzione dell&#8217;alta affidabilità su Linux</strong><br />
<strong><em>Venerdì 24 Giugno 2011</em></strong><br />
<strong><em>9:00 &#8211; 17:30</em></strong><br />
<em>HOLIDAY INN MILAN RHO FAIR<br />
Via Alessandro Volta, snc<br />
20017 Rho Milano &#8211; Italy</em></p>
<div id="attachment_1355" class="wp-caption alignnone" style="width: 590px"><a href="http://www.miamammausalinux.org/2011/05/i-seminari-di-mia-mamma-usa-linux-evoluzione-dellalta-affidabilita-su-linux/"><img src="http://www.miamammausalinux.org/wp-content/uploads/2011/05/MMUL-Evoluzione-dellalta-affidabilita-su-Linux-Locandina.png" alt="Evoluzione dell&#039;alta affidabilita&#039; su Linux" title="MMUL - Evoluzione dell&#039;alta affidabilita&#039; su Linux - Locandina" width="580" height="823" class="size-full wp-image-1355" /></a><p class="wp-caption-text">Evoluzione dell&#039;alta affidabilita&#039; su Linux</p></div>
<p>Un seminario gratuito, che nel corso di una giornata tratterà di <em>Linux</em>, <em>Opensource</em> ed <em>alta affidabilità</em>, affrontando nel dettaglio argomenti quali <em>Heartbeat</em>, <em>Corosync</em> e <em>DRBD</em> per arrivare ad implementare nel laboratorio una soluzione <em>NFS active-active</em> completamente operativa.</p>
<p><strong>L&#8217;evento è <strong>completamente gratuito</strong> e comprende il pranzo offerto da MMUL. I posti sono limitati a venti.</strong></p>
<p>Per iscriversi, compilare il seguente form:</p>
The event have ended - no more registrations are allowed.
<p>Per qualsiasi informazione, chiarimento o problema tecnico, scrivete una mail a <a href="mailto:info@miamammausalinux.org">info@miamammausalinux.org</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2011/05/i-seminari-di-mia-mamma-usa-linux-evoluzione-dellalta-affidabilita-su-linux/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Openldap: migrazione dalla configurazione classica alla nuova cn=config</title>
		<link>http://www.miamammausalinux.org/2011/02/openldap-migrazione-dalla-configurazione-classica-alla-nuova-cnconfig/</link>
		<comments>http://www.miamammausalinux.org/2011/02/openldap-migrazione-dalla-configurazione-classica-alla-nuova-cnconfig/#comments</comments>
		<pubDate>Wed, 16 Feb 2011 11:00:11 +0000</pubDate>
		<dc:creator>Mauro Sanna</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[OpenLDAP]]></category>
		<category><![CDATA[openLdap]]></category>
		<category><![CDATA[slapd]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=1275</guid>
		<description><![CDATA[Chi usa openLDAP si sara&#8217; accorto che dalla versione 2.4 la configurazione e&#8217; stata completamente stravolta passando dall&#8217;avere tutto in un unico file di configurazione, slapd.conf, ad una struttura ad albero tipica del database ldap. Di seguito sono riportati i passi per configurare un consumer/proxy utilizzando il nuovo formato di configurazione cn=config. Topologia. Il sistema [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-1321" src="http://www.miamammausalinux.org/wp-content/uploads/2011/02/openldap.gif" alt="openldap" width="100" height="39" /></p>
<p>Chi usa openLDAP si sara&#8217; accorto che dalla versione 2.4 la configurazione e&#8217; stata completamente stravolta passando dall&#8217;avere tutto in un unico file di configurazione, <em>slapd.conf</em>, ad una struttura ad albero tipica del database ldap.<br />
Di seguito sono riportati i passi per configurare un consumer/proxy utilizzando il nuovo formato di configurazione cn=config.</p>
<p><strong>Topologia</strong>.</p>
<p>Il sistema descritto in questo articolo consta di 3 server ldap, due di questi si trovano in rete di tipo <em>trust</em> (quindi affidabile) ed uno in <em>dmz</em> (ossia una rete demilitarizzata, che non contiene cioè dati sensibili).</p>
<p>Tali macchine verranno nominate server1, server2 e server3:</p>
<ul>
<li><strong>server1</strong> sarà il <em>master</em>, che, usando la nuova terminologia di openldap, diventa <em>provider</em>;</li>
<li><strong>server2</strong> sarà il <em>consumer</em>, colui cioè che chiede aggiornamenti al <em>provider</em> e funzionerà da <em>proxy</em>, comunicando gli aggiornamenti al server3 che risiede in <em>dmz</em>;</li>
<li><strong>server3</strong> risiederà in <em>dmz</em>;</li>
</ul>
<p>Perché utilizzare un <em>proxy</em>? Per simulare il comportamento del vecchio <em>slurpd</em>, la componente che garantiva la replica del database ldap mediante una connessione dal <em>provider</em> al <em>consumer</em>. Il sistema di replica e&#8217; cambiato, ora e&#8217; il <em>consumer</em> che inizia la connessione col <em>provider</em> per avere gli aggiornamenti.<br />
Finché i server stanno nella stessa rete non esiste nessun problema, ma se un server risiede in <em>dmz</em> e uno è nella rete <em>trust</em> non e&#8217; opportuno aprire un passaggio tra le due reti, si dovrà quindi simulare il comportamento del vecchio <em>slurpd</em> e cioè sarà il <em>consumer/proxy</em> ad iniziare la connessione col server in <em>dmz</em>. Il traffico sarà quindi dalla rete <em>trust</em> alla rete <em>dmz</em>, come e&#8217; gusto che sia, e non dalla rete <em>dmz</em> alla rete <em>trust</em>.</p>
<p>server1 e server3 montano una distribuzione <em>Debian Lenny</em> quindi la configurazione di <em>slapd</em> non è cambiata, mentre nel server2 invece è stato effettuato un aggiornamento da <em>Debian Lenny</em> a <em>Debian Squeeze</em>, che ha quindi implicato l&#8217;aggiornamento all&#8217;ultima versione del pacchetto <em>openldap</em>, che ha imposto il riadattamento della vecchia configurazione nel nuovo formato.</p>
<p><strong>Opzionale: importare gli schema</strong>.</p>
<p>Se, oltre agli schema già inclusi di default, si volessero includere degli altri schema, come ad esempio <em>phamm.schema</em> bisognerà operare come segue:</p>
<ul>
<li>All&#8217;interno della directory <em>/etc/ldap/schema</em> sarà necessario creare un file, ad esempio <em>schema_convert.conf</em> ed inserire le seguenti righe:

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">include core.schema
include cosine.schema
include inetorgperson.schema
include phamm.schema</pre></div></div>

</li>
<li>Creare una directory di appoggio, ad esempio <em>ldif_out</em>, ed utilizzare il comando <em>slaptest</em> per popolare la directory:

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># mkdir ldif_out
# slaptest -f  schema_convert.conf -F ldif_out.</pre></div></div>

</li>
<li>All&#8217;interno della directory <em>ldif_out/cn=config/cn=schema</em> modificare il file <em>cn={x}phamm.ldif</em> (al posto di x ci sarà un numero) eseguendo le seguenti modifiche:

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">dn: cn={x}phamm</pre></div></div>

<p>verrà modificato in:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">dn: cn=phamm,cn=schema,cn=config, cn={x}phamm diventa cn=phamm</pre></div></div>

<p>infine, le ultime righe del file andranno cancellate:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">structuralObjectClass: olcSchemaConfig
entryUUID: dded7120-64a0-102f-86a3-0507262554d4
creatorsName: cn=config
createTimestamp: 20101005074946Z
entryCSN: 20101005074946.106061Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20101005074946Z</pre></div></div>

<p>Salvando quindi il file.</li>
<p>A questo punto sarà necessario lanciare il comando <em>ldapadd</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># ldapadd -Y EXTERNAL -H ldapi:/// -f ldif_out/cn\=config/cn\=schema/cn\=\{x\}phamm.ldif</pre></div></div>

<p>In modo da importare definitivamente lo schema.</ul>
<p><strong>Configurazione <em>consumer</em> per la replica:</strong></p>
<p>Per configurare il server2 (<em>consumer</em>) sarà necessario creare un file nominato, ad esempio, <em>syncpreplDbHdb.ldif</em> all&#8217;interno della directory <em>/etc/slapd.d</em> con il seguente contenuto:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncrepl: rid=001 provider=ldap://server1:389 bindmethod=simple timeout=0 network-timeout=0 binddn=&quot;cn=replicant,dc=example,dc=com&quot; credentials=&quot;xxx” keepalive=0:0:0 starttls=no filter=&quot;(objectclass=*)&quot; searchbase=&quot;dc=example,dc=com&quot; scope=sub schemachecking=off type=refreshAndPersist retry=&quot;60 10 300 +&quot;</pre></div></div>

<p>Come si può notare è stata utilizzata un&#8217;utenza ad hoc per la replica: <em>cn=replicant,dc=example,dc=com</em>. Attraverso il comando <em>slapadd</em>, sarà possibile includere la nuova configurazione all&#8217;interno del database ldap:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">ldapadd -Y external -H ldapi:/// -f syncreplDbHdb.ldif.</pre></div></div>

<p>La configurazione prosegue con l&#8217;aggiunta dei moduli necessari alla replica e la creazione degli indici.</p>
<p>Per aggiungere i moduli <em>syncprov.la</em> e <em>back_ldap.la</em>, necessari alla replica, basterà creare un file nominato, ad esempio, <em>modules.ldif</em> il cui contenuto dovrà essere:</p>
<p>n.b. il modulo back_ldap e&#8217; necessario solo al consumer che opera anche come proxy.</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: syncprov.la
-
add: olcModuleLoad
olcModuleLoad: back_ldap.la</pre></div></div>

<p>Aggiungendo, come già fatto, il file <em>ldif</em> attraverso il comando <em>ldapadd</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># ldapadd -Y external -H ldapi:/// -f modules.ldif.</pre></div></div>

<p>L&#8217;aggiunta degli indici prevede la creazione di un file nominato, ad esempio, indexes.ldif con il seguente contenuto:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: entryUUID eq
-
add: olcDbIndex
olcDbIndex: entryCSN eq</pre></div></div>

<p>per poi lanciare, come di consueto, il comando <em>ldapadd</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># ldapadd -Y external -H ldapi:/// -f indexes.ldif.</pre></div></div>

<p><strong>Overlay syncprov (sync provider)</strong></p>
<p>Gli <em>overlay</em> sono componenti software che servono per aggiungere funzionalità al database senza che sia necessario riscrivere un nuovo backend per gestirle, è possibile pensarlo come ad una sorta di <em>plugin</em>.</p>
<p>L&#8217;<em>overlay syncprov</em> deve essere definito per ogni macchina che funge da <em>provider</em>, siccome il consumer definito nell&#8217;articolo e&#8217; <em>anche</em> il <em>provider</em> di se stesso, in quanto comunica gli aggiornamenti al database ldap che e&#8217; il <em>proxy</em> (definito sotto), è necessario definire l&#8217;<em>overlay synprov</em> anche per il <em>consumer</em>.</p>
<p>Creare un file, ad esempio <em>overlayDbHdb.ldif,</em> con il seguente contenuto:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">dn: olcOverlay=syncprov,olcDatabase={1}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpCheckpoint: 100 10
olcSpSessionlog: 100</pre></div></div>

<p>come ormai chiaro, sarà necessario lanciare nuovamente il comando <em>ldapadd</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># ldapadd -Y external -H ldapi:/// -f overlayDbHdb.ldif</pre></div></div>

<p><strong>Aggiunta del database ldap:</strong></p>
<p>Per completare la configurazione sarà necessario aggiungere il database ldap. Il database ldap serve per fare in modo che il server agisca da proxy ed effettui il <em>forward</em> delle richieste ad un altro server ldap, in questo caso verso server3 in <em>dmz</em>.</p>
<p>Il database ldap verrà creato come di consueto attraverso un file nominato <em>databaseLdap.ldif</em> con il seguente contenuto:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">dn: olcDatabase=ldap,cn=config
objectClass: olcDatabaseConfig
objectClass: olcLDAPConfig
olcDatabase: ldap
olcHidden: TRUE
olcSuffix: dc=example,dc=com
olcAddContentAcl: FALSE
olcLastMod: TRUE
olcMaxDerefDepth: 15
olcReadOnly: FALSE
olcRestrict: bind
olcRestrict: add
olcRestrict: modify
olcRestrict: rename
olcRestrict: delete
olcRestrict: search
olcRestrict: compare
olcRestrict: extended
olcRootDN: cn=admin,dc=example,dc=com
olcSyncrepl: rid=002 provider=ldap://localhost:389 bindmethod=simple timeout=0 network-timeout=0 binddn=&quot;cn=replicant,dc=example,dc=com&quot; credentials=&quot;xxxx&quot; keepalive=0:0:0 starttls=no filter=&quot;(objectclass=*)&quot; searchbase=&quot;dc=example,dc=com&quot; scope=sub schemachecking=off type=refreshAndPersist retry=&quot;60 10 300 +&quot;
olcDbURI: &quot;ldap://server3:389&quot;
olcDbACLBind: bindmethod=simple timeout=0 network-timeout=0 binddn=&quot;cn=replicant,dc=example,dc=com&quot; credentials=&quot;xxxx&quot; keepalive=0:0:0</pre></div></div>

<p>ed importato quindi con <em>ldapadd</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># ldapadd -Y external -H ldapi:/// -f databaseLdap.ldif</pre></div></div>

<p>Infine sarà necessario aggiungere l’<em>overlay syncprov</em> anche al database ldap, creando un file <em>overlayDbLdap.ldif</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">dn: olcOverlay=syncprov,olcDatabase={2}ldap,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov</pre></div></div>

<p>eseguendo nuovamente il comando <em>ldapadd</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># ldapadd -Y EXTERNAL -H ldapi:/// -f overlayDbLdap.ldif</pre></div></div>

<p>Si completa così la configurazione di un <em>consumer/proxy</em>.</p>
<p><strong>Conclusioni</strong></p>
<p>Sulla base delle informazioni di questo articolo è possibile ricavare in autonomia la procedura per aggiornare anche il <em>provider</em> ed il server in <em>dmz</em>.<br />
Nei successivi articoli verranno illustrate le configurazione complete degli altri server, in modo da completare l&#8217;argomento dell&#8217;upgrade di openldap.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2011/02/openldap-migrazione-dalla-configurazione-classica-alla-nuova-cnconfig/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Una data storica: è uscita Debian Squeeze!</title>
		<link>http://www.miamammausalinux.org/2011/02/una-data-storica-e-uscita-debian-squeeze/</link>
		<comments>http://www.miamammausalinux.org/2011/02/una-data-storica-e-uscita-debian-squeeze/#comments</comments>
		<pubDate>Sun, 06 Feb 2011 18:14:11 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Notizie]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=1264</guid>
		<description><![CDATA[Finalmente, dopo mesi di interminabile attesa, gli sviluppatori del progetto hanno ufficializzato l&#8217;uscita della nuova release del sistema operativo Debian GNU/Linux: Squeeze, la release 6.0. Indicata da molti come la migliore Debian di sempre senza proclami altisonanti è forse il caso di sottolineare come questa release del sistema operativo abbia effettivamente numerose frecce all&#8217;arco, nell&#8217;ambito [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.miamammausalinux.org/wp-content/uploads/2009/03/debian.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/debian.png" alt="" title="debian" width="100" height="123" class="size-full wp-image-490" /></a></p>
<p>Finalmente, dopo mesi di interminabile attesa, gli sviluppatori del progetto hanno ufficializzato l&#8217;uscita della nuova release del sistema operativo <strong>Debian GNU/Linux</strong>: <strong>Squeeze</strong>, la release <strong>6.0</strong>.<br />
Indicata da molti come <em>la migliore Debian di sempre</em> senza proclami altisonanti è forse il caso di sottolineare come questa release del sistema operativo abbia effettivamente numerose frecce all&#8217;arco, nell&#8217;ambito Desktop e, soprattutto, nell&#8217;ambito Server.<br />
In particolare tra i software di natura <em>Enterprise</em>, vanno citati:</p>
<p>Sistema:<br />
 * GNU Compiler Collection 4.4.5<br />
 * Linux 2.6.32</p>
<p>Database:<br />
 * PostgreSQL 8.4.6<br />
 * MySQL 5.1.49</p>
<p>Web:<br />
 * Apache 2.2.16<br />
 * OpenJDK 6b18<br />
 * Tomcat 6.0.18</p>
<p>Integrazione:<br />
 * Samba 3.5.6</p>
<p>Monitoring:<br />
 * Nagios 3.2.3</p>
<p>Clustering:<br />
 * Pacemaker 1.0.9<br />
 * Heartbeat 3.0.3<br />
 * Corosync 1.2.1</p>
<p>Virtualizzazione:<br />
 * Xen Hypervisor 4.0.1 (con il supporto per dom0 e per domU)<br />
 * Qemu-KVM 0.12.5<br />
 * libvirt 0.8.3</p>
<p>Come è facile intuire, questa nuova Debian risulta certamente una scelta vincente in ambiti produttivi professionali. Tutte le informazioni su come scaricare, installare ed utilizzare questa nuova Debian sono sul rinnovato sito ufficiale:</p>
<p><a href="http://www.debian.org/distrib/">http://www.debian.org/distrib/</a></p>
<p>Un nuovo importante capitolo è stato quindi aggiunto alla storia dei sistemi operativi!</p>
<p>Buon lavoro a tutti <img src='http://www.miamammausalinux.org/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2011/02/una-data-storica-e-uscita-debian-squeeze/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Evoluzione dell&#8217;alta affidabilità su Linux: creare un cluster Tomcat utilizzando la soluzione nativa, Heartbeat e Pacemaker</title>
		<link>http://www.miamammausalinux.org/2011/01/evoluzione-dellalta-affidabilita-su-linux-creare-un-cluster-tomcat-utilizzando-la-soluzione-nativa-heartbeat-e-pacemaker/</link>
		<comments>http://www.miamammausalinux.org/2011/01/evoluzione-dellalta-affidabilita-su-linux-creare-un-cluster-tomcat-utilizzando-la-soluzione-nativa-heartbeat-e-pacemaker/#comments</comments>
		<pubDate>Mon, 24 Jan 2011 11:31:36 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Heartbeat]]></category>
		<category><![CDATA[Linux HA]]></category>
		<category><![CDATA[Pacemaker]]></category>
		<category><![CDATA[Tomcat]]></category>
		<category><![CDATA[Alta affidabilità]]></category>
		<category><![CDATA[Cluster]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=1241</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Tomcat è un Application Server: un contenitore di applicazioni sviluppate attraverso il linguaggio di programmazione Java. Tomcat viene impiegato generalmente per l&#8217;esposizione di web service e questa sua attitudine, in caso di applicazioni critiche per importanza, deve essere obbligatoriamente associata all&#8217;alta affidabilità. Esso nativamente supporta un modello di cluster, che consente a diverse istanze [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2011/01/tomcat.png" alt="" title="tomcat" width="100" height="63" />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux-ha.png" alt="" title="linux-ha" width="100" height="100" />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.miamammausalinux.org/wp-content/uploads/2009/11/pacemaker.png" alt="" title="pacemaker" width="100" height="100" /></p>
<p>Tomcat è un Application Server: un contenitore di applicazioni sviluppate attraverso il linguaggio di programmazione Java. Tomcat viene impiegato generalmente per l&#8217;esposizione di web service e questa sua attitudine, in caso di applicazioni critiche per importanza, deve essere obbligatoriamente associata all&#8217;alta affidabilità. Esso nativamente supporta un modello di cluster, che consente a diverse istanze di condividere le sessioni, in modo da garantire la sopravvivenza del servizio: se quindi un&#8217;istanza smette di funzionare, il suo ruolo viene assunto dall&#8217;istanza sopravvissuta.<br />
Ma chi si occupa del controllo delle istanze stesse?<br />
Questo articolo descrive un caso di studio relativo ad un cluster nativo Tomcat le cui istanze vengono gestite da Heartbeat attraverso il Cluster Resource Manager Pacemaker.</p>
<p><strong>Installazione di Java</strong></p>
<p>Java è essenziale per il funzionamento di Tomcat ed è anche il primo software da configurare per ottenere il risultato prefissato in questo articolo. Per prima cosa quindi sarà necessario scaricare il pacchetto di installazione dal sito ufficiale di SUN presso il link <a href="http://www.java.com/it/download/linux_manual.jsp?locale=it&#038;host=www.java.com">http://www.java.com/it/download/linux_manual.jsp?locale=it&#038;host=www.java.com</a>.<br />
Ottenuto il file <em>jre-6u23-linux-i586.bin</em>, il cui nome potrà variare a seconda della versione, questo va eseguito:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># chmod +x jre-6u23-linux-i586.bin 
# ./jre-6u23-linux-i586.bin</pre></div></div>

<p>L&#8217;esecuzione del file creerà una cartella nominata <em>jre1.6.0_23</em> che sarà possibile spostare in un path consono, ad esempio <em>/usr/local</em>, per il quale potrà essere creato un link simbolico:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># mv jre1.6.0_23 /usr/local
# ln -s /usr/local/jre1.6.0_23 /usr/local/java</pre></div></div>

<p>In questo modo sarà possibile far riferimento al path <em>/usr/local/java</em> per il raggiungimento degli eseguibili java ed inoltre, in caso di installazioni di versioni diverse di Java, basterà cambiare il puntamento del link simbolico.</p>
<p><strong>Installazione di Tomcat</strong></p>
<p>L&#8217;installazione di Tomcat viene descritta in maniera generalista, indipendente quindi dalla distribuzione utilizzata.<br />
Per prima cosa quindi è necessario scaricare l&#8217;ultima versione dell&#8217;application server Tomcat, andando sul sito ufficiale di Tomcat (<a href="http://tomcat.apache.org/download-70.cgi">http://tomcat.apache.org/download-70.cgi</a>) oppure scaricando il pacchetto da uno dei mirror:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># wget http://it.apache.contactlab.it/tomcat/tomcat-7/v7.0.6/bin/apache-tomcat-7.0.6.tar.gz -o /tmp/apache-tomcat-7.0.6.tar.gz</pre></div></div>

<p>una volta terminato lo scaricamento, è possibile decomprimere il pacchetto in un path di sistema, ad esempio (e per convenzione) <em>/usr/local</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># cd /usr/local
# tar -xzvf /tmp/apache-tomcat-7.0.6.tar.gz
# ln -s apache-tomcat-7.0.6 tomcat</pre></div></div>

<p>L&#8217;ultimo comando lanciato crea un link simbolico, in modo che in futuro per accedere alla directory di Tomcat sarà sufficiente utilizzare il percorso <em>/usr/local/tomcat</em>.</p>
<p><strong>Installazione di Heartbeat e Pacemaker</strong></p>
<p>L&#8217;installazione dell&#8217;apparato cluster offerto dal progetto <em>Linux-ha</em> non verrà descritta in questo articolo, in quanto ampiamente trattata nei precedenti articoli della serie, in particolare nella puntata <a href="http://www.miamammausalinux.org/2010/06/evoluzione-dellalta-affidabilita-su-linux-confronto-pratico-tra-heartbeat-classico-ed-heartbeat-con-pacemaker/">confronto pratico tra Heartbeat classico ed Heartbeat con Pacemaker</a>.</p>
<p><strong>Configurazione di Tomcat</strong></p>
<p>La configurazione prevede due fasi: la prima relativa alle credenziali di accesso, la seconda relativa alle impostazioni per il clustering.<br />
All&#8217;interno del file <em>/usr/local/tomcat/conf/tomcat-users.xml</em> sono definite le utenze di accesso alle diverse componenti dell&#8217;application server, in particolare, per permettere all&#8217;utente <em>tomcat</em> di gestire l&#8217;installazione di nuove applicazioni attraverso l&#8217;interfaccia web disponibile, il contenuto del file dovrà essere il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">'1.0'</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">'utf-8'</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;tomcat-users<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;role</span> <span style="color: #000066;">rolename</span>=<span style="color: #ff0000;">&quot;tomcat&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;role</span> <span style="color: #000066;">rolename</span>=<span style="color: #ff0000;">&quot;manager-gui&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;user</span> <span style="color: #000066;">username</span>=<span style="color: #ff0000;">&quot;tomcat&quot;</span> <span style="color: #000066;">password</span>=<span style="color: #ff0000;">&quot;tomcat&quot;</span> <span style="color: #000066;">roles</span>=<span style="color: #ff0000;">&quot;manager,manager-gui,tomcat&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/tomcat-users<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Inutile dire come il campo password debba essere modificato in base alla password scelta.<br />
L&#8217;abilitazione del cluster Tomcat, data la natura introduttiva dell&#8217;articolo, verrà fatta nella modalità più semplice, così come illustrato dalla documentazione ufficiale di Tomcat (<a href="http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html">http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html</a>), abilitando cioè la seguente riga all&#8217;interno del file <em>/usr/local/tomcat/conf/server.xml</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Cluster</span> <span style="color: #000066;">className</span>=<span style="color: #ff0000;">&quot;org.apache.catalina.ha.tcp.SimpleTcpCluster&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></div></div>

<p>La configurazione preliminare dell&#8217;application server è così completa.</p>
<p><strong>Configurazione di Heartbeat e Pacemaker</strong></p>
<p>Appena avviato il demone Heartbeat:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># /etc/init.d/heartbeat start</pre></div></div>

<p>è possibile definire le configurazioni preliminari del cluster:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># crm configure property stonith-enabled=&quot;false&quot;
# crm configure property no-quorum-policy=&quot;ignore&quot;
# crm configure primitive ping ocf:pacemaker:ping params host_list=&quot;192.168.0.254&quot; name=&quot;ping&quot; op monitor interval=&quot;10s&quot; timeout=&quot;60s&quot; op start timeout=&quot;60s&quot; op stop timeout=&quot;60s&quot;
# crm configure clone ping_clone ping meta globally-unique=&quot;false&quot;</pre></div></div>

<p>Come spiegato nei precedenti articoli queste configurazioni preliminari indicano di non utilizzare <em>stonith</em>, ignorare l’assenza di quorum e creare una risorsa <em>ping</em> che controlli la connettività in entrambi i nodi attraverso il <em>clone</em> della risorsa stessa.<br />
Maggiori informazioni e spiegazioni approfondite si trovano nella <a href="http://www.miamammausalinux.org/2010/06/evoluzione-dellalta-affidabilita-su-linux-confronto-pratico-tra-heartbeat-classico-ed-heartbeat-con-pacemaker/">seconda parte del secondo articolo della serie</a>.<br />
In particolare l&#8217;ultima definizione, ossia la risorsa clonata per il controllo della connettività, favorisce lo spunto per la configurazione della risorsa Tomcat per la quale esiste un resource agent apposito: <a href="http://www.linux-ha.org/doc/re-ra-tomcat.html">http://www.linux-ha.org/doc/re-ra-tomcat.html</a>. Essendo obiettivo del progetto la gestione per mezzo di Pacemaker delle istanze di Tomcat, ed essendo le istanze di Tomcat in tutto e per tutto simili su entrambi nodi, queste potranno essere assimilate ad un&#8217;unica risorsa clonata.<br />
Nel dettaglio, la configurazione sarà la seguente:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="console" style="font-family:monospace;">crm configure primitive cluster_tomcat ocf:heartbeat:tomcat params java_home=&quot;/usr/local/java/&quot; catalina_home=&quot;/usr/local/tomcat/&quot; op monitor interval=&quot;60s&quot; timeout=&quot;30s&quot; op start interval=&quot;0&quot; timeout=&quot;60s&quot; op stop interval=&quot;0&quot; timeout=&quot;120s&quot;
crm configure clone cluster_tomcat_clone cluster_tomcat meta globally-unique=&quot;false&quot; target-role=&quot;Started&quot;
crm configure location cluster_tomcat_on_connected_node cluster_tomcat_clone -inf: not_defined ping or ping lte 0</pre></td></tr></table></div>

<p>Nel dettaglio:</p>
<ol>
<li>Viene definita la risorsa <em>cluster_tomcat</em> i cui parametri sono il path in cui è installato Java (<em>java_home</em>) ed il path di tomcat stesso (<em>catalina_home</em>);</li>
<li>La risorsa <em>cluster_tomcat</em> viene clonata dalla nuova risorsa <em>cluster_tomcat_clone</em>. Così come per la risorsa <em>ping_clone</em> che risiederà su ciascun nodo definito, anche questa avrà lo stesso comportamento;</li>
<li>Viene definita una <em>location</em>, ossia un vincolo che obbliga la risorsa clonata a funzionare unicamente sui nodi la cui connettività è comprovata (nodi su cui cioè la risorsa ping esiste e restituisce un risultato positivo);</li>
</ol>
<p>A questo punto, la situazione del cluster dovrebbe essere la seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">============
Last updated: Mon Jan 24 10:17:05 2011
Stack: Heartbeat
Current DC: tomcatcluster-nodo2 (b091eddc-aa64-4d7d-8407-65a7dddafbdf) - partition with quorum
Version: 1.0.10-da7075976b5ff0bee71074385f8fd02f296ec8a3
2 Nodes configured, unknown expected votes
2 Resources configured.
============
&nbsp;
Online: [ tomcatcluster-nodo1 tomcatcluster-nodo2 ]
&nbsp;
 Clone Set: ping_clone
     Started: [ tomcatcluster-nodo1 tomcatcluster-nodo2 ]
 Clone Set: cluster_tomcat_clone
     Started: [ tomcatcluster-nodo1 tomcatcluster-nodo2 ]</pre></div></div>

<p>Ed entrambe le istanze di Tomcat dovrebbero essersi avviate su ciascun nodo. E&#8217; possibile verificarlo provando ad accedere all&#8217;interfaccia web di amministrazione presente su ciascun nodo:</p>
<p><a href="http://tomcatcluster-nodo1:8080/manager/html">http://tomcatcluster-nodo1:8080/manager/html</a><br />
<a href="http://tomcatcluster-nodo2:8080/manager/html">http://tomcatcluster-nodo2:8080/manager/html</a></p>
<p>Entrambi link dovrebbero essere funzionanti e richiedere uno username con password per accedervi. Una volta inserite le credenziali definite in fase di configurazione di Tomcat, sarà visibile l&#8217;interfaccia di amministrazione delle applicazioni.</p>
<p><strong>Analisi dei log</strong></p>
<p>L&#8217;avvio dei servizi Tomcat da parte del cluster può essere seguito dai file di log dell&#8217;application server stesso, all&#8217;interno dei quali è possibile verificare se il cluster nativo di Tomcat viene attivato correttamente.</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># cat /usr/local/tomcat/logs/catalina.out
...
INFO: Cluster is about to start
...
INFO: Setting cluster mcast soTimeout to 500
...
INFO: Server startup in 3153 ms
...
21-gen-2011 17.05.47 org.apache.catalina.ha.tcp.SimpleTcpCluster memberAdded
INFO: Replication member added:org.apache.catalina.tribes.membership.MemberImpl[tcp://{192, 168, 0, 1}:4000,{192, 168, 0, 2},4000, alive=1259, securePort=-1, UDP Port=-1, id={101 64 89 59 2 -44 67 123 -73 23 4 -50 -57 105 8 58 }, payload={}, command={}, domain={}, ]
...</pre></div></div>

<p>Il server è avviato e certamente ha considerato la configurazione, includendo l&#8217;host (<em>memberAdded</em>) <em>192.168.0.52</em> nel cluster.</p>
<p><strong>Configurazione applicazione di Test</strong></p>
<p>La configurazione può dirsi completa. E&#8217; possibile quindi installare una semplice applicazione di test per verificare nell&#8217;effettivo il funzionamento delle sessioni condivise. Per fare ciò è sufficiente creare un&#8217;applicazione configurata con il parametro &#8220;<distributable/>&#8221; che indica al cluster di sfruttare la configurazione cluster per la condivisione delle sessioni.<br />
L&#8217;applicazione <em>TestSession</em>, scaricabile dal portale è stata configurata proprio a questo scopo:</p>
<p><a href='http://www.miamammausalinux.org/wp-content/uploads/2011/01/TestSession.war'>TestSession</a></p>
<p>Una volta scaricato il file <em>TestSession.war</em>, attraverso la console Tomcat e su ciascun nodo, sarà possibile installare l&#8217;applicazione nella sezione &#8220;WAR file to deploy&#8221;, selezionando il fie &#8220;war&#8221; scaricato e premendo il tasto &#8220;deploy&#8221;. Se l&#8217;esito sarà &#8220;OK&#8221;, entrambe le applicazioni saranno disponibili attraverso l&#8217;indirizzo:</p>
<p><a href="http://tomcatcluster-nodo1:8080/TestSession">http://tomcatcluster-nodo1:8080/TestSession</a><br />
<a href="http://tomcatcluster-nodo2:8080/TestSession">http://tomcatcluster-nodo2:8080/TestSession</a></p>
<p>E&#8217; possibile dunque avviare i test.</p>
<p><strong>Test di funzionamento</strong></p>
<p>Il principio di funzionamento del cluster è quello di rispondere alle richieste. Generalmente in questo tipo di architettura, gli Application Server risiedono dietro a <em>bilanciatori</em>, cioè apparati hardware o software che distribuiscono il carico attraverso batterie di macchine che offrono servizi.<br />
L&#8217;architettura di test predisposta non prevede l&#8217;utilizzo di un bilanciatore, a per simulare il bilanciamento del carico tra i due host sarà sufficiente inserire nel file <em>/etc/hosts</em> della propria macchina queste due righe:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">192.168.0.1 tomcatcluster
#192.168.0.2 tomcatcluster</pre></div></div>

<p>Come scritto in precedenza quindi, l&#8217;applicazione potrà essere chiamata come segue, senza far riferimento all&#8217;IP:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">http://tomcatcluster:8080/TestSession/</pre></div></div>

<p>Il test funzionerà in modo che chiamato l&#8217;url relativo al quale si passa un parametro, ad esempio:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">http://tomcatcluster:8080/TestSession/session.jsp?aaa=111</pre></div></div>

<p>la pagina visualizzi quanto segue:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Server info
&nbsp;
    * Name: tomcatcluster-nodo1
    * Address: 192.168.0.1
&nbsp;
Session Attributes
&nbsp;
    * aaa = 111</pre></div></div>

<p>Ovviamente le chiamate successive con parametri differenti aggiungeranno nuovi attributi.<br />
Nella fattispecie, chiamare:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">http://tomcatcluster:8080/TestSession/session.jsp?bbb=222</pre></div></div>

<p>produrrà:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Server info
&nbsp;
    * Name: tomcatcluster-nodo1
    * Address: 192.168.0.1
&nbsp;
Session Attributes
&nbsp;
    * aaa = 111
    * bbb = 222</pre></div></div>

<p>Il test a questo punto è semplicissimo, modificando il file /etc/hosts in modo che appaia come segue:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">#192.168.0.1 tomcatcluster
192.168.0.2 tomcatcluster</pre></div></div>

<p>Di fatto il secondo nodo ora sarà quello attivo. Richiamando nuovamente lo script:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">http://tomcatcluster:8080/TestSession/session.jsp?ccc=333</pre></div></div>

<p>Si otterrà il seguente output:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">Server info
&nbsp;
    * Name: tomcatcluster-nodo2
    * Address: 192.168.0.2
&nbsp;
Session Attributes
&nbsp;
    * aaa = 111
    * bbb = 222
    * ccc = 333</pre></div></div>

<p>Da notare come nel Server info ora il nodo sia tomcatcluster-nodo2, mentre i dati di sessione sono stati mantenuti.</p>
<p>Il corretto funzionamento è verificabile anche accedendo singolarmente a ciascun tomcat ai link presenti nella pagina manager nella colonna &#8220;Sessions&#8221;, dove vengono elencate le sessioni, che ovviamente hanno lo stesso codice su entrambi gli Application server.</p>
<p><strong>Conclusioni</strong></p>
<p>Terminata questa carrellata di concetti e test una cosa è chiara: come sempre questo è solo l&#8217;inizio. Sono moltissimi gli ambiti in cui soluzioni come (o simili) a quella presentata possono essere messe in produzione per ottenere infrastrutture stabili, sicure e funzionali. Sempre e comunque altamente affidabili.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2011/01/evoluzione-dellalta-affidabilita-su-linux-creare-un-cluster-tomcat-utilizzando-la-soluzione-nativa-heartbeat-e-pacemaker/feed/</wfw:commentRss>
		<slash:comments>41</slash:comments>
		</item>
	</channel>
</rss>

