<?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>Wed, 21 Mar 2012 08:42:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Progetto scuole: seminario sulla virtualizzazione all&#8217;I.T.I.S. Cannizzaro di Rho, Milano</title>
		<link>http://www.miamammausalinux.org/2012/03/progetto-scuole-seminario-sulla-virtualizzazione-alli-t-i-s-cannizzaro-di-rho-milano/</link>
		<comments>http://www.miamammausalinux.org/2012/03/progetto-scuole-seminario-sulla-virtualizzazione-alli-t-i-s-cannizzaro-di-rho-milano/#comments</comments>
		<pubDate>Tue, 20 Mar 2012 18:01:23 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[KVM]]></category>
		<category><![CDATA[Seminari]]></category>
		<category><![CDATA[Virtualizzazione]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=1555</guid>
		<description><![CDATA[Il 2 ed il 9 marzo 2012, nell&#8217;ambito del progetto scuole, presso l&#8217;istituto tecnico I.T.I.S. Cannizzaro di Rho, in provincia di Milano, MMUL ha tenuto due seminari tecnici gratuiti sul tema Virtualizzazione in Linux. Agli alunni è stato offerta la possibilità di visionare una soluzione reale, basata su libvirt/qemu e KVM per sperimentare funzionalità, problematiche, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2012/03/scuole_4-300x179.png" alt="" title="scuole_4" width="300" height="179" class="alignnone size-medium wp-image-1562" /></p>
<p>Il <strong>2</strong> ed il <strong>9 marzo 2012</strong>, nell&#8217;ambito del progetto scuole, presso l&#8217;istituto tecnico <em>I.T.I.S. Cannizzaro</em> di Rho, in provincia di Milano, <strong>MMUL</strong> ha tenuto due seminari tecnici gratuiti sul tema Virtualizzazione in Linux.<br />
Agli alunni è stato offerta la possibilità di visionare una soluzione reale, basata su <strong>libvirt/qemu</strong> e <strong>KVM</strong> per sperimentare funzionalità, problematiche, vantaggi e svantaggi relativi alla virtualizzazione in generale e nello specifico in quella <em>OpenSource</em>.</p>
<p>Nell&#8217;articolo le foto della giornata e la documentazione scaricabile.</p>
<p><a href="http://www.miamammausalinux.org/wp-content/uploads/2012/03/scuole_1.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2012/03/scuole_1-300x179.png" alt="Seminario Virtualizzazione - I.T.I.S Cannizzaro 10-17/03/2012" title="Seminario Virtualizzazione - I.T.I.S Cannizzaro 10-17/03/2012" width="300" height="179" class="size-medium wp-image-1556" /></a></p>
<p><a href="http://www.miamammausalinux.org/wp-content/uploads/2012/03/scuole_3.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2012/03/scuole_3-300x179.png" alt="" title="scuole_3" width="300" height="179" class="alignnone size-medium wp-image-1561" /></a></p>
<p><a href="http://www.miamammausalinux.org/wp-content/uploads/2012/03/scuole_2.png"><img src="http://www.miamammausalinux.org/wp-content/uploads/2012/03/scuole_2-300x179.png" alt="" title="scuole_2" width="300" height="179" class="alignnone size-medium wp-image-1560" /></a></p>
<p>A disposizione degli alunni (e di quanti sono interessati) vengono forniti i pdf contenenti le slide utilizzate negli incontri.</p>
<p><a href='http://www.miamammausalinux.org/wp-content/uploads/2012/03/20120302_MMUL_Progetto-Scuole_Virtualizzazione.pdf'><br />
<img src="http://www.miamammausalinux.org/wp-content/uploads/2012/03/20120302_MMUL_Progetto-Scuole_Virtualizzazione.png" alt="" title="20120302_MMUL_Progetto-Scuole_Virtualizzazione" width="300" height="221" class="alignnone size-full wp-image-1563" /><br />2012/03/02 &#8211; Prima parte</a></p>
<p><a href='http://www.miamammausalinux.org/wp-content/uploads/2012/03/20120309_MMUL_Progetto-Scuole_Virtualizzazione-Seconda-parte.pdf'><br />
<img src="http://www.miamammausalinux.org/wp-content/uploads/2012/03/20120309_MMUL_Progetto-Scuole_Virtualizzazione-Seconda-parte.png" alt="" title="20120302_MMUL_Progetto-Scuole_Virtualizzazione-Seconda-parte" width="300" height="221" class="alignnone size-full wp-image-1563" /><br />2012/03/02 &#8211; Seconda parte</a></p>
<p>Per tutte le scuole ed i professori interessati al progetto scuole di MMUL, il riferimento è il sito ufficiale: <a href="http://www.mmul.it/scuole.php" title="MMUL - Progetto Scuole" target="_blank">http://www.mmul.it/scuole.php</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2012/03/progetto-scuole-seminario-sulla-virtualizzazione-alli-t-i-s-cannizzaro-di-rho-milano/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Sviluppare, versionare e rilasciare in automatico: una soluzione basata su Subversion, Apache e SSH</title>
		<link>http://www.miamammausalinux.org/2012/02/sviluppare-versionare-e-rilasciare-in-automatico-una-soluzione-basata-su-subversion-apache-e-ssh/</link>
		<comments>http://www.miamammausalinux.org/2012/02/sviluppare-versionare-e-rilasciare-in-automatico-una-soluzione-basata-su-subversion-apache-e-ssh/#comments</comments>
		<pubDate>Wed, 29 Feb 2012 08:26:39 +0000</pubDate>
		<dc:creator>spagno</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Generale]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[Subversion]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=1512</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160;&#160;&#160; In ambiente enterprise vi è sempre più sovente l&#8217;esigenza di automatizzare qualsiasi processo sistemistico; uno dei processi che toglie tempo al lavoro di amministrazione delle macchine è quello dei rilasci (soprattutto in ambiente di test). In questo articolo verrà spiegato come poter automatizzare rilasci di siti attraverso SubVersion, Apache e SSH. Il nostro obiettivo [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2012/02/subversion.png" alt="" title="subversion" width="100" height="88" class="alignnone size-full wp-image-1550" />&nbsp;&nbsp;&nbsp;<img src="http://www.miamammausalinux.org/wp-content/uploads/2012/02/apache.png" alt="" title="apache" width="203" height="61" class="alignnone size-full wp-image-1549" />&nbsp;&nbsp;&nbsp;<img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/openssh.png" alt="" title="openssh" width="100" height="98" class="alignnone size-full wp-image-248" /></p>
<p>In ambiente enterprise vi è sempre più sovente l&#8217;esigenza di automatizzare qualsiasi processo sistemistico; uno dei processi che toglie tempo al lavoro di amministrazione delle macchine è quello dei rilasci (soprattutto in ambiente di test).</p>
<p>In questo articolo verrà spiegato come poter automatizzare rilasci di siti attraverso SubVersion, Apache e SSH.</p>
<p>Il nostro obiettivo e&#8217; quello di rendere il più possibile automatica tutta l&#8217;operazione di rilascio in ambiente di test di alcuni siti statici e di permettere estrema flessibilita&#8217; agli sviluppatori di tali siti, in maniera tale da renderli autonomi per modifiche, aggiornamenti ed eventuali roll-back. Gioca un ruolo molto importante il fatto che, sfruttando SubVersion (e quindi un sistema di versioning), e&#8217; possibile per lo sviluppatore riportare il sito ad una revision specifica in ogni momento.</p>
<p><strong>Ambiente operativo</strong></p>
<p>Prendiamo come case test un ambiente cosi&#8217; configurato:</p>
<p>Distribuzione: Ubuntu 10.04 LTS<br />
Repository Utilizzati: default dell&#8217;installazione</p>
<p>- Server A:  Server con Apache: configurazione standard per poter gestire piu&#8217; VirtualHost, dove ogni VirtualHost sara&#8217; un diverso sito da erogare (<a title="configurazione multi virtualhost apache2" href="http://httpd.apache.org/docs/2.0/vhosts/examples.html">configurazione VirtualHost Apache2</a>);</p>
<p>- Server B:  Server  con Apache + Subversion configurati  (ci sono veramente molti HOWTO disponibili in rete su come configurare i servizi, ecco un <a href="http://www.techrepublic.com/article/configuring-apache-for-subversion-use/5902186">esempio</a>);</p>
<p><strong>Configurazioni preliminari</strong></p>
<p>Una volta installato Apache2, Ubuntu imposta il servizio in modo che venga avviato mediante l&#8217;utenza <em>www-data. </em>Questa utenza nel file <em>/etc/passwd</em> si presenta in questa modo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">www-data:x:33:33:www-data:/var/www:/bin/sh</pre></div></div>

<p>Sia sul Server A che sul Server B è necessario modificare quindi alcuni parametri dell&#8217;utenza <em>www-data</em> al fine di avere una home dell&#8217;utente &#8220;coerente&#8221; col sistema, dove sarà possibile posizionare le chiavi pubbliche/private SSH necessarie a far funzionare il tutto: modifichiamo quindi l&#8217;utente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># usermod www-data -d /home/www-data</pre></div></div>

<p>e creiamone la HOME</p>
<p><</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># mkdir /home/www-data</pre></div></div>

<p>dando i permessi all&#8217;utente</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># chown -R www-data:www-data /home/www-data</pre></div></div>

<p>Per testare il tutto proviamo ad entrare con l&#8217;utenza appena creata</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># su - www-data</pre></div></div>

<p>Ora che su entrambi i Server abbiamo modificato l&#8217;utenza <em>www-data</em> è possibile iniziare a creare le chiavi necessarie.<br />
In questo case test i fornitori che useranno subversion con relativi progetti saranno:</p>
<ul>
<li>fornitore1</li>
<li>
<ul>
<li>progetto1</li>
<li>progetto2</li>
</ul>
</li>
<li>fornitore2</li>
<li>
<ul>
<li>progetto3</li>
<li>progetto4</li>
</ul>
</li>
</ul>
<p><strong>Configurazione</strong></p>
<p>Il percorso logico che dovranno fare i Server è il seguente:</p>
<p>Server B <strong>-&gt;</strong> COMMIT SVN (post-commit hook) <strong>-&gt;</strong> SSH FORCE COMMAND (svn up) <strong>-&gt;</strong> Server A</p>
<p>E&#8217; necessario quindi creare sul Server B le chiavi SSH, una per ciascun fornitore/progetto, per l&#8217;autenticazione automatizzata.</p>
<p>Le fasi sono le seguenti:</p>
<p>Creazione directory base:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">[root@ServerB]# su - www-data
[www-data@ServerB]$ mkdir .ssh
[www-data@ServerB]$ chmod 700 .ssh
[www-data@ServerB]$ cd .ssh
[www-data@ServerB]$ mkdir fornitore1 fornitore2</pre></div></div>

<p>Creazione chiavi <em>fornitore1</em> (per <em>progetto1</em> e <em>progetto2</em>):</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">[www-data@ServerB]$ cd fornitore1
[www-data@ServerB]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/www-data/.ssh/fornitore1/id_rsa): /home/www-data/.ssh/fornitore1/id_rsa_progetto1
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/www-data/.ssh/fornitore1/id_rsa_progetto1.
Your public key has been saved in /home/www-data/.ssh/fornitore1/id_rsa_progetto1.pub.
The key fingerprint is:
x:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx www-data@ServerB
[www-data@ServerB]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/www-data/.ssh/fornitore1/id_rsa): /home/www-data/.ssh/fornitore1/id_rsa_progetto2
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/www-data/.ssh/fornitore1/id_rsa_progetto2.
Your public key has been saved in /home/www-data/.ssh/fornitore1/id_rsa_progetto2.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx www-data@ServerB</pre></div></div>

<p>Creazione chiavi <em>fornitore2</em> (per <em>progetto3</em> e <em>progetto4</em>):</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">[www-data@ServerB]$ cd ../fornitore2
[www-data@ServerB]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/www-data/.ssh/fornitore2/id_rsa): /home/www-data/.ssh/fornitore2/id_rsa_progetto3
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/www-data/.ssh/fornitore2/id_rsa_progetto3.
Your public key has been saved in /home/www-data/.ssh/fornitore2/id_rsa_progetto3.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx www-data@ServerB
[www-data@ServerB]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/www-data/.ssh/fornitore2/id_rsa): /home/www-data/.ssh/fornitore2/id_rsa_progetto4
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/www-data/.ssh/fornitore2/id_rsa_progetto4.
Your public key has been saved in /home/www-data/.ssh/fornitore2/id_rsa_progetto4.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx www-data@ServerB</pre></div></div>

<p>In questo modo sono state create le chiavi necessarie per far sì che il ServerB possa autenticarsi con chiave SSH su ServerA. Ora è necessario modificare il file <em>authorized_keys</em> su ServerA:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># su - www-data
[www-data@ServerA]$ mkdir .ssh
[www-data@ServerA]$ chmod 700 .ssh
[www-data@ServerA]$ cd .ssh
[www-data@ServerA]$ touch authorized_keys
[www-data@ServerA]$ chmod 644 authorized_keys</pre></div></div>

<p>Da ServerB è necessario prendere le chiavi pubbliche precedentemente create per poi inserirle nel file <em>authorized_keys</em> di ServerA:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">[www-data@ServerA]$ cat .ssh/fornitore1/id_rsa_progetto1.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAomhotTKNhOwyWFLF0BctOHG+yg0MVN5DREszJlMz4/UEAOfk1MTftEAHVyqhX/oj7n+0ITB2GTrLSR1n5Yx7WZrBc+4fdZMf6gRUZYeZjDyqj4/Odbuy1XPkXAARcNlSw8tOHi3GzyR3ghUGKtUzcSrbZnSegViVji5Yyvs6tdlToofKjt/r542eWWqj7syRAtDqqmQQNBQxQqMcDIOGaSjIluvg60qkEXnYiqQ+J43xbP8w6YK5Z1trOMuTRb4ocK4aJ0zLMiLnjwLIU+gkl8LlzxZwtE97dURPbVQRxPastFKnTWy0v9jguX7NHZmTN4q7z8OQRH4oagSV1lbdSw== www-data@ServerB</pre></div></div>

<p>La chiave deve essere copiata e poi incollata nel file <em>authorized_keys</em> di ServerA aggiungendo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">ssh-rsa &lt;strong&gt;command=&quot;/usr/local/bin/svnup.sh fornitore1 progetto1&quot;&lt;/strong&gt; AAAAB3NzaC1yc2EAAAABIwAAAQEAomhotTKNhOwyWFLF0BctOHG+yg0MVN5DREszJlMz4/UEAOfk1MTftEAHVyqhX/oj7n+0ITB2GTrLSR1n5Yx7WZrBc+4fdZMf6gRUZYeZjDyqj4/Odbuy1XPkXAARcNlSw8tOHi3GzyR3ghUGKtUzcSrbZnSegViVji5Yyvs6tdlToofKjt/r542eWWqj7syRAtDqqmQQNBQxQqMcDIOGaSjIluvg60qkEXnYiqQ+J43xbP8w6YK5Z1trOMuTRb4ocK4aJ0zLMiLnjwLIU+gkl8LlzxZwtE97dURPbVQRxPastFKnTWy0v9jguX7NHZmTN4q7z8OQRH4oagSV1lbdSw== www-data@ServerB</pre></div></div>

<p>Ovviamente tutte le chiavi pubbliche precedentemente create devono essere aggiunte, cambiando, all&#8217;accorrenza <strong>fornitore1 progetto1</strong>.</p>
<p>Nel case test preso in esame , il file <em>authorized_keys</em>, alla fine, si presenterà in questo modo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">[www-data@ServerA]$ cat .ssh/authorized_keys
ssh-rsa &lt;strong&gt;command=&quot;/usr/local/bin/svnup.sh fornitore1 progetto1&quot;&lt;/strong&gt; [... key data ..] www-data@ServerB
ssh-rsa &lt;strong&gt;command=&quot;/usr/local/bin/svnup.sh fornitore1 progetto2&quot;&lt;/strong&gt; [... key data ..] www-data@ServerB
ssh-rsa &lt;strong&gt;command=&quot;/usr/local/bin/svnup.sh fornitore2 progetto3&quot;&lt;/strong&gt; [... key data ..] www-data@ServerB
ssh-rsa &lt;strong&gt;command=&quot;/usr/local/bin/svnup.sh fornitore2 progetto4&quot;&lt;/strong&gt; [... key data ..] www-data@ServerB</pre></div></div>

<p>La parte relativa alla configurazione SSH è terminata; rimangono da configurare  i repository SVN, gli scripts di hook e lo script presente nel force command SSH.</p>
<p><strong>Creare i repository SVN ed i relativi script</strong></p>
<p>Su ServerB I repository SVN dovranno essere cosi configurati:</p>
<p><em>rootSVN/fornitoreX/</em></p>
<p>Nel caso in oggetto, su ServerB la situazione sarà:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">[root@ServerB]# cd /store/subversion
[root@ServerB]# svnadmin create fornitore1
[root@ServerB]# svnadmin create fornitore2
[root@ServerB]# chown -R www-data:www-data fornitore1 fornitore2</pre></div></div>

<p><em><strong>Nota:</strong> In questo modo ogni fornitore avrà un proprio repository: ciò fa sì che ogni progetto nuovo creato dovrà essere un commit: le REV gestite da SVN, quindi, non saranno a livello di singolo progetto.</em></p>
<p>In <em>/rootSVN/fornitoreX/hooks/ </em>saranno presenti gli script di HOOK di SVN:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">[root@ServerB]# su - www-data
[www-data@ServerB]$ cd /store/subversion/fornitore1/hooks
[www-data@ServerB]$ cp post-commit.tmlp post-commit
[www-data@ServerB]$ chmod +x post-commit</pre></div></div>

<p>Il file post-commit deve essere modificato in questo modo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">#!/bin/sh
REPOS=&quot;$1&quot;
REV=&quot;$2&quot;
/usr/share/subversion/hook-scripts/post-commit-fornitore1.sh &quot;$REPOS&quot; &quot;$REV&quot;</pre></div></div>

<p>Di seguito lo script <em>/usr/share/subversion/hook-scripts/post-commit-fornitore1.sh</em></p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">#!/bin/sh
REPOS=$1
REV=$2
SVNLOOK=/usr/bin/svnlook
TMPFILE=$(mktemp /tmp/svnXXX)
$SVNLOOK changed -r &quot;$REV&quot; &quot;$REPOS&quot; | cut -d '/' -f2 | sort | uniq &amp;gt; $TMPFILE
for line in $(cat $TMPFILE)
do
ssh -i /home/www-data/.ssh/fornitore1/id_rsa_$line www-data@ServerA &amp;gt;&amp;amp;2
done
rm $TMPFILE</pre></div></div>

<p>Cosa succede: lo script <em>post-commit</em> entra in gioco nel momento in cui viene fatto un COMMIT su SVN. Nel momento in cui il COMMIT viene effettuato l&#8217;hook prende i parametri &#8220;<em>fornitore1 ultimaREV</em>&#8220;  e li passa allo script <em>/usr/share/subversion/hook-scripts/post-commit-fornitore1.sh</em> che, tramite <em>svnlook</em> crea una lista (salvata in <em>$TMPFILE</em> ) dei progetti che vengono modificati dal commit. A seconda dei progetti che vengono modificati, lo script fa partire la connessione SSH verso ServerA utilizzando come certificato quello adeguato per far eseguire il force command giusto su ServerA.</p>
<p>Fatto ciò, bisogna configurare lo script <em>/usr/local/bin/svnup.sh</em> su ServerA e inizializzare la DocumentRoot che andrà ad accogliere il commit per essere erogato da Apache2:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">[root@ServerA]# cd /usr/local/bin</pre></div></div>

<p>Nella configurazione di test, la root dei vari repository è:</p>
<p><em>/store/www</em></p>
<p>mentre le DocumentRoot dei progetti:</p>
<p><em>/store/www/progettoX/www</em></p>
<p>Creare il file <em>svnup.sh</em> e modificarlo come segue:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">#!/bin/bash
FORNITORE=$1
PROGETTO=$2&lt;/p&gt;
WWWDIR=&quot;/store/www/${PROGETTO}/www&quot;
&nbsp;
(
&nbsp;
cd $WWWDIR
&nbsp;
svn --username ${FORNITORE} --password $(grep ${FORNITORE} /home/www-data/mapFornitori | cut -d':' -f2) up
&nbsp;
)</pre></div></div>

<p>E&#8217; possibile notare come venga usato il file <em>/home/www-data/mapFornitori</em> come mappatura dei fornitori e della propria password: questo è necessario poichè SVN memorizza un solo username associato ad una sola password nei propri metadata. Il file è così composto:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">fornitore1:passwordFornitore1
fornitore2:passwordFornitore2</pre></div></div>

<p>Ora che il giro SSH + HOOKS SVN è completato, è necessario creare la DocumentRoot del progetto ed inizializzarla (e, quindi, diventerà una working copy):</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">[root@ServerA]# su - www-data
[www-data@ServerA]$ mkdir /store/www/progetto1
[www-data@ServerA]$ cd /store/www/progetto1
[www-data@ServerA]$ svn co --username=fornitore1 --password=progetto1 http://ServerB/fornitore1/progetto1 www</pre></div></div>

<p><em><strong>Nota:</strong> se non viene eseguita l&#8217;inizializzazione non saranno creati i metadata necessari ad SVN per far funzionare il comando svn up</em></p>
<p>Da questo momento in poi, ogni qualvolta vi sarà un commit SVN (per esempio viene committata una pagina nuova in <em>progetto1</em> di <em>fornitore1</em>) il girò sarà il seguente:</p>
<p>Sviluppatore esegue il commit, dopo il quale l&#8217;hook <em>post-commit</em> esegue <em>/usr/share/subversion/hook-scripts/post-commit-fornitore1.sh &#8220;progetto1&#8243; &#8220;2&#8243;</em> che poi esegue   <em>ssh -i /home/www-data/.ssh/fornitore1/id_rsa_progetto1 www-data@ServerA</em></p>
<p><em></em>Quest&#8217;ultimo, in virtù dell&#8217;opzione <em><strong>command=&#8221;/usr/local/bin/svnup.sh fornitore1 progetto1&#8243;</strong></em> fa sì che su ServerA venga eseguito in sequenza:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">cd /store/www/progetto1/www
svn --username fornitore1 --password passwordFornitore1 up</pre></div></div>

<p>Aggiornando la working copy che verrà erogata da Apache2.</p>
<p><strong>Conclusioni</strong></p>
<p>La soluzione presentata mostra come, con un minimo di implementazione, sia possibile creare automatismi preziosi, soprattutto laddove esistono situazioni in cui molte persone sviluppano su siti diversi il cui codice risiede in un repository centrale per il versioning. Gli spunti offerti possono servire da punto di partenza per l&#8217;introduzione di varianti volte ad automatizzare il processo di sviluppo. Il limite è solo la fantasia.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2012/02/sviluppare-versionare-e-rilasciare-in-automatico-una-soluzione-basata-su-subversion-apache-e-ssh/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<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/flashembed2.min.js'></script>
<div >
<div id='hana_flv_flow_1' style='display:block;width:342px;height:192px;background-color:#555555;color:#ffffff;padding:0'>
<div class='inactive_message'></div>

*Video:evoluzione dell'alta affidabilita' su linux &#8211; 5 di 6 &#8211; il progetto, parte prima</div>
</div>

<script type='text/javascript'>
if (!g_hasFlash){
    jQuery('#hana_flv_flow_1').css( 'padding', '5px' );
	jQuery('#hana_flv_flow_1 .inactive_message').html('Sorry, your browser does not support Flash Video Player');
}else{
    flashembed2('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' style='display:block;width:342px;height:192px;background-color:#555555;color:#ffffff;padding:0'>
<div class='inactive_message'></div>

*Video:evoluzione dell'alta affidabilita' su linux &#8211; 6 di 6 &#8211; il progetto, parte seconda</div>
</div>

<script type='text/javascript'>
if (!g_hasFlash){
    jQuery('#hana_flv_flow_2').css( 'padding', '5px' );
	jQuery('#hana_flv_flow_2 .inactive_message').html('Sorry, your browser does not support Flash Video Player');
}else{
    flashembed2('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>1</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' style='display:block;width:342px;height:192px;background-color:#555555;color:#ffffff;padding:0'>
<div class='inactive_message'></div>

*Video:evoluzione dell'alta affidabilita' su linux &#8211; 3 di 6 &#8211; heartbeat e corosync</div>
</div>

<script type='text/javascript'>
if (!g_hasFlash){
    jQuery('#hana_flv_flow_3').css( 'padding', '5px' );
	jQuery('#hana_flv_flow_3 .inactive_message').html('Sorry, your browser does not support Flash Video Player');
}else{
    flashembed2('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' style='display:block;width:342px;height:192px;background-color:#555555;color:#ffffff;padding:0'>
<div class='inactive_message'></div>

*Video:evoluzione dell'alta affidabilita' su linux &#8211; 4 di 6 &#8211; drbd</div>
</div>

<script type='text/javascript'>
if (!g_hasFlash){
    jQuery('#hana_flv_flow_4').css( 'padding', '5px' );
	jQuery('#hana_flv_flow_4 .inactive_message').html('Sorry, your browser does not support Flash Video Player');
}else{
    flashembed2('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' style='display:block;width:342px;height:192px;background-color:#555555;color:#ffffff;padding:0'>
<div class='inactive_message'></div>

*Video:evoluzione dell'alta affidabilita' su linux &#8211; 1 di 6 &#8211; introduzione</div>
</div>

<script type='text/javascript'>
if (!g_hasFlash){
    jQuery('#hana_flv_flow_5').css( 'padding', '5px' );
	jQuery('#hana_flv_flow_5 .inactive_message').html('Sorry, your browser does not support Flash Video Player');
}else{
    flashembed2('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' style='display:block;width:342px;height:192px;background-color:#555555;color:#ffffff;padding:0'>
<div class='inactive_message'></div>

*Video:evoluzione dell'alta affidabilita' su linux &#8211; 1 di 6 &#8211; cluster</div>
</div>

<script type='text/javascript'>
if (!g_hasFlash){
    jQuery('#hana_flv_flow_6').css( 'padding', '5px' );
	jQuery('#hana_flv_flow_6 .inactive_message').html('Sorry, your browser does not support Flash Video Player');
}else{
    flashembed2('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>15</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>6</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>
	</channel>
</rss>

