Au sein du projet Mageia, l’équipe sysadmin (administrateurs système) est responsable de la mise en place et de la maintenance de toute l’infrastructure de Mageia, aussi bien pour les utilisateurs que pour les contributeurs. Pour aider le public à comprendre ce que fait l’équipe, et pour partager des idées avec d’autres administrateurs système, nous allons publier une série de billets pour expliquer notre travail.
Nos principales tâches sont :
- Installation des serveurs dans le centre de données
- Installation et configuration des divers logiciels sur les serveurs de Mageia
- Diverses tâches d’administrateur, telles que la mise à jour des droits d’accès des utilisateurs, le retrait de paquetages, les mouvements de paquetages entre les dépôts, etc.
- Développement et maintenance des différents outils, tels que les composants du système de construction des paquetages.
Ce premier billet présente le procédé utilisé pour l’installation et la configuration des logiciels sur les serveurs de Mageia, expose les raisons pour lesquelles nous le faisons et pourquoi vous pourriez utiliser un processus similaire pour gérer vos propres serveurs.
Un résumé du procédé utilisé pour mettre en place les logiciels sur les serveurs de Mageia pourrait être :
- Tous les logiciels sont installés en utilisant les paquetages
- Tous les paquetages sont construits en utilisant le système de compilation
- Tous les paquetages sont installés et configurés en utilisant puppet
- Les raisons de procéder ainsi peuvent paraître évidentes pour beaucoup d’empaqueteurs de Mageia. Ce billet va essayer de les expliquer aux personnes qui ne sont pas nécessairement empaqueteurs.
Construction et installation du dispositif logiciel
Une des tâches les plus communes de l’administrateur système est l’installation ou la mise à jour de logiciels. Quand votre distribution Linux fournit des paquetages pour le logiciel que vous désirez utiliser, c’est facile : le paquetage peut être installé à l’aide du gestionnaire de paquetages. Cependant, dans bien des cas, le logiciel dont vous avez besoin n’est pas disponible pour la distribution utilisée, ou n’est pas dans la version désirée.
Compiler manuellement
Beaucoup de gens pensent que la solution la plus simple dans ce cas est de télécharger le code source du logiciel, de suivre les instructions de compilation et d’exécuter le script d’installation ou le Makefile fourni. Il y a cependant plusieurs inconvénients à opérer ainsi :
- Installation des dépendances de compilation
Il faut que toutes les dépendances de compilation soient installées sur le système. Le plus souvent, on souhaite compiler le logiciel sur un serveur de construction de paquetages dédié dans le but d’éviter l’installation de trop de dépendances de compilation sur la machine cible, puis de copier sur cette dernière les fichiers binaires obtenus.
- Gestion des dépendances
Si des archives tar ou un serveur NFS sont utilisés pour distribuer les fichiers binaires vers les machines cibles, il faut trouver et installer les dépendances requises sur chaque machine où le logiciel sera utilisé. Vous aurez à noter la liste des dépendances quelque part, ainsi vous saurez ce qui doit être installé si vous avez besoin d’utiliser ce logiciel sur un nouvelle machine.
- Mise à jour de logiciels
Lors de la compilation d’un logiciel, il est souvent nécessaire de définir des options spécifiques dans un script ou un fichier de configuration. Certains logiciels peuvent être difficiles à compiler, ou exiger des opérations ou des configurations complexes. Lors de la mise à jour du logiciel vers une version plus récente, il est probablement souhaitable de garder la même configuration de compilation qu’auparavant, pour éviter d’introduire des modifications inutiles qui pourraient causer des dégâts. Tout cela est difficile à mémoriser et à moins de le faire tous les jours, vous l’oublierez probablement. Aussi, il est préférable d’enregistrer les instructions de compilation dans un fichier pour pouvoir les ré-utiliser à la prochaine mise à jour de ce logiciel.
- Application de patchs logiciels
Il est parfois nécessaire d’apporter de petites modifications au logiciel pour sa compilation, pour qu’il fonctionne, ou pour y introduire de nouvelles fonctionnalités. Il est possible d’appliquer les modifications avant de commencer le processus de compilation. Cependant, ces modifications seront perdues la prochaine fois qu’une nouvelle archive source sera extraite pour mettre le logiciel à jour.
Afin de pouvoir appliquer les mêmes modifications aux futures versions, vous voudrez enregistrer ces changements quelque part sous forme de patch.
- Conserver un journal des modifications
Il est facile d’oublier pourquoi certaines modifications ou mises à jour furent réalisées sur un logiciel particulier. En particulier si vous n’êtes pas seul(e) et travaillez au sein d’une équipe, vous voudrez conserver un journal des modifications que vous réalisez sur le logiciel que vous avez compilé et installé.
- Connaître la version installée du logiciel, désinstallation ou mise à jour du logiciel
Connaître la version actuellement installée d’un logiciel est très utile. Il est aussi très utile de pouvoir désinstaller un logiciel, ou d’installer une version différente pour des tests ou deboguage, ou revenir à la version précédente en cas de problème. En utilisant la procédure d’installation standard, la plupart des logiciels installent leurs fichiers en de nombreux endroits différents sur le système. Savoir quels fichiers sont installés où, et quelle version est en place, est alors difficile voire impossible. Lors de l’installation d’une nouvelle version du logiciel, les scripts d’installation remplacent les anciens fichiers, mais n’enlèvent pas les fichiers obsolètes, ce qui peut être source de confusion ou de problèmes. Certains évitent ce genre de problèmes en installant chaque partie du logiciel dans son propre répertoire, en incluant le numéro de version dans le nom du répertoire. Cela peut cependant créer d’autres problèmes, la plupart des logiciels ne sont pas prévus pour être installés de cette façon et des astuces complexes sont requises pour leur fonctionnement. Et la sélection de la version qui doit être utilisée requière des liens symboliques complexes ou des mises à jour de la variable d’environnement PATH. Cela devient encore plus compliqué en cas d’installation de différents logiciels interdépendants. Afin d’éviter ce genre de problème, la meilleure solution consiste à utiliser certains outils pour tracer quels fichiers sont installés où, et de quelle version.
Utiliser des paquetages
Pour résoudre tous ces problèmes, vous choisirez donc d’utiliser des outils spécifiques. Vous pourriez vouloir commencer par écrire vos propres scripts et outils pour gérer ce genre de choses. Il est cependant judicieux d’utiliser les outils déjà disponibles plutôt que d’en recréer soi-même. Les meilleurs outils pour résoudre ce genre de problème sont les gestionnaires de paquetages.
Si vous n’avez jamais créé de paquetages auparavant, il sera nécessaire de passer un peu de temps pour apprendre comment le faire. Cependant cela vous fera gagner beaucoup de temps par la suite. Utiliser les paquetages pour construire et installer les logiciels présente beaucoup d’avantages :
- Installation des dépendances de compilation
Les paquetages permettent de compiler le logiciel sur une machine dédiée, produisant ainsi des paquetages qui seront installés sur la machine cible sans avoir besoin d’installer aucune des dépendances de compilation. Les spécifications du paquetage permettent aussi de définir la liste des dépendances de compilation, ils peuvent donc être installés automatiquement sur la machine de compilation au moment de la construction du paquetage, et éventuellement retirés par la suite.
- Gestion automatique des dépendances
Tenir compte des dépendances est chronophage et pas toujours facile. Heureusement, la plupart des systèmes d’empaquetage analysent les fichiers inclus dans le paquetage pour détecter automatiquement les dépendances du logiciel. Les bibliothèques perl, python, ruby, PHP, C/C++ sont habituellement détectées automatiquement pendant la construction du paquetage. Pour les dépendances qui ne peuvent pas être automatiquement détectées, il est possible de définir explicitement des dépendances dans le paquetage. Toutes ces dépendances peuvent alors être installées automatiquement par le gestionnaire de paquetages au cours de l’installation du logiciel.
- Mise à jour du logiciel
Le paquetage source contient les instructions de compilation. Le processus utilisé pour construire le logiciel peut parfois varier, mais très souvent il reste le même pour toutes les versions du logiciel. Dans ce cas, mettre un paquetage à jour vers une nouvelle version est aussi simple que de mettre à jour le numéro de version dans le paquetage source et de taper la commande pour lancer la compilation du paquetage. Recompiler le logiciel avec une option différente est aussi quelque chose de facile à faire.
- Patcher le logiciel
Les paquetages sources permettent d’inclure des correctifs qui seront appliqués pendant la compilation du paquetage. Cela rend plus facile le suivi des modifications appliquées au logiciel. Lors de la mise à jour du logiciel vers une nouvelle version, les mêmes modifications sont facilement applicables.
- Tenir un journal des modifications
Les paquetages contiennent un journal des modifications qu’il est possible d’utiliser pour expliquer les raisons des modifications, ainsi, tous les membres de l’équipe savent pourquoi vous avez réalisé une certaine modification il y a 6 mois. En cas d’utilisation d’un outil de gestion des versions comme git ou subversion pour gérer les paquetages sources (ce qui est recommandé), il est aussi possible d’utiliser le journal de propagation comme journal des modifications.
- Connaître la version installée du logiciel, désinstaller ou mettre à jour le logiciel
Les paquetages permettent le suivi de la version installée du logiciel sur le système. Ils permettent aussi de facilement installer, désinstaller ou mettre à jour le logiciel, ou trouver quel paquetage fournit un fichier donné.
Construire des paquetages dans un nouvel environnement et déployer les paquetages
Pourquoi devez-vous utiliser un système de compilation.
Le gestionnaire de paquetages est un outil très intéressant pour gérer la compilation et l’installation du logiciel. Cependant ce n’est pas suffisant. Le gestionnaire de paquetages construit le logiciel en utilisant les outils et les bibliothèques disponibles sur le système, après l’installation de la liste des dépendances de compilation.
Il y a quelques inconvénients à procéder ainsi :
- Support de multiples distributions
Quelquefois, l’infrastructure utilise différentes distributions, ou différentes éditions de la même distribution. Un paquetage construit sur une distribution ne fonctionne pas obligatoirement sur une autre car la version de certains composants est différente ou incompatible. Pour éviter ce genre de problèmes, les paquetages doivent être construits en utilisant la même distribution que celle sur laquelle ils seront utilisés.
- Un nouvel environnement de compilation
Les paquetages sources comprennent une liste des dépendances de compilation qui doivent être installées pour compiler le paquetage. Cependant lors de la compilation du paquetage sur votre propre machine ou sur un serveur de compilation spécifique, il y a généralement d’autres paquetages qui sont déjà installés et qui pourront potentiellement être utilisés pour la compilation d’un paquetage. Il est par conséquent très facile d’oublier que ces paquetages ont été installés, oublier de les inclure parmi les dépendances de compilation du paquetage et de ne pas remarquer le problème vu que la compilation fonctionne pour vous. Le système peut aussi présenter une configuration ou des mises à jours personnalisées dont vous avez oublié la présence, qui peuvent aussi influencer la compilation du paquetage. Le problème ne sera pas remarqué tant que quelqu’un n’aura pas besoin de recompiler le paquetage sur un autre système. Pour augmenter les chances de pouvoir reproduire une compilation de paquetage dans le future, il faut le faire dans un nouvel environnement. Habituellement cela est assuré en créant, pour chaque compilation de paqutage, un nouveau chroot minimal pour la distribution choisie.
Une fois que votre paquetage est compilé, il faut le copier sur la machine où il sera installé. Les distributions fournissent habituellement des outils pour gérer cela (apt-get sur Debian, urpmi sur Mageia, yum sur Fedora, etc.). Ces outils téléchargent et installent automatiquement le paquetage et ses dépendances à partir d’un serveur partageant un dépôt de paquetages. Pour pouvoir utiliser ces outils, il est nécessaire de monter un dépôt de paquetages, qui est un répertoire contenant tous les paquetages disponibles et quelques métadonnées.
Tout cela peut se gérer à la main, cependant il est préférable de monter un système de compilation des paquetages pour gérer tout cela automatiquement à votre place. Utiliser un système de compilation des paquetages a de nombreux avantages :
- Moins sujet aux erreurs
Compiler les paquetages dans un chroot, copier les fichiers résultants dans le répertoire adéquat et régénérer les métadonnées du répertoire n’est pas très difficile, mais c’est chronophage et sujet aux erreurs si c’est fait à la main. Utiliser un système de compilation des paquetages économise le temps et évite bien des erreurs.
- Plus facile
Si compiler et installer des paquetages dans un répertoire est une tâche difficile et chronophage, vous-même ou d’autres membres de votre équipe seront tentés de l’éviter et d’utiliser une autre solution.
- Outils de suivi des révisions et traçabilité
Utiliser un outil de gestion des versions comme git ou subversion pour gérer les modifications du paquetage source est recommandé. Un SCM attaché au système de compilation garantira que tout paquetage disponible dans le dépôt de paquetages est aussi disponible dans le dépôt de gestion des sources, apportant la traçabilité aux paquetages.
- Imposer une politique d’empaquetage
Des outils sont disponibles pour imposer une politique d’empaquetage (rpmlint pour rpm, lintian pour deb). Posséder une politique d’empaquetage est utile pour produire des paquetages cohérents. Le système de compilation des paquetages peut être configuré pour exécuter automatiquement des tests du respect des règles et refuser un téléversement des paquetages qui ne respectent pas la politique.
- Surveillance
Le système de compilation permet la surveillance des dernières compilations. Une interface web fournit un rapport de la dernière compilation, les journaux de compilation. Une liste de diffusion peut être utilisée pour recevoir les notifications de compilation. En cas de travail en équipe, elle permet à tous les membres de l’équipe de suivre les dernières modifications.
- Automatisation
Certains paquetages spécifiques peuvent exiger l’exécution de tâches supplémentaires lors de leurs mise à jour. Envoyer un courriel, extraire des fichiers pour mettre à jour un site web ou d’autres tâches peuvent être confiées à un script qui les réalisera automatiquement quand ce paquetage spécifique est mis à jour. C’est la méthode utilisée pour extraire les fichiers de l’installateur de Mageia dans l’arborescence du miroir quand un paquetage est mis à jour.
Comment installer un système de compilation Mageia ?
Cela sera le sujet d’un autre billet.
Configuration des logiciels
L’installation d’un logiciel n’est habituellement que la première partie du travail réalisé par les administrateurs système. La seconde partie est la configuration du logiciel. Le paquetage assure la première partie de la configuration initiale, cependant davantage de travail est souvent nécessaire.
Il existe plusieurs façons de procéder :
- Éditer manuellement la configuration directement sur le serveur
- Éviter toute configuration manuelle sur un serveur, mais utiliser un outil de gestion de la configuration comme Cfengine, Puppet ou Ansible pour le faire à votre place.
En utilisant un outil de gestion de la configuration, celle-ci n’est pas réalisée directement sur les serveurs, mais les règles écrites dans le dépôt de gestion de la configuration seront appliquées automatiquement par l’outil de gestion de la configuration. Cela n’est pas aussi rapide qu’une édition directe sur le serveur, mais il y a de nombreux avantages :
- Gérez votre infrastructure comme un projet logiciel
Les outils de configuration permettent de gérer l’infrastructure comme n’importe quel autre projet de développement logiciel ordinaire. Beaucoup d’outils à disposition des développeurs sont utilisables : gestion des versions sources, soumission de correctifs, revue de code, tests automatisés, etc.
- Travail en équipe
En cas de travail en équipe, vous pouvez enregistrer vos règles de configuration du serveur dans un dépôt commun de gestion des versions sources, rendant possible le suivi et la vérification de tous les changements apportés aux serveurs par tous les membres de l’équipe.
- Documentation
Détenir de la documentation au sujet des logiciels installés sur les serveurs et comment ils sont configurés est très utile, surtout quand il peut y avoir plusieurs personnes à travailler dessus. Cependant, un problème très fréquent avec la documentation est que si quelqu’un l’a bien écrite à l’origine, personne ne la maintien ensuite, causant sa rapide obsolescence. Il est très facile d’effectuer un changement et d’oublier de le documenter, ou d’oublier qu’une documentation existe quelque part et doit être mise à jour. Posséder une documentation précise est important, et quelquefois, avoir une documentation obsolète, fournissant une information erronée peut être pire que de ne pas avoir de documentation. Le dépôt de gestion de la configuration peut être vu comme une sorte de documentation sur l’infrastructure, et comme c’est ce qui est actuellement utilisé pour mettre en place l’infrastructure, il est très probablement plus à jour que n’importe quelle autre documentation. En développement logiciel, avoir du code auto-documenté, ou du code qui peut être compris sans documentation est en général préférable à une documentation maintenue séparément. Et c’est la même chose pour l’administration système.
- Tests de l’environnement et de la reproductibilité
Utiliser un outil de configuration permet de reproduire facilement la configuration d’un serveur sur un autre serveur. C’est utile en cas de besoin de remplacer ou d’ajouter un serveur, ou encore pour mettre en place un environnement de test.
- Maintenir une configuration correcte
L’outil de gestion de la configuration va s’exécuter à intervalles réguliers pour vérifier que la configuration est toujours correcte et n’appelle pas de modifications.
- Réutilisation
Comme en développement logiciel, l’utilisation d’un outil de gestion de la configuration permet de réutiliser les composants que vous avez créés. Il est généralement possible de créer des modules dotés de paramètres pour adapter le comportement du module. On peut quelquefois trouver des modules existants sur internet, mais malheureusement, la plupart d’entre eux nécessiteront d’importantes modifications pour les adapter à votre besoin. Les premières versions de puppet étaient dépourvues de fonctionnalités importantes telles que la classe paramétrée, aussi la création de composants était difficile, mais cela a évolué.
Quel outil de gestion de la configuration utiliser ?
Quand nous avons commencé la mise en place des serveurs de Mageia, au début du projet Mageia, nous avons décidé d’utiliser puppet, après avoir envisagé différent outils disponibles. Puppet semblait être l’outil de gestion de la configuration le plus intéressant du moment. Depuis ces dernières années, les choses ont beaucoup évolué dans ce domaine, et il existe d’autres alternatives que vous pourriez tester avant de décider laquelle choisir :
Les modules pour puppet de Mageia
Les modules pour puppet que nous utilisons pour configurer les serveurs sont disponibles sur un dépôt svn.
Ce qui doit être amélioré
Le processus actuel est bon, mais il reste certaines choses à améliorer. Si vous désirez contribuer, mais sans savoir ce qui pourrait être utile, voici quelques idée :
- Génération automatique des paquetages
Certains langages comme Perl, Python ou Ruby fournissent leur propre système d’empaquetage pour les bibliothèques. Beaucoup de gens apprécient l’utilisation de ces paquetages plutôt que les paquetages RPM car les paquetages de la distribution ne sont pas toujours disponibles ni à jour. L’avantage des premiers paquetages cités est d’être construits en amont, donc immédiatement disponibles. L’inconvénient est qu’ils ne sont généralement pas bien intégrés avec le reste du système et nécessite l’utilisation de deux systèmes différents d’empaquetage, ce qui complique les choses. Bien souvent les gens ne sont pas des empaqueteurs expérimentés, aussi utilisent-ils simplement le paquetage spécifique du langage disponible, car ils pensent que l’empaquetage est trop difficile ou bien n’ont pas le temps de le faire. Si la conversion à partir de ces paquetages vers RPM était plus simple, on bénéficierait d’une bonne disponibilité de paquetages bien intégrés avec le reste du système. Heureusement, ces paquetages spécifiques du langage contiennent en général toute l’information nécessaire à l’empaquetage RPM (descriptions, licence, dépendances, etc.), aussi la création d’un paquetage RPM est souvent une simple conversion de cette information dans le format RPM et peut-être automatisée. Grâce au travail de Jérôme Quelin sur cpan2dist, il est possible de générer des paquetages RPM Mageia automatiquement à partir de modules CPAN. C’est ce qui nous permet d’avoir 3300 paquetages perl disponibles dans la distribution.
Nous avons besoin d’outils similaires pour python, ruby et autres paquetages du langage.
- Paramétrage du système de compilation
Nous utilisons un système de compilation pour compiler nos paquetages car nous avons déjà un système de compilation disponible pour compiler la distribution Mageia. Ce n’est donc pas beaucoup plus de travail de le configurer pour avoir aussi notre propre dépôt de paquetages. Cependant, l’installation d’un système de compilation n’est pas actuellement une tâche facile et ceux qui ne compilent pas une distribution complète ne veulent pas passer trop de temps à configurer un système de compilation. Nous avons donc besoin d’améliorer le processus de la configuration du système de compilation pour le simplifier. Ce qui manque actuellement est la documentation pour expliquer comment le faire, en utilisant notre module puppet. Un prochain billet sur ce blog expliquera cela.
- Support de OBS
Une autre alternative consiste à utiliser OBS (Open Build Service), qui est un système de compilation agréable avec la prise en charge de multiples distributions. Cependant, il est encore peu adapté pour Mageia. Nous devons régler cela afin qu’il devienne possible de gérer les dépôts de Mageia avec OBS.
- Prise en charge de Mageia par Ansible et Salt Stack
Ansible et Salt Stack sont tous les deux des outils intéressants pour la gestion de la configuration. Cependant ils sont toujours dépourvus de la prise en charge d’urpmi pour l’installation des paquetages. Dernière nouvelle : Philippe Makowski travaille sur un module urpmi pour Ansible, mais ce n’est toujours pas intégré en amont, et les contributions sont bienvenues.