<?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! &#187; Debian</title>
	<atom:link href="http://www.miamammausalinux.org/category/debian/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.miamammausalinux.org</link>
	<description>Perché niente è impossibile da capire... Se lo spieghi bene !</description>
	<lastBuildDate>Mon, 02 Jan 2012 11:31:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>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>Openldap: migrazione dalla configurazione classica alla nuova cn=config</title>
		<link>http://www.miamammausalinux.org/2011/02/openldap-migrazione-dalla-configurazione-classica-alla-nuova-cnconfig/</link>
		<comments>http://www.miamammausalinux.org/2011/02/openldap-migrazione-dalla-configurazione-classica-alla-nuova-cnconfig/#comments</comments>
		<pubDate>Wed, 16 Feb 2011 11:00:11 +0000</pubDate>
		<dc:creator>Mauro Sanna</dc:creator>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[OpenLDAP]]></category>
		<category><![CDATA[openLdap]]></category>
		<category><![CDATA[slapd]]></category>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<p>Si completa così la configurazione di un <em>consumer/proxy</em>.</p>
<p><strong>Conclusioni</strong></p>
<p>Sulla base delle informazioni di questo articolo è possibile ricavare in autonomia la procedura per aggiornare anche il <em>provider</em> ed il server in <em>dmz</em>.<br />
Nei successivi articoli verranno illustrate le configurazione complete degli altri server, in modo da completare l&#8217;argomento dell&#8217;upgrade di openldap.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2011/02/openldap-migrazione-dalla-configurazione-classica-alla-nuova-cnconfig/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Approx: Risparmiare banda con i proxy apt</title>
		<link>http://www.miamammausalinux.org/2009/05/approx-risparmiare-banda-con-i-proxy-apt/</link>
		<comments>http://www.miamammausalinux.org/2009/05/approx-risparmiare-banda-con-i-proxy-apt/#comments</comments>
		<pubDate>Fri, 15 May 2009 15:39:45 +0000</pubDate>
		<dc:creator>Marco Bonetti</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[dpkg]]></category>
		<category><![CDATA[Utility]]></category>
		<category><![CDATA[Approx]]></category>
		<category><![CDATA[Apt Proxy]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=629</guid>
		<description><![CDATA[Debian e le distribuzioni da lei derivate, utilizzano l&#8217;accoppiata apt-get e dpkg per installare e mantenere aggiornati i programmi. Mentre dpkg si preoccupa di lavorare esclusivamente in locale, scompattanto i pacchetti ed assicurandosi che la loro installazione sia portata a buon fine, è apt-get il vero cavallo da lavoro: si preoccupa di mantenere aggiornati gli [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux.png" alt="linux" width="85" height="100" class="alignnone size-full wp-image-292" /></p>
<p>Debian e le distribuzioni da lei derivate, utilizzano l&#8217;accoppiata apt-get e dpkg per installare e mantenere aggiornati i programmi. Mentre dpkg si preoccupa di lavorare esclusivamente in locale, scompattanto i pacchetti ed assicurandosi che la loro installazione sia portata a buon fine, è apt-get il vero cavallo da lavoro: si preoccupa di mantenere aggiornati gli indici per il reperimento dei pacchetti, calcola e risolve le dipendenze al momento dell&#8217;installazione di un nuovo programma e si preoccupa di scaricare il deb dai repository remoti.<br />
Quest&#8217;ultima azione, il download, può incidere notevolmente sulle performance della rete, specialmente se si è scelto di installare diversi pacchetti (si pensi agli effetti di un <em>apt-get install ubuntu-desktop</em> sopra un Ubuntu base system) e se questa operazione viene effettuata da più di un computer della stessa rete.</p>
<p>Una prima soluzione potrebbe essere quella di tenere un repository locale e scaricare i pacchetti necessari da quel repository, sfortunamente questa soluzione richiede un notevole consumo di spazio ed ogni giorno è necessario scaricare gli aggiornamenti al repository anche se alcuni o tutti dei programmi scaricati non sono necessari.<br />
Per ovviare a questi effetti entrano in gioco i proxy apt: risolvono il problema di consumo di banda tenendo nella cache locale i pacchetti richiesti e sono meglio della presenza di un repository personale in quanto non si devono sprecare spazio e banda per avere tutti i pacchetti salvati nella cache in ogni momento.<br />
La soluzione più semplice per installare un proxy apt è quella di eleggere, se già presente, il proxy della rete a fare anche da proxy per i deb scaricati: da un lato si ha un immediato vantaggio di configurazione, con poche righe uno squid è in grado di tenere in cache pure i pacchetti dei programmi, dall&#8217;altro si hanno delle limitazioni sulla flessibilità di configurazione e sui protocolli supportati per il download dai repository.<br />
Per superare anche queste limitazioni è sufficiente utilizzare un programma dedicato al caching dei deb, quello storico è apt-proxy seguito, in ordine cronologico, da approx, apt-cacher e apt-cacher-ng. In questo articolo parleremo dell&#8217;utilizzo di approx perchè è il più vecchio proxy apt funzionante, in quanto il povero apt-proxy mostra i segni dell&#8217;età non risultando affatto scalabile su larga scala.<br />
Il comportamento dei proxy apt è molto semplice: vengono configurati per fornire la cache di alcuni repository, quando un client li contatta e richiede un pacchetto, i proxy controllano la presenza del pacchetto nella loro cache, se questo manca verrà scaricato dal repository e passato al client altrimenti verrà servita la copia locale, risultando così estremamente veloce e risparmiando un download extra inutile. L&#8217;installazione di approx è immediata:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">root@proxy:~# apt-get install approx</pre></div></div>

<p>una volta finito il processo, si deve editare il file <em>/etc/default/approx</em> solamente nel caso sia necessario fornire al nostro proxy apt&#8230; un proxy per uscire! Per esempio:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># Default settings for approx, included by the /etc/init.d/approx shell script</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Uncomment and edit this definition to have approx use a proxy server</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">http_proxy</span>=il-mio-proxy:porta</pre></div></div>

<p>A questo punto si può procedere alla vera configurazione di approx, il file <em>/etc/approx/approx.conf</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># Here are some examples of remote repository mappings.</span>
<span style="color: #666666; font-style: italic;"># See http://www.debian.org/mirror/list for mirror sites.</span>
&nbsp;
debian          http:<span style="color: #000000; font-weight: bold;">//</span>mi.mirror.garr.it<span style="color: #000000; font-weight: bold;">/</span>mirrors<span style="color: #000000; font-weight: bold;">/</span>debian
security        http:<span style="color: #000000; font-weight: bold;">//</span>security.debian.org<span style="color: #000000; font-weight: bold;">/</span>debian-security
volatile        http:<span style="color: #000000; font-weight: bold;">//</span>volatile.debian.org<span style="color: #000000; font-weight: bold;">/</span>debian-volatile
&nbsp;
<span style="color: #666666; font-style: italic;"># The following are the default parameter values, so there is</span>
<span style="color: #666666; font-style: italic;"># no need to uncomment them unless you want a different value.</span>
<span style="color: #666666; font-style: italic;"># See approx.conf(5) for details.</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#$interface      any</span>
<span style="color: #007800;">$port</span>          <span style="color: #000000;">80</span>
<span style="color: #666666; font-style: italic;">#$max_wait      10</span>
<span style="color: #666666; font-style: italic;">#$max_rate      unlimited</span>
<span style="color: #666666; font-style: italic;">#$user          approx</span>
<span style="color: #666666; font-style: italic;">#$group         approx</span>
<span style="color: #666666; font-style: italic;">#$syslog         daemon</span>
<span style="color: #666666; font-style: italic;">#$pdiffs        true</span>
<span style="color: #666666; font-style: italic;">#$verbose        false</span>
<span style="color: #666666; font-style: italic;">#$debug         false</span></pre></div></div>

<p>La prima sezione specifica a quale nome faranno riferimento i repository proxati, la sintassi è molto semplice:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">nome_repo      url_repo</pre></div></div>

<p>così facendo, all&#8217;indirizzo <strong>http://proxy/nome_repo</strong> risponderà la cache di <strong>url_repo</strong> o, come accade nella prima riga del nostro file di configurazione, <strong>http://proxy/debian/</strong> è una cache per <strong>http://mi.mirror.garr.it/mirrors/debian</strong>.<br />
A questo punto basta modificare il <em>/etc/apt/sources.list</em> delle macchine della propria rete e del proxy stesso, utilizzando i nuovi url:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">http:<span style="color: #000000; font-weight: bold;">//</span>proxy<span style="color: #000000; font-weight: bold;">/</span>debian<span style="color: #000000; font-weight: bold;">/</span>   lenny main contrib non-free
http:<span style="color: #000000; font-weight: bold;">//</span>proxy<span style="color: #000000; font-weight: bold;">/</span>security<span style="color: #000000; font-weight: bold;">/</span>   lenny<span style="color: #000000; font-weight: bold;">/</span>updates main contrib non-free
http:<span style="color: #000000; font-weight: bold;">//</span>proxy<span style="color: #000000; font-weight: bold;">/</span>volatile<span style="color: #000000; font-weight: bold;">/</span>   lenny<span style="color: #000000; font-weight: bold;">/</span>volatile main contrib non-free</pre></div></div>

<p>La seconda sezione, invece, si occupa della gestione delle opzioni di configurazione del comportamento di approx stesso, nel nostro esempio abbiamo configurato come porta di ascolto la 80, al contrario del default storico di apt-proxy: la 9999. Se non avessimo cambiato la configurazione, il proxy avrebbe comunque funzionato ma nei client si doveva configurare esplicitamente la porta di ascolto del server usando, per esempio, una riga come <strong>http://proxy:9999/debian/   lenny main contrib non-free</strong>.<br />
Il proxy è ora in piedi, sta venendo utilizzato dai client e possiamo anche dimenticarci della sua presenza! Se però vogliamo provare a verificare manualmente il suo comportamento, approx ci fornisce due ulteriori programmi che vengono usati esclusivamente da cron per mantenere in forma il proxy ma che il sistemista curioso può provare a lanciare manualmente.<br />
Il primo programma è <strong>update_approx</strong> che viene schedulato come giornaliero al momento dell&#8217;installazione, questo programma si preoccupa di aggiornare la lista e le versioni dei programmi reperibili dai repository remoti.<br />
Il secondo è <strong>gc_approx</strong>, il garbage collector: come dice il nome, questo programma si preoccupa di tenere pulita la cache di approx, eliminando i pacchetti superfli e non più disponibili dai repository remoti. Al momento dell&#8217;installazione questo programma viene schedulato come settimanale.<br />
Credo che valga veramente la pena installare approx o un altro proxy apt: il risparmio di banda è notevole già da quando si utilizzano solo due macchine e la vostra connessione vi ringrazierà <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/2009/05/approx-risparmiare-banda-con-i-proxy-apt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DPKG: Panoramica ed opzioni particolari</title>
		<link>http://www.miamammausalinux.org/2009/03/dpkg-panoramica-ed-opzioni-particolari/</link>
		<comments>http://www.miamammausalinux.org/2009/03/dpkg-panoramica-ed-opzioni-particolari/#comments</comments>
		<pubDate>Mon, 02 Mar 2009 16:38:24 +0000</pubDate>
		<dc:creator>Francesco Pedrini</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[dpkg]]></category>
		<category><![CDATA[Package management]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=441</guid>
		<description><![CDATA[Sulla scia del precedente articolo di Raoul Scarazzini &#8220;RPM: Panoramica ed opzioni particolari&#8221;, ho deciso di ampliare il discorso e proporre qui una panoramica di DPKG, il package manager nato e progettato per Debian e usato da tutte le sue derivate (Ubuntu, Mepis, Knoppix e tante altre). Stati dei pacchetti Prima di addentrarci nella spiegazione [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/03/debian.png" alt="debian" title="debian" width="100" height="123" class="alignnone size-full wp-image-490" /></p>
<p>Sulla scia del precedente articolo di Raoul Scarazzini <a href="http://www.miamammausalinux.org/2009/01/rpm-panoramica-ed-opzioni-particolari/">&#8220;RPM: Panoramica ed opzioni particolari&#8221;</a>, ho deciso di ampliare il discorso e proporre qui una panoramica di DPKG, il package manager nato e progettato per Debian e usato da tutte le sue derivate (Ubuntu, Mepis, Knoppix e tante altre).</p>
<p><strong>Stati dei pacchetti</strong></p>
<p>Prima di addentrarci nella spiegazione delle numerose opzioni di dpkg, è necessario introdurre il concetto di &#8220;stato&#8221; di un pacchetto.</p>
<p>Su Debian, non ci si limita ad avere i classici due stati per un pacchetto &#8220;non installato&#8221; ed &#8220;installato&#8221;, sarebbe troppo semplice e semplicistico!</p>
<p>La necessità di avere diversi stati è data dal fatto che l&#8217;installazione di un pacchetto non può essere un&#8217;operazione atomica (cioè che viene eseguita tutta), ma si compone di varie fasi, dalla decompressione del pacchetto deb (che è un file compresso in formato &#8216;ar&#8217;) fino al lancio degli script contenuti nel pacchetto necessari alla corretta installazione.</p>
<p>Di seguito l&#8217;elenco dei possibili stati con una loro spiegazione sommaria:</p>
<ul>
<li><em>not-installed</em>: il più semplice, lo stato di un pacchetto che non è ancora stato installato&#8230;</li>
<li><em>half-installed</em>: l&#8217;installazione del pacchetto è iniziata ma per qualche motivo non è stata completata (errori vari oppure interruzione del processo da parte dell&#8217;utente)</li>
<li><em>unpacked</em>: il pacchetto è stato correttamente decompresso e i suoi file sono stati posizionati nelle varie directory di destinazione, ma la configurazione del pacchetto non è ancora avvenuta</li>
<li><em>half-configured</em>: il pacchetto ha già raggiunto lo stato di &#8220;unpacked&#8221;, ed è iniziata la fase di configurazione che non è giunta a termine (anche in questo caso per colpa di errori vari o a causa dell&#8217;interruzione da parte dell&#8217;utente)</li>
<li><em>triggers-awaited</em>: il pacchetto è installato e configurato, ma sta attendendo l&#8217;esecuzione dei &#8216;trigger&#8217; di un altro pacchetto. I &#8216;Trigger&#8217; di dpkg sono un modo per posticipare l&#8217;esecuzione di alcune operazioni comuni, pensate ad esempio al lancio del comando &#8216;ldconfig&#8217;, che deve essere lanciato dopo l&#8217;installazione di un pacchetto che contiene librerie&#8230; Un trigger su ldconfig è utile, nel caso di installazione di molti pacchetti, per eseguire l&#8217;operazione solo una volta al termine dell&#8217;installazione di tutti i pacchetti, anzichè lanciare ldconfig al termine dell&#8217;installazione di ogni pacchetto&#8230; il risparmio di tempo e di risorse è notevole!</li>
<li><em>trigger-pending</em>: i trigger del pacchetto sono in fase di esecuzione</li>
<li><em>installed</em>: il pacchetto è stato decompresso, configurato e &#8216;triggerato&#8217;, è finalmente disponibile per il sistema.</li>
</ul>
<p>Oltre agli stati dei pacchetti bisogna distinguere anche lo &#8216;Stato di selezione dei pacchetti&#8217; e le &#8216;Flag dei pacchetti&#8217;;</p>
<p><strong>Stato di Selezione Dei Pacchetti</strong></p>
<p>Dpkg lavora su collezioni di pacchetti, e ne processa uno alla volta, lo &#8216;seleziona&#8217; appunto. Ogni pacchetto che deve venire processato ha uno stato target, al termine del lavoro di dpkg si spera che il pacchetto possa essere lasciato nello stato desiderato. Gli stati di selezione dei pacchetti sono tre:</p>
<ul>
<li><em>install</em>: il pacchetto è stato selezionato per essere installato, al termine dell&#8217;operazione il suo stato sarà &#8220;installed&#8221;</li>
<li><em>deinstall</em>: il pacchetto è stato selezionato per essere rimosso dal sistema, verranno rimossi tutti i suoi files tranne i file di configurazione posti in /etc</li>
<li><em>purge</em>: il pacchetto è stato selezionato per la rimozione completa dal sistema, verranno rimossi anche i file di configurazione posti in /etc</li>
</ul>
<p><strong>Flag dei pacchetti</strong></p>
<p>Una volta che un pacchetto risulta in stato &#8216;<em>installed</em>&#8216;può avere due flags, che contraddistinguono in maniera più particolare ciò che dpkg deve fare con lui:</p>
<ul>
<li><em>hold</em>: il pacchetto è installato, ma non viene più gestito da dpkg, deve rimanere così com&#8217;è. L&#8217;unica maniera per far eseguire a dpkg operazioni su quel pacchetto è usare l&#8217;opzione &#8211;force-hold</li>
<li><em>reinst-required</em>: il pacchetto è rovinato (sono stati cancellati dei file oppure la rimozione non è andata a buon fine) e deve per tanto essere reinstallato. I pacchetti con questa flag non possono essere rimossi senza specificare l&#8217;opzione &#8211;force-remove-reinstreq</li>
</ul>
<p><strong>Operazioni comuni con i pacchetti DEB</strong></p>
<p>E siamo finalmente arrivati alle operazioni più comuni che si fanno con dpkg&#8230;</p>
<p><strong>Interrogazioni sul database di DPKG</strong></p>
<p>Per ottenere la lista di tutti i pacchetti (in qualsiasi stato) presenti sul sistema è sufficiente lanciare dpkg passando l&#8217;opzione &#8216;-l&#8217;, che produrrà un output simile al seguente</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ dpkg -l
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Cfg-files/Unpacked/Failed-cfg/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad)
||/ Name           Version        Description
+++-==============-==============-============================================
ii  adduser        3.110          add and remove users and groups
ii  aircrack-ng    1:1.0~rc1-2    wireless WEP/WPA cracking utilities
ii  akregator      4:3.5.9-5      RSS feed aggregator for KDE
ii  alsa-base      1.0.17.dfsg-4  ALSA driver configuration files
ii  alsa-tools     1.0.16-2       Console based ALSA utilities for specific ha
ii  alsa-utils     1.0.16-2       ALSA utilities
...
ii  zlib1g         1:1.2.3.3.dfsg compression library - runtime
ii  zlib1g-dev     1:1.2.3.3.dfsg compression library - development
ii  zsh            4.3.9-1        A shell with lots of features</pre></div></div>

<p>A parte l&#8217;intestazione iniziale che serve giusto a ricordare gli stati possibili per i pacchetti, la parte interessante è l&#8217;elenco, andiamo ad analizzare la struttura dell&#8217;output:</p>
<p>La prima colonna mostra appunto lo stato dei pacchetti, &#8216;ii&#8217; identifica appunto i pacchetti installati, è lo stato più comune nell&#8217;output di dpkg.</p>
<p>Un altro stato che è facile incontrare è lo stato &#8216;rc&#8217;, che identifica i pacchetti che sono stati disinstallati, tali pacchetti non sono più presenti sul sistema, ma vengono mantenuti tutti i file di configurazione.</p>
<p>Quello che identifichiamo come &#8216;prima colonna&#8217; identifica in realtà due dati, il primo è lo stato <em>desiderato</em>, cioè cosa è stato chiesto dall&#8217;utente ed è il primo carattere, il secondo è lo stato <em>effettivo</em> del pacchetto sul sistema.</p>
<p>Ad esempio quando un pacchetto è marcato come &#8216;<em>ii</em>&#8216;, significa che l&#8217;installazione è stata richiesta dall&#8217;utente e che esso è effettivamente installato, mentre un pacchetto &#8216;<em>rc</em>&#8216; è stato rimosso, ma sono rimasti i file di configurazione (cioè non è stata richiesta un&#8217;operazione di &#8216;purge&#8217;).</p>
<p>La seconda colonna invece indica il nome del pacchetto, la terza la versione di tale pacchetto e l&#8217;ultima la descrizione breve associata ad ogni pacchetto.</p>
<p>Per ottenere invece, la lista dei pacchetti installati possiamo usare il seguente comando:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ dpkg --get-selections | awk '/tinstall$/</pre></div></div>

<p>La lista generata dall&#8217;opzione <em>&#8211;get-selections</em> è comoda anche per replicare un sistema su un&#8217;altro, l&#8217;operazione è abbastanza semplice:</p>
<p>Sul sistema sorgente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ dpkg --get-selections &gt; package_list
scp package_list user@target:</pre></div></div>

<p>Sul sistema di destinazione:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ dpkg --set-selection&lt; package_list
apt-get dselect-upgrade</pre></div></div>

<p>In questo modo, apt (il principale frontend a dpkg, che si occupa di scaricare e risolvere le dipendenze dei vari pacchetti) andrà a cercare la lista di pacchetti da scaricare non sullo standard input ma direttamente sul database di dpkg.</p>
<p>Per ottenere informazioni su un pacchetto installato è disponibile l&#8217;opzione -p:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ dpkg -p coreutils
Package: coreutils
Essential: yes
Priority: required
Section: utils
Installed-Size: 10368
Maintainer: Michael Stone &lt;mstone@debian.org&gt;
Architecture: powerpc
Version: 6.10-6
Replaces: debianutils (&lt;= 2.3.1), dpkg (&lt;&lt; 1.13.2), fileutils, shellutils, stat, textutils
Provides: fileutils, shellutils, textutils
Pre-Depends: libacl1 (&gt;= 2.2.11-1), libc6 (&gt;= 2.7-1), libselinux1 (&gt;= 2.0.59)
Conflicts: stat
Size: 3649670
Description: The GNU core utilities
 This package contains the essential basic system utilities.
 .
 Specifically, this package includes:
 basename cat chgrp chmod chown chroot cksum comm cp csplit cut date dd df dir
 dircolors dirname du echo env expand expr factor false fmt fold groups head
 hostid id install join link ln logname ls md5sum mkdir mkfifo mknod mv nice nl
 nohup od paste pathchk pinky pr printenv printf ptx pwd readlink rm rmdir
 sha1sum seq shred sleep sort split stat stty sum sync tac tail tee test touch
 tr true tsort tty uname unexpand uniq unlink users vdir wc who whoami yes</pre></div></div>

<p>Per ottenere invece la lista dei files contenuti all&#8217;interno di un pacchetto installato è possibile usare l&#8217;opzione -L:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ dpkg -L coreutils
/.
/bin
/bin/cat
/bin/chgrp
/bin/chmod
/bin/chown
/bin/cp
/bin/date
...
/usr/share/locale/vi/LC_TIME/coreutils.mo
/usr/share/locale/zh_CN/LC_TIME/coreutils.mo
/usr/share/locale/zh_TW/LC_TIME/coreutils.mo
/usr/bin/touch
/usr/bin/md5sum.textutils</pre></div></div>

<p>Nel caso invece si disponga di un pacchetto deb non installato è possibile usare l&#8217;opzione -c:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ dpkg -c /var/cache/apt/archive/coreutils_6.10-6_powerpc.deb
drwxr-xr-x root/root         0 2008-04-04 17:08 ./
drwxr-xr-x root/root         0 2008-04-04 17:08 ./bin/
-rwxr-xr-x root/root     20780 2008-04-04 17:08 ./bin/cat
-rwxr-xr-x root/root     44992 2008-04-04 17:08 ./bin/chgrp
-rwxr-xr-x root/root     40596 2008-04-04 17:08 ./bin/chmod
-rwxr-xr-x root/root     47060 2008-04-04 17:08 ./bin/chown
...
lrwxr-xr-x root/root         0 2008-04-04 17:08 ./usr/share/locale/vi/LC_TIME/coreutils.mo -&gt; ../LC_MESSAGES/coreutils.mo
lrwxr-xr-x root/root         0 2008-04-04 17:08 ./usr/share/locale/zh_CN/LC_TIME/coreutils.mo -&gt; ../LC_MESSAGES/coreutils.mo
lrwxr-xr-x root/root         0 2008-04-04 17:08 ./usr/share/locale/zh_TW/LC_TIME/coreutils.mo -&gt; ../LC_MESSAGES/coreutils.mo
lrwxr-xr-x root/root         0 2008-04-04 17:08 ./usr/bin/touch -&gt; /bin/touch
lrwxr-xr-x root/root         0 2008-04-04 17:08 ./usr/bin/md5sum.textutils -&gt; md5sum</pre></div></div>

<p><strong>Installazione e aggiornamento di un pacchetto</strong></p>
<p>Per l&#8217;installazione di un pacchetto scaricato localmente è possibile utilizzare l&#8217;opzione -i (o &#8211;install):</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ dpkg -i /var/cache/apt/archives/coreutils_6.10-6_powerpc.deb
(Reading database ... 259576 files and directories currently installed.)
Preparing to replace coreutils 6.10-6 (using .../coreutils_6.10-6_powerpc.deb) ...
Unpacking replacement coreutils ...
Setting up coreutils (6.10-6) ...
Processing triggers for man-db ...</pre></div></div>

<p>Nel caso di aggiornamento di un pacchetto precedentemente installato, dpkg si occuperà da solo di rimuovere la versione più vecchia e sovrascriverla con la nuova versione (o con la stessa versione nel caso di una reinstallazione, come nel caso precedente).</p>
<p>Nel caso si vogliano installare ricorsivamente i pacchetti contenuti in una struttura di directory è possibile usare l&#8217;opzione -R ( o &#8211;recursive) passando come parametro il path di tale directory, in questo modo dpkg eseguirà l&#8217;operazione ricorsivamente su tutti i file contenuti all&#8217;interno della dir:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">dpkg -Ri /var/cache/apt/archives</pre></div></div>

<p><strong>Rimozione di un pacchetto</strong></p>
<p>Dpkg mette a disposizione due metodi per rimuovere i pacchetti: la semplice rimozione che rimuove tutti i file del pacchetto tranne che la configurazione nelle directory di sistema (quindi in /etc) e il &#8216;<em>purge</em>&#8216; del pacchetto, che elimina qualsiasi traccia del pacchetto, compresi i file di configurazione globali. Ovviamente tutti i file creati dalle varie applicazioni nelle home directory di utenti non verranno toccati.</p>
<p>Per rimuovere semplicemente un pacchetto bisogna usare l&#8217;opzione -r (o &#8211;remove):</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">dpkg -r alsa-utils</pre></div></div>

<p>Per purgare un pacchetto invece si utilizza l&#8217;opzione -P (o &#8211;purge):</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">dpkg -P alsa-utils</pre></div></div>

<p><strong>Risoluzione delle dipendenze</strong></p>
<p>Dpkg non è mai stato progettato per risolvere in autonomia le dipendenze, l&#8217;unica cosa che è in grado di fare è verificare se esse sono soddisfatte, mentre la risoluzione è affidata a tool di più alto livello come Apt o Aptitude. Questi tool oltre a risolvere le dipendenze si occupano anche di scaricare i file dai repository ufficiali di Debian (o della distribuzione derivata, come Ubuntu).</p>
<p>Apt fornisce un wrapper per quasi tutte le opzioni di dpkg, le più comuni sono comunque quelle di ricerca, installazione e rimozione:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ apt-get install coreutils  #installa il pacchetto specificato
$ apt-get instal --reinstall coreutils  #reinstalla il pacchetto specificato
&nbsp;
$ apt-get remove coreutils  #rimuove il pacchetto specificato
$ apt-get remove --purge coreutils  #rimuove il pacchetto specificato e ne effettua il purge
&nbsp;
$ apt-cache search coreuti  #cerca tutti i pacchetti il cui nome è simile a 'coreuti'
$ apt-cache show coreutils  #mostra le informazioni relative al pacchetto coreutils</pre></div></div>

<p><strong>Estrazione di un pacchetto</strong></p>
<p>Con dpkg è anche possibile estrarre un pacchetto senza installarlo, giusto a scopo di analisi, si deve usare l&#8217;opzione -x (o &#8211;extract):</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ dpkg -x /var/cache/apt/archives/coreutils_6.10-6_powerpc.deb directory_target</pre></div></div>

<p>All&#8217;interno di &#8216;directory_target&#8217; sarà presente tutta la struttura del pacchetto deb.</p>
<p>È anche possibile estrarre un singolo file dal pacchetto utilizzando l&#8217;opzione &#8211;fsys-tarfile, che fa produrre a dpkg l&#8217;output sotto forma di tarfile, una volta ottenuto quel file è possibile estrarre tutto grazie al comando tar:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ dpkg --fsys-tarfile /var/cache/apt/archives/coreutils_6.10-6_powerpc.deb | tar -tvf -</pre></div></div>

<p><strong>Conclusioni</strong></p>
<p>Ciò che è stato illustrato in questa panoramica corrisponde solo alla punta dell&#8217;iceberg delle potenzialità di dpkg, che tra le varie cose è anche in grado di creare da solo pacchetti .deb (a differenza di rpm che si appoggia a tool come rpmbuild). Per una lista completa ed esauriente di tutte le opzioni e le possibilità offerte da dpkg consiglio la lettura del <em>fine manual</em> di dpkg.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/03/dpkg-panoramica-ed-opzioni-particolari/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Puppet: Automatizzazione dei task di amministrazione</title>
		<link>http://www.miamammausalinux.org/2009/01/puppet-automatizzazione-dei-task-di-amministrazione/</link>
		<comments>http://www.miamammausalinux.org/2009/01/puppet-automatizzazione-dei-task-di-amministrazione/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 15:47:42 +0000</pubDate>
		<dc:creator>Marco Bonetti</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[Puppet]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Automatizzazione task]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=343</guid>
		<description><![CDATA[Puppet è una infrastruttura per l&#8217;automatizzazione della gestione e amministrazione di un parco macchine UNIX-like. Il framework è composto da un puppet master che è il server centrale incaricato di raccogliere tutte le azioni e i file di configurazione utilizzati e da svariati puppet, agenti che vengono installati sulle macchine che si vogliono controllare e [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/puppet.png" alt="puppet" width="151" height="44" class="alignnone size-full wp-image-357" /></p>
<p><a href="http://reductivelabs.com/trac/puppet/">Puppet</a> è una infrastruttura per l&#8217;automatizzazione della gestione e amministrazione di un parco macchine UNIX-like.<br />
Il framework è composto da un <em>puppet master</em> che è il server centrale incaricato di raccogliere tutte le azioni e i file di configurazione utilizzati e da svariati <em>puppet</em>, agenti che vengono installati sulle macchine che si vogliono controllare e periodicamente contattano il master per conoscere nuove configurazioni e controllare se il proprio stato è in linea con quanto richiesto dal server centrale. Per ultime ci sono le <em>recipe</em>, le ricette, file di testo che descrivono le azioni da intraprendere sui puppet e i file di configurazione da utilizzare.</p>
<p>Puppet è disponibile già pacchettizzato per la maggior parte delle distribuzioni Linux, vediamo come è possibile eseguire un setup di prova di un puppet master e di un singolo client su macchine Debian Etch. Prima di proseguire, però, una piccola nota: la versione inclusa in Etch è piuttosto vecchia e non implementa alcune feature interessanti, come la gestione delle ricette via moduli, presenti in versioni più recenti del programma. Se si vuole sperimentare con queste nuove caratteristiche è comunque sempre possibile installare senza problemi i pacchetti dal repository Testing, in quanto gli sviluppatori si assicurano che tali pacchetti siano sempre compatibili con la versione Stable della distribuzione.</p>
<p><strong>1. Il puppet master</strong><br />
Raggiungete la macchina prescelta come puppet master che chiameremo, senza troppa fantasia, master e installate i programmi necessari:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">root@master:~# apt-get install puppetmaster</pre></div></div>

<p>Questa operazione installerà anche le dipendenze, compreso il pacchetto per l&#8217;agent puppet.<br />
L&#8217;installazione terminerà con uno sconfortante errore: niente paura! Il master non è ancora stato configurato a dovere e gli script di init non sono in grado di avviarlo correttamente.<br />
Preoccupiamoci innanzitutto di permettere l&#8217;accesso ai file che verranno serviti dal nostro master, editate il file <em>/etc/puppet/fileserver.conf</em> e aggiungete una riga per permettere l&#8217;accesso alla sottorete 192.168.0.0/24 (per esempio):</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;"><span style="color: #000066; font-weight:bold;"><span style="">&#91;</span>files<span style="">&#93;</span></span>
  path /etc/puppet/files
  allow 192.168.0.0/<span style="">24</span></pre></div></div>

<p>A questo punto creiamo una configurazione iniziale, editate il file <em>/etc/puppet/manifests/site.pp</em> con il seguente contenuto:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># Main puppet master configuration</span>
import <span style="color:#996600;">&quot;classes/*.pp&quot;</span>
&nbsp;
node default <span style="color:#006600; font-weight:bold;">&#123;</span>
  import sudo
<span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p>La prima riga richiede l&#8217;inclusione dei file .pp (le ricette) presenti nella cartella classes, vedremo tra poco come crearli, le successive definiscono la configurazione di default da servire ai nodi e questa richiede l&#8217;implementazione della ricetta &#8220;sudo&#8221;.<br />
Vediamo, dunque, la nostra prima ricetta: &#8220;sudo&#8221;, questa ricetta si preoccupa di controllare che i permessi del file <em>/etc/sudoers</em> siano corretti. Creiamo la cartella per le ricette:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">root@master:~# mkdir /etc/puppet/manifests/classes</pre></div></div>

<p>Dopo di che scriviamo il file <em>/etc/puppet/manifests/classes/sudo.pp</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># Testing class for sudoers permissions</span>
class <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span>
&nbsp;
        <span style="color: #c20cb9; font-weight: bold;">file</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span> <span style="color: #ff0000;">&quot;/etc/sudoers&quot;</span>:
                owner =<span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #ff0000;">&quot;root&quot;</span>,
                group =<span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #ff0000;">&quot;root&quot;</span>,
                mode =<span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #000000;">440</span>,
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></div></div>

<p>Il master è stato configurato correttamente, occupiamoci ora del client locale, editate <em>/etc/puppet/puppetd.conf</em> con i seguenti contenuti:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;"><span style="color: #000066; font-weight:bold;"><span style="">&#91;</span>puppetd<span style="">&#93;</span></span>
# Make sure all log messages are sent to the right directory
# This directory must be writable by the puppet user
<span style="color: #000099;">logdir</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">/var/log/puppet</span>
<span style="color: #000099;">vardir</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">/var/lib/puppet</span>
<span style="color: #000099;">rundir</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">/var/run</span>
<span style="color: #000099;">server</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">master</span></pre></div></div>

<p>Fatto! Master e puppet (locale) sono stati configurati correttamente, proviamo quindi la configurazione in locale, come prima azione simuliamo un guasto cambiando i permessi di sudoers:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">root@master:~# chmod 700 /etc/sudoers</pre></div></div>

<p>Ora, riavviamo i servizi del master e del puppet locale:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">root@master:~# /etc/init.d/puppetmaster restart
root@master:~# /etc/init.d/puppet restart</pre></div></div>

<p>Se ora controlliamo nuovamente sudoers dovremmo trovare i suoi permessi originali a 440 <img src='http://www.miamammausalinux.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>2. I puppet</strong><br />
Un puppet master senza alcun puppet client non ha alcun senso di esistere, vediamo quindi come è possibile configurare un ipotetico client che ripsponda all&#8217;indirizzo puppet1 come client per il master configurato in precedenza. Il pacchetto necessario è puppet, quindi installiamolo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">root@puppet1:~# apt-get install puppet</pre></div></div>

<p>Ed editiamo il suo file di configurazione, <em>/etc/puppet/puppetd.conf</em>, usando lo stesso identico contenuto già riportato in precedenza:</p>

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;"><span style="color: #000066; font-weight:bold;"><span style="">&#91;</span>puppetd<span style="">&#93;</span></span>
# Make sure all log messages are sent to the right directory
# This directory must be writable by the puppet user
<span style="color: #000099;">logdir</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">/var/log/puppet</span>
<span style="color: #000099;">vardir</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">/var/lib/puppet</span>
<span style="color: #000099;">rundir</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">/var/run</span>
<span style="color: #000099;">server</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">master</span></pre></div></div>

<p>Il client è configurato e pronto a ricevere istruzioni. Prima di poter ricevere istruzioni, però, è necessario che il master conosca il client e lo autorizzi a ricevere le istruzioni registrate. Per fare ciò cominciamo ad avviare il client:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">root@puppet1:~# /etc/init.d/puppet restart</pre></div></div>

<p>Spostiamoci sul server e controlliamo la coda di richieste:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">root@master:~# puppetca --list</pre></div></div>

<p>Dovrebbe apparire il nome del client, nel nostro esempio è puppet1, firmiamo quindi il suo certificato e abilitiamolo a ricevere le configurazioni:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">root@master:~# puppetca --sign puppet1</pre></div></div>

<p>Fine! Master e puppet sono ora configurati correttamente, facciamo un ultima prova simulando lo stesso guasto provato in precedenza sul nostro client: alterate i permessi di <em>/etc/sudoers</em> nel client, dopo di che riavviate il servizio:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">root@puppet1:~# /etc/init.d/puppet restart</pre></div></div>

<p>E il file sudoers verrà corretto, di nuovo <img src='http://www.miamammausalinux.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Puppet non si limita a sistemare permessi sui files ma si occupa anche di trasferire contenuti e assicurare l&#8217;installazione di pacchetti o l&#8217;esecuzione di comandi, il <a href="http://reductivelabs.com/trac/puppet/wiki/DocumentationStart">wiki</a> raccoglie documentazione in quantità per creare le proprie ricette ed è un ottimo punto di partenza per ottenere più informazioni.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/01/puppet-automatizzazione-dei-task-di-amministrazione/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

