(traduzione realizzata da kyuzo)
Nel progetto Mageia il team degli amministratori di sistema (n.d.t. detto sysadmin) è responsabile della configurazione e della manutenzione di tutta la struttura mageia così come degli utenti e dei contributori. Per aiutare le persone a comprendere di cosa si occupa questo team e per condividere qualche idea con altri amministratori di sistema, pubblicheremo una serie di post per spiegare cosa facciamo.
I nostri principali compiti sono:
- Installazione dei server nei datacenter
- Installazione e configurazione di software vari sui server Mageia
- Compiti vari da amministratore, come aggiornamenti dei permessi per gli utenti, rimozione pacchetti, trasferimento pacchetti tra i vari repository, etc.
- Sviluppo e manutenzione di strumenti vari, come per esempio i componenti del sistema di compilazione dei pacchetti (n.d.t. dall’inglese package build system)
Questo primo post tratterà delle procedure usate per l’installazione e la configurazione di software sui server Mageia, delle ragioni per cui facciamo questo, e dei motivi per cui potreste voler utilizzare procedure simili quando gestite i vostri propri server.
Una sintesi del processo utilizzato per configurare il software su server Mageia potrebbe essere:
- Tutto il software è installato usando pacchetti
- Tutti i pacchetti sono costruiti utilizzando il build system (n.d.t. sistema di compilazione)
- Tutti i pacchetti sono installati e configurati con puppet
La ragione di ciò può già essere chiara per la maggior parte dei packager Mageia. Questo post vuole spiegarne i motivi a chi invece non lo è.
Compilazione ed installazione del software
Uno dei compiti più comuni dell’amministratore di sistema è l’installazione o l’aggiornamento del software. Quando è la tua distro Linux a fornire i pacchetti per il software che ti occorre, è semplice; il pacchetto può essere installato utilizzando il gestore dei pacchetti.
Tuttavia, in molti casi il software in questione non sarà disponibile nella distro che stai usando, oppure non lo sarà nella versione di cui hai bisogno.
Compilare il pacchetto manualmente
Molti pensano che la soluzione più semplice sia quella di scaricare il codice sorgente del software, seguire le istruzione per la compilazione e utilizzare gli script di installazione o il Makefile presenti. A seguire questa strada però, possono sorgere parecchi problemi:
- Installare le dipendenze necessarie per la compilazione :
Avrete bisogno di tutte le dipendenze necessarie per la compilazione installate nel vostro sistema. Nella maggior parte dei casi vorrete compilare il software in un server dedicato a questo compito, e poi copiarne i binari ottenuti sulle vostre macchine. - Gestire le dipendenze :
Se state utilizzando archivi tarball o un server NFS per distribuire i binari del vostro software alle macchine che ne faranno uso, dovrete trovare ed installare tutte le dipendenze necessarie perchè il software funzioni su ogni macchina. Inoltre vorrete creare una lista delle dipendenze da salvare da qualche parte, così da ricordarvi cosa deve essere installato quando deciderete di utilizzare quel software su una nuova macchina. - Aggiornare il software :
Quando compilate un software, spesso avrete bisogno di impostare opzioni specifiche in uno script configure o in un file di configurazione. Alcuni software possono essere difficili da compilare e possono richiedere complesse operazioni o configurazioni per poterli compilare. Quando aggiornate un software ad una nuova versione, probabilmente vorrete mantenere la stessa configurazione di compilazione, per evitare di introdurre cambiamenti non necessari col solo rischio di bloccare il sistema. Tutto ciò non è facile da ricordare, e a meno che non sia un esercizio quotidiano, probabilmente prima o poi lo dimenticherete. Così vorrete conservare le configurazioni personali in un file, così da essere in grado di usarle successivamente, quando avrete bisogno di nuovo di aggiornare il software. - Patchare il software :
Certe volte il software necessiterà solo di piccole modifiche per poterlo compilare, o per poterlo eseguire o, ancora, vorrete aggiungere ulteriori funzionalità. Potrete applicare tali modifiche prima di iniziare il processo di compilazione. Ma questi cambiamenti andranno perduti una volta che utilizzerete i sorgenti da un tarball che aggiorna il software.Per essere in grado di applicare le stesse modifiche alle nuove versioni del software, dovrete salvare questi cambiamenti in qualche sorta di patch. - Conservare un changelog (archivio delle modifiche) :
E’ facile dimenticare perchè avete voluto fare determinati cambiamenti, o perché abbiate voluto aggiornare un particolare modulo del software. Specialmente se non lavorate da soli ma fate parte di un team, sarà necessario conservare un archivio delle modifiche effettuate sul software che avete compilato ed installato. - Sapere che versione del software avete installato, disinstallare o aggiornare il software :
Sapere che versione del software è attualmente installata è molto utile. E’ altrettanto utile essere in grado di disinstallare quel software, o installarne una versione differente per testarlo, o per ricercarne eventuali bug, o ritornare ad una versione precedente se si riscontra qualche problema. Se usate le procedure di installazione standard, gran parte del software installerà files in un mucchio di posti diversi del sistema. Sapere quali file sono installati dove, e qual è la versione attualmente in uso, è difficile se non impossibile. Quando installate una nuova versione del software, gli script di installazione faranno si che i vecchi file vengano sovrascritti, senza però che i file obsoleti vengano rimossi, creando così confusione o problemi. Alcuni cercano di evitare questi problemi installando ciascun software in una cartella differente, includendo il numero della versione nel nome della directory stessa. Questo però può creare problemi ulteriori: gran parte del software non è concepito per essere installato in questo modo e sarà quindi necessario utilizzare qualche trucco affinché funzionino. Inoltre può essere che la particolare versione che intendete usare abbisogni di una complessa rivisitazione dei link simbolici o delle variabili d’ambiente. E questo può diventare ancora più complicato quando installiamo dei software che hanno reciproche dipendenze. La miglior soluzione per evitare questo genere di problemi e di utilizzare strumenti specifici che tengano traccia di QUALI file sino installati DOVE, e in QUALE versione.
Usare i pacchetti
Per risolvere i problemi di cui sopra, potreste voler utilizzare strumenti specifici. Anzi, potreste voler iniziare a scrivere il vostro script personale od il vostro programma personale per gestire questo tipo di cose. In realtà è molto meglio utilizzare quanto è già esistente e disponibile. Gli strumenti migliori per risolvere questi problemi sono i Package Managers (Gestori di Pacchetti).
Se non avete mai creato dei pacchetti prima, è necessario spendere un po ‘di tempo per imparare a farlo. Tuttavia la fatica farà risparmiare un sacco di tempo dopo. L’utilizzo di pacchetti per costruire e installare il software ha un mucchio di vantaggi:
- Installazione dipendenze di compilazione:
I pacchetti vi permetteranno di compilare il vostro software su una macchina specifica, producendo pacchetti che saranno poi installati sulla macchina prescelta senza obbligarvi ad installarci sopra nessuna delle dipendenze necessarie alla compilazione. Il sorgente dei pacchetti vi permettrà inoltre di specificare la lista delle dipendenze di compilazione, così che possano essere installate automaticamente sulla vostra macchina per la compilazione per poi essere successivamente rimosse. - Gestire le dipendenze automaticamente:
Tener traccia delle dipendenze richiede molto tempo e non è sempre facile. Fortunatamente la maggior parte dei sistemi di compilazione analizzerà i file inclusi nel pacchetto per determinarne le dipendenze. Le librerie perl, python, ruby, PHP, C/C++ vengono normalmente individuate in automatico durante la compilazione. Le dipendenze che non possono essere rilevate in automatico è possono invece essere esplicitate nel pacchetto. Tutte queste dipendenze potranno quindi essere installate automaticamente dal gestore dei pacchetti durante l’installazione del software. - Aggiornare il software :
I pacchetti sorgente contengono le istruzioni di compilazione. Il processo di compilazione può cambiare un po’ a volte, ma nella maggior parte dei casi sarà lo stesso per tutte le versioni del software. In questo caso aggiornare un pacchetto ad una versione più nuova sarà semplice come aggiornare il numero di versione del pacchetto sorgente e far partire il processo di compilazione dello stesso. Ricompilare il vostro software con qualche opzione differente può essere comunque fatto piuttosto facilmente. - Patchare il software :
I pacchetti sorgente vi permettono di includere correzioni che saranno applicate durante la compilazione del software. Quando si aggiorna il software ad una versione più recente, possono essere applicati i medesimi cambiamenti. - Conservare un changelog (archivio delle modifiche) :
I pacchetti contengono un file di changelog che potete utilizzare per spiegare le ragioni delle modifiche apportate, così che voi stessi o i membri del vostro team possiate sapere il perchè delle modifiche effettuate, per esempio, 6 mesi fà. Se utilizzate uno strumento di controllo del sorgente come git o subversion per gestire i vostri pacchetti sorgente (il che è raccomandato) potete usare i commit log come changelog. - Sapere che versione del software avete installato, disinstallare o aggiornare il software :
I pacchetti vi permettono di tracciare la versione del software installata sul vostro sistema. Così come vi permettono una facile installazione, disinstallazione o aggiornamento del software, o di scoprire che pacchetto fornisce un determinato file.
Creazione di pacchetti in un ambiente pulito e la distribuzione dei pacchetti
Perché è necessario utilizzare un sistema di compilazione
Il gestore di pacchetti è uno strumento molto efficiente per gestire la compilazione e l’installazione di software. Tuttavia questo non è sufficiente. Il gestore di pacchetti compilerà il software utilizzando gli strumenti e le librerie disponibili sul sistema attuale, dopo aver installato le dipendenze di compilazione previste.
Possono sorgere però, alcuni problemi :
- Supporto per più distribuzioni :
A volte l’infrastruttura utilizzerà distro diverse, o diverse versioni di una stessa distro. Un pacchetto costruito su una distro non funzionerà necessariamente su un altra, perché la versione di alcuni componenti può essere diversa o incompatibile. Per evitare questo tipo di problemi, i pacchetti dovrebbero essere compilati utilizzando la stessa distribuzione per cui verranno utilizzati. - Ambiente di compilazione “pulito” :
I pacchetti sorgente includono un elenco di dipendenze per la compilazione che devono essere installate per creare il pacchetto. Tuttavia quando si costruisce il pacchetto sulla propria macchina o su un server di compilazione specifico, di solito ci sono altri pacchetti che sono già installati e che potenzialmente possono essere utilizzati durante la compilazione di un pacchetto E ‘quindi molto facile dimenticare che si è installato qualche pacchetto, dimenticare di includere nel pacchetto dipendenze di compilazione e non accorgersi del problema, perché per voi la compilazione funziona. Il sistema potrebbe anche avere una configurazione personalizzata o aggiornamenti che avete dimenticato di aver installato, che possono potenzialmente influenzare il processo di compilazione. Il problema non sarà notato fino a quando qualcuno non avrà bisogno di ricompilare il pacchetto su un altro sistema. Se volete aumentare le probabilità di essere in grado di riprodurre il processo di ricompilazione di un pacchetto in futuro, è necessario utilizzare un ambiente “pulito” per la creazione di pacchetti. Di solito questo viene fatto con la creazione, per ogni compilazione, di un ambiente chroot minimale per la distribuzione selezionata.
Una volta che il pacchetto è stato compilato, sarà necessario copiarlo sulle macchine dove intendete installarlo. Le distro di solito forniscono gli strumenti per gestire questa operazione (apt-get su Debian, urpmi su Mageia, yum su Fedora, ecc). Questi strumenti scaricheranno e installeranno un pacchetto e le sue dipendenze da un server che mette a disposizione un repository di pacchetti. Per poter utilizzare questi strumenti, è necessario impostare un repository di pacchetti, che è una directory contenente tutti i pacchetti disponibili e alcuni metadati.
Tutto questo può essere gestito manualmente, ma è molto meglio creare un sistema per la compilazione dei pacchetti che gestirà tutto questo per voi automaticamente. Utilizzare un sistema per la compilazione dei pacchetti ha molti vantaggi :
- E’ meno soggetto ad errori :
Compilare pacchetti in un ambiente chroot, copiare i file risultanti nel repository corretto e rigenerare i metadata dei repository non è molto difficoltoso, ma porta via parecchio tempo e se fatto manualmente può causare errori. Usare un sistema per la generazione automatica dei pacchetti vi farà risparmiare tempo ed errori. - E’ più facile :
Se è vero che compilare ed installare pacchetti nel repository è un compito gravoso e soggetto ad errori, voi o gli altri membri del vostro team cercherete di evitarlo o quanto meno di farlo adottando altre soluzioni. - Strumenti di controllo di revisione e tracciabilità :
Usare git o subversion come strumenti di controllo della revisione per gestire i cambiamenti nei pacchetti sorgente è caldamente raccomandato. Un SCM collegato al sistema di compilazione farà sì che qualsiasi pacchetto disponibile nel repository sarà disponibile anche nel repository di controllo del codice sorgente, permettendo la tracciabilità dei vostri pacchetti. - Fare rispettare le politiche di compilazione :
Alcuni strumenti sono a disposizione per far rispettare alcune politiche di compilazione (rpmlint per rpm, lintian per deb). Avere politiche di compilazione è utile per avere pacchetti coerenti. Il packaging build system può essere configurato per eseguire automaticamente alcuni test di verifica e per rifiutare il caricamento di pacchetti non conformi con la stessa. - Monitoraggio :
Il sistema di compilazione consente il monitoraggio delle compilazioni più recenti. Una interfaccia web offre una rassegna delle più recenti compilazioni, i log di compilazione. Una mailing list può essere utilizzata per ricevere le notifiche di compilazione. Quando si lavora con un team questo consente a tutti i membri del team di seguire le ultime modifiche. - Automazione :
Alcuni pacchetti specifici possono richiedere ulteriori elaborazioni da svolgere quando vengono aggiornati. L’invio di una e-mail, l’estrazione di alcuni file per aggiornare un sito web o altri compiti possono essere inseriti in uno script in modo che siano eseguiti automaticamente quando il pacchetto viene aggiornato. Questo è ciò che viene utilizzato per estrarre i file di installazione Mageia nel mirror tree quando il pacchetto viene aggiornato.
Come installare un sistema di compilazione Mageia
Sarà argomento di un altro post.
Configurare il vostro software
L’installazione del software di solito è solo la prima parte del lavoro che viene fatto dagli amministratori di sistema. La seconda parte è la configurazione del software. Il pacchetto farà la prima parte della configurazione iniziale, sebbene sarà necessaria di solito una configurazione ulteriore.
Ci sono vari metodi per farlo :
- Editare manualmente la configurazione direttamente sul server
- Non fare niente di tutto ciò, ma far si che siano strumenti di gestione di configurazione come Cfengine, Puppet or Ansible a farlo per voi.
Quando si utilizza uno strumento di gestione della configurazione, non si aggiorna direttamente la configurazione sui server, ma si scrivono alcune regole nel repository di gestione della configurazione che verranno applicate automaticamente dal vostro strumento di gestione della configurazione. Non sarà veloce come la modifica diretta della configurazione sul server, ma ci sono parecchi vantaggi:
- Gestire l’infrastruttura come un progetto software :
Gli strumenti di configurazione consentono di gestire l’infrastruttura come qualsiasi altro normalissimo progetto per lo sviluppo di software. Possono essere utilizzati molti degli strumenti disponibili per gli sviluppatori di software: il controllo di revisione sorgente, l’invio di patch, la revisione di codice, test automatici, ecc. - Lavoro di gruppo :
Se si lavora in un team, è possibile memorizzare le regole di configurazione del server in un repository condiviso di controllo di revisione sorgente, rendendo possibile seguire e rivedere tutte le modifiche ai server fatti da tutti i membri del team. - Documentazione :
Avere un po’ di documentazione su che software è installato sui server e come è configurato è molto utile, soprattutto quando ci può essere più di una persona a lavorare su di esso. Tuttavia un problema molto comune con la documentazione è che qualcuno la scrive inizialmente, ma nessuno la mantiene e diventa rapidamente obsoleta. E ‘molto facile fare un cambiamento e dimenticare di documentarlo, o dimenticare che una documentazione esiste da qualche parte e deve essere aggiornata. Ma avere una documentazione accurata è importante e talvolta avendo documentazione superata che fornisce informazioni obsolete può essere peggio di non avere alcuna documentazione. Il repository di gestione della configurazione può essere utilizzato come una sorta di documentazione sulla vostra infrastruttura e, in quanto rappresenta ciò che è effettivamente utilizzato per configurare l’infrastruttura, è molto più probabile che sia accurata rispetto a qualsiasi altra documentazione. Nello sviluppo di software, avere codice ben commentato o codice che può essere compreso senza documentazione è in generale una soluzione migliore che avere la documentazione mantenuta separatamente e lo stesso si può dire per l’amministrazione del sistema. - Ambiente per il collaudo è riproducibilità :
Utilizzare uno strumento di configurazione consente di riprodurre facilmente la configurazione di un server su un altro server. Questo è utile quando è necessario sostituire o aggiungere un server o se avete bisogno di creare un ambiente di test. - Mantenere una configurazione corretta :
Lo strumento di gestione della configurazione verrà eseguito a intervalli regolari per verificare che la configurazione sia sempre corretta e per applicare eventuali modifiche che si rendano necessarie. - Riusabilità :
Come nello sviluppo di software, l’utilizzo di uno strumento di gestione della configurazione consente di riutilizzare i componenti creati. Di solito è possibile creare moduli con parametri per modificare il comportamento del modulo. A volte è possibile trovare i moduli direttamente su internet, ma purtroppo la maggior parte di essi richiedono sostanziali modifiche per essere adattati per il nostro specifico uso. Le versioni precedenti di Puppet mancavano di importanti caratteristiche come la classe parametrizzata, per cui la creazione di componenti riutilizzabili era difficile, ma si sono fatti passi avanti.
Quale strumento di gestione della configurazione utilizzare?
Quando abbiamo iniziato l’installazione di server Mageia, all’inizio del progetto Mageia, abbiamo deciso di utilizzare puppet dopo aver esaminato i vari strumenti disponibili. Puppet sembrava il più interessante strumento di gestione della configurazione al momento. Negli ultimi anni, le cose si sono evolute molto in questo settore, ed esistono alternative a Puppet che potreste prendere in considerazione prima di decidere quale usare:
I moduli Puppet di Mageia
I moduli Puppet che usiamo per configurare i server Mageia sono disponibili su un repository svn.
Cosa dobbiamo migliorare
Il processo in corso è buono, ma ci sono ancora alcune cose che potrebbero essere migliorate. Se volete contribuire, ma non sapete come fare, ecco alcune idee.
- Generazione automatica dei pacchetti :
Alcuni linguaggi come Perl, Python o Ruby utilizzano il proprio sistema di confezionamento per le librerie. Molti preferiscono usare questi pacchetti piuttosto che pacchetti RPM perché i pacchetti della distro non sono sempre disponibili o aggiornati. Il vantaggio di questi pacchetti è che sono fatti a monte, per cui sono immediatamente disponibili. Il problema è che non sono solitamente molto ben integrati con il resto del sistema, richiedendo così l’utilizzo di due diversi sistemi di pacchettizzazione, il che rende le cose più complicate. In molti casi, queste persone non sono pacchettizzatori esperti, così che preferiscono utilizzare i pacchetti disponibili, pacchettizzati secondo le specifiche del linguaggio, perché pensano che compilare sia troppo complesso o perchè non hanno il tempo per farlo. Se una conversione da quei pacchetti in RPM fosse più semplice, la gente potrebbe beneficiare di una buona disponibilità di pacchetti ben integrati con il resto del sistema. Fortunatamente i pacchetti costruiti con le specifiche di quei linguaggi di solito contengono tutte le informazioni necessarie per il confezionamento RPM (descrizioni, licenza, dipendenze, etc), in modo che creare un pacchetto RPM di solito è una semplice conversione di tali informazioni in formato RPM, potendo così automatizzare il processo. Grazie al lavoro di Jérôme Quelin su cpan2dist è ora possibile generare pacchetti RPM Mageia da moduli CPAN automaticamente. Questo è ciò che ci permette di avere 3300 pacchetti Perl disponibili nella distribuzione.Abbiamo bisogno di strumenti simili pure per i pacchetti di Python, Ruby e altri linguaggi. - Impostazione del sistema di compilazione:
Stiamo usando un sistema di compilazione per creare i nostri pacchetti, perché abbiamo già un sistema di generazione a disposizione per costruire la distribuzione Mageia, per cui non c’è da lavorarci molto di più per configurarlo per avere anche il nostro repository di pacchetti. Tuttavia l’installazione di un sistema di compilazione Mageia non è propriamente un compito facile e le persone che non intendono compilare una distribuzione completa non spenderanno troppo tempo per configurare un sistema di compilazione. Perciò, abbiamo bisogno di migliorare il processo di configurazione per renderlo più semplice. Ciò che attualmente manca è la documentazione per spiegare come fare, utilizzando il nostro modulo puppet. Un futuro post su questo blog vi spiegherà come fare. - Supporto OBS :
Un alternativa è utilizzare OBS (Open Build Service),che è un buon sistema di compilazione, con il supporto per più distribuzioni. Tuttavia manca ancora il supporto per Mageia. Dobbiamo rimediare in modo che diventi possibile gestire i repository Mageia usando OBS. - Supporto Mageia in Ansible e Salt Stack :
Ansible e Salt Stack sono entrambi interessanti strumenti di gestione della configurazione. Tuttavia, mancano ancora del supporto ad urpmi per l’installazione dei pacchetti. Aggiornamento: Philippe Makowski ha elaborato un modulo urpmi per Ansible, ma questo non è ancora integrato a monte, per cui eventuali contributi sono i benvenuti.