Manuel utilisateur¶
Installation¶
Pré-requis logiciels¶
Afin de pouvoir faire fonctionner VigiConf, l’installation préalable des logiciels suivants est requise :
- python (>= 2.5), sur la machine où VigiConf est installé
- postgresql-server (>= 8.2), éventuellement sur une machine distante
Reportez-vous aux manuels de ces différents logiciels pour savoir comment procéder à leur installation sur votre machine.
VigiConf requiert également la présence de plusieurs dépendances Python. Ces dépendances seront automatiquement installées en même temps que le paquet de VigiConf.
Installation du paquet RPM¶
L’installation de VigiConf se fait en installant simplement le paquet RPM
“vigilo-vigiconf
”. La procédure exacte d’installation dépend du gestionnaire
de paquets utilisé. Les instructions suivantes décrivent la procédure pour les
gestionnaires de paquets RPM les plus fréquemment rencontrés.
Installation à l’aide de urpmi:
urpmi vigilo-vigiconf # sur la machine d'administration
urpmi vigilo-vigiconf-local # sur les autres machines de la plate-forme de supervision
Installation à l’aide de yum:
yum install vigilo-vigiconf # sur la machine d'administration
yum install vigilo-vigiconf-local # sur les autres machines de la plate-forme de supervision
Configuration¶
La configuration de VigiConf comprend deux parties. D’une part, la configuration de l’outil en lui-même. D’autre part, la configuration du parc informatique supervisé par Vigilo (et dont la configuration est gérée par VigiConf). Ce chapitre ne porte que sur la configuration de VigiConf. Pour la documentation sur la configuration du parc informatique supervisé, reportez-vous au chapitre Configuration du parc à superviser.
Par défaut, la configuration de VigiConf se trouve dans
/etc/vigilo/vigiconf/settings.ini
. Vous devrez impérativement
modifier ce fichier de configuration avant d’utiliser VigiConf.
Si vous le souhaitez, vous pouvez également placer les options de configuration
communes à tous les modules de Vigilo installés sur la machine dans le fichier
/etc/vigilo/settings.ini
. Ce fichier générique sera chargé en premier
au lancement de VigiConf.
Ces fichiers sont composés de différentes sections permettant de paramétrer des
aspects divers de VigiConf, chacune de ces sections peut contenir un ensemble
de valeurs sous la forme cle=valeur
. Les lignes commençant par ”;” ou “#”
sont des commentaires et sont par conséquent ignorées.
Le format de ces fichiers peut donc être résumé dans l’extrait suivant:
# Ceci est un commentaire
; Ceci est également un commentaire
[section1]
option1=valeur1
; ...
optionN=valeurN
; ...
[sectionN]
option1=valeur1
; ...
optionN=valeurN
Configuration de la base de données¶
Connexion¶
VigiConf enregistre une partie des informations de la configuration du parc
supervisé en base de données. La configuration de la connexion à cette base de
données se fait en modifiant la valeur de la clé sqlalchemy_url
sous la
section [database]
.
Cette clé consiste en une URL définissant tous les paramètres nécessaires pour pouvoir se connecter à la base de données. Le format de cette URL est le suivant:
sgbd://utilisateur:mot_de_passe@serveur:port/base_de_donnees
Le champ :port
est optionnel et peut être omis si vous utilisez le port par
défaut d’installation du SGBD choisi.
Par exemple, voici la valeur correspondant à une installation mono-poste par défaut de Vigilo:
postgresql://vigilo:vigilo@localhost/vigilo
Avertissement
À l’heure actuelle, seul PostgreSQL a fait l’objet de tests intensifs. D’autres SGBD peuvent également fonctionner, mais aucun support ne sera fourni pour ceux-ci.
Configuration du dépôt pour le suivi des évolutions¶
Les modifications apportées à la configuration du parc sont enregistrées dans un dépôt SVN, permettant ainsi d’assurer un suivi des modifications et un éventuel retour arrière.
La configuration de ce dépôt se fait en utilisant les clés suivantes de la
section vigiconf
:
- confdir
Dossier contenant un « checkout » (version de travail) du dépôt SVN et dont les modifications seront enregistrées dans le dépôt à chaque utilisation de la commande “
vigiconf deploy
”.Cette option doit pointer vers le dossier où la configuration du parc supervisé est sauvegardée.
- svnusername
- Nom d’utilisateur pour accéder au dépôt SVN.
- svnpassword
- Mot de passe pour accéder au dépôt SVN.
- svnrepository
- URL indiquant l’emplacement du dépôt SVN. Il peut s’agir d’une URL pointant
vers un dépôt local (
file://
) ou distant (ssh+svn://
,http://
, etc.). Référez-vous à la documentation de Subversion pour les différents protocoles supportés.
Autres options de configuration¶
Les paragraphes qui suivent décrivent les autres options de configuration
disponibles dans VigiConf et situées sous la section [vigiconf]
du fichier
settings.ini
.
En règle générale, les valeurs correspondant à une nouvelle installation de VigiConf sont suffisantes et il n’est pas nécessaire de les modifier.
Répertoire de travail pour la génération¶
L’option “libdir
” permet de spécifier l’emplacement du répertoire de
travail servant à générer les fichiers de configuration des applications.
La valeur définie dans la configuration initiale est
/var/lib/vigilo/vigiconf
.
Emplacement final de la configuration¶
La directive “targetconfdir
” permet d’indiquer le dossier vers lequel les
fichiers de configuration finaux seront télé-déployés sur les serveurs de
supervision.
La valeur définie dans la configuration initiale est
/etc/vigilo/vigiconf
.
Les applications dont dépend Vigilo (ex : Nagios) doivent être configurées pour
aller chercher leur fichier de configuration dans le sous-dossier “prod
” de
ce dossier.
Répertoire des plugins de VigiConf¶
L’option “pluginsdir
” permet de faciliter l’extension de VigiConf à l’aide
de plugins (modules complémentaires). Il s’agit de l’emplacement d’un
répertoire qui contiendra des modules Python (eggs) qui seront chargés
automatiquement au lancement de VigiConf. Ces modules ont la possibilité
d’enregistrer des points d’entrée Python afin d’ajouter de nouvelles
fonctionnalités.
La valeur de cette option dans la configuration initiale fournie avec VigiConf
est /etc/vigilo/vigiconf/plugins
.
Emplacement du verrou¶
Afin d’éviter un conflit lorsque plusieurs administrateurs du même parc effectuent un nouveau déploiement de la configuration simultanément, VigiConf acquiert un verrou au démarrage. Ce verrou est automatiquement libéré lors de l’arrêt de VigiConf.
La directive “lockfile
” permet de spécifier l’emplacement du fichier qui
correspondra au verrou. Dans la configuration fournie par défaut avec VigiConf,
le verrou est enregistré dans /var/lock/subsys/vigilo-vigiconf/vigiconf.token
.
Mode de simulation des opérations¶
L’option “simulate
” est un booléen qui permet d’activer un mode spécial de
VigiConf dans lequel les opérations sont simulées et ne sont pas validées.
Cette option est destinée uniquement au débogage de l’application lors de la
phase de développement et doit être positionnée à “False
” en production.
Configuration du parc à superviser¶
La configuration du parc à superviser se fait au travers de fichiers XML. Ces
fichiers sont stockés dans le répertoire pointé par l’option “confdir
” de
la section “vigiconf
” dans le fichier de configuration de VigiConf. Des
fichiers d’exemple sont installés en même temps que VigiConf.
Ce chapitre présente la structure de la configuration et le contenu des différents fichiers.
Fichiers de configuration XML¶
Afin d’éviter les erreurs de saisie dans les fichiers de configuration de VigiConf, ceux-ci font systématiquement l’objet d’une validation à l’aide de schémas XML.
Ces schémas sont stockés dans:
/usr/libarch/pythonversion/site-packages/vigilo/vigiconf/validation/xsd/
Par exemple, pour une installation standard de Python 2.5 sur une machine équipée d’une architecture x86:
/usr/lib/python2.5/site-packages/vigilo/vigiconf/validation/xsd/
Dans la suite de ce document, on considère qu’un fichier type.xml
de
la configuration de VigiConf est valide s’il respecte le schéma défini dans le
fichier type.xsd
situé dans ce répertoire correspondant au type
d’objet manipulé.
Pour le reste des explications de ce chapitre, tous les emplacements de
fichiers ou dossiers indiqués sont relatifs au dossier de configuration du parc
(par défaut, /etc/vigilo/vigiconf/conf.d/
)
Configuration des hôtes¶
Le dossier “hosts
” contient les fichiers de définition des hôtes supervisés
du parc. Tous les fichiers XML de ce dossier sont analysés et doivent contenir
la définition d’un ou plusieurs hôtes.
La balise à la racine de ce document se nomme “hosts
” et peut contenir un
ou plusieurs blocs “host
”, correspondant chacun à la définition d’un hôte.
Le fragment de code suivant rappelle la structure générale du fichier:
<?xml version="1.0"?>
<hosts>
<host name="host1" attr1="..." attr2="..." attrN="...">
...
</host>
<host name="host2" attr1="..." attr2="..." attrN="...">
...
</host>
...
</hosts>
Définition d’un hôte¶
Un hôte est défini à l’aide d’une balise host ayant la forme suivante:
<host name="localhost" address="127.0.0.1" ventilation="P-F">
...
</host>
Un bloc de données host possède les attributs suivants :
- name
- [requis] Nom de l’hôte. Il peut s’agir d’un nom entièrement qualifié (FQDN) ou simplement d’un nom court permettant d’identifier l’équipement au sein du parc.
- address
- [optionnel] Adresse permettant de communiquer avec l’hôte. Il peut s’agir d’une adresse IP (v4 ou v6) ou d’un nom de domaine entièrement qualifié (FQDN). Si cet attribut est omis, la valeur de l’attribut name est utilisée.
- ventilation
[optionnel] Nom du groupe de supervision dans lequel cet hôte doit être placé (ventilé).
En général, il n’est pas nécessaire de spécifier cet attribut. VigiConf tente de le déduire automatiquement à partir des noms des groupes auxquels l’hôte est rattaché. Cet attribut permet essentiellement de résoudre les conflits entre les groupes. Il peut également être utilisé pour affecter l’hôte à un groupe de supervision qui n’a aucune relation avec les groupes métier.
La balise host peut contenir les balises suivantes :
class
(0 ou plus)template
(0 ou plus)attribute
(0 ou plus)nagios
(0 ou 1)test
(0 ou plus)tag
(0 ou plus)group
(1 ou plus)
Balise “class
Ҧ
Syntaxe:
<class>nom de la classe</class>
Indique la ou les classes d’équipements auxquelles l’hôte appartient. En fonction de ces classes, des tests spécifiques peuvent être disponibles afin d’obtenir des informations plus précises sur l’état de l’équipement.
Balise “template
Ҧ
Syntaxe:
<template>nom du modèle</template>
Précise le nom du modèle d’hôtes duquel cet hôte hérite une partie de ses propriétés. L’utilisation de l’héritage est pratique lorsque votre parc est composé d’éléments (serveurs, routeurs, etc.) homogènes. Vous pouvez alors définir un modèle (template) pour chaque type d’équipement avec tous les tests associés et créer ensuite simplement une définition d’hôte pour chaque équipement.
Cette balise peut être utilisée à plusieurs reprises. Les paramètres du dernier modèle chargé écrasent ceux des modèles précédents. Les valeurs définies au niveau d’un hôte écrase toujours les valeurs définies au niveau d’un modèle hérité (en particulier, les paramètres des tests).
Note
Pour être utilisable via cette balise, le modèle doit avoir été défini à l’aide de la balise hosttemplate (voir Configuration des modèles d’hôtes).
Avertissement
En cas de conflits liés aux dépendances des modèles, il se peut que les modèles soient réordonnés (un message d’avertissement est alors émis par VigiConf lors du déploiement). Dans ce cas, l’ordre d’application des paramètres peut être légèrement différent de l’ordre d’affectation des modèles dans le fichier de configuration.
Balise “attribute
Ҧ
Syntaxes:
<attribute name="nom de l'attribut">valeur de l'attribut</attribute>
<attribute name="nom de l'attribut">
<item>valeur 1</item>
<item>valeur 2</item>
</attribute>
Cette balise permet de fixer certains des attributs de l’hôte, comme par exemple le nombre de processeurs présents sur la machine. En général, ces informations sont extraites automatiquement des équipements par une interrogation SNMP (voir à ce sujet le chapitre « Découverte des services à superviser sur un hôte »).
Les noms d’attributs utilisables dépendent des tests de supervision installés avec VigiConf. Par défaut, les attributs suivants sont disponibles :
- “
collectorTimeout
” : délai d’attente utilisé lors de la récupération des données SNMP de l’hôte ; - “
cpulist
“ : la liste des identifiants des processeurs sur l’équipement ; - “
fans
“ : la liste des identifiants des ventilateurs sur l’équipement ; - “
snmpCommunity
“ : la communauté pour l’accès SNMP à l’équipement ; - “
snmpPort
“ : le port SNMP à utiliser (par défaut, le port 161 est utilisé) ; - “
snmpVersion
“ : la version SNMP à utiliser (par défaut, la version 2 est utilisée) ; - “
tempsensors
“ : la liste des noms des sondes de température présentes sur l’équipement.
Balise “test
Ҧ
Syntaxe:
<test name="nom du test">
<arg name="nom_argument_1">valeur argument 1</arg>
<arg name="nom_argument_2">valeur argument 2</arg>
...
<arg name="nom_argument_n">valeur argument n</arg>
<nagios>
<directive name="nom_directive_1">valeur directive 1</directive>
...
<directive name="nom_directive_n">valeur directive n</directive>
</nagios>
</test>
La balise test
permet d’ajouter un test de supervision à l’hôte. Elle
possède un attribut name
obligatoire qui désigne le test de supervision
à appliquer (par exemple : “CPU
” pour superviser l’état du processeur d’un
équipement).
Un test accepte généralement zéro, un ou plusieurs arguments, qui doivent être
passés dans l’ordre lors de la déclaration du test, à l’aide de la balise
arg
. Chaque argument dispose d’un nom (attribut name
) et d’une valeur
(ou liste de valeurs). Pour spécifier une liste de valeurs pour un argument,
la sous-balise item
doit être utilisée, comme dans l’extrait suivant :
<test name="ACL">
<arg name="policy">whitelist</arg>
<!--
L'argument "addresses" est une liste d'adresses IP,
sous-réseaux ou noms de machines.
-->
<arg name="addresses">
<item>127.0.0.1</item>
<item>localhost</item>
<item>192.168.0.0/24</item>
</arg>
</test>
Chaque argument possède un type (spécifié dans la documentation du test). Les types reconnus sont :
- les chaînes de caractères ;
- les nombres entiers ;
- les nombres relatifs (flottants) ;
- les booléens (utiliser la valeur
1
,true
,on
ouyes
pour la valeurTrue
ou bien0
,false
,off
ouno
pour la valeurFalse
).
Vous pouvez également, de façon optionnelle, définir des paramètres spécifiques
pour la supervision à l’aide de la balise nagios
, qui contiendra une ou
plusieurs directives adressées au moteur de supervision Nagios. Voir la section
ci-dessous pour plus d’informations.
Note
Si le même argument est défini deux fois, seule la dernière valeur sera utilisée.
Balise “nagios
Ҧ
Un bloc de données nagios
contient des blocs directive
dont l’attribut
name
appartient à la liste des directives “host
” de Nagios. La
documentation sur ces directives est disponible dans la documentation Nagios.
Syntaxe:
<nagios>
<directive name="max_check_attempts">5</directive>
<directive name="check_interval">10</directive>
<directive name="retry_interval">1</directive>
</nagios>
Toutes les directives proposées par Nagios sont utilisables ici. Néanmoins, un mauvais réglage des directives peut dégrader sérieusement les performances de la supervision, voire entrainer un dysfonctionnement. L’utilisation des directives est donc à laisser à des utilisateurs avertis.
Un bloc nagios
peut se trouver au sein d’un bloc host
/hosttemplate
ou d’un bloc test
.
Si la même directive est défini deux fois, la dernière valeur est celle qui sera utilisée.
Balise “tag
Ҧ
Syntaxe:
<tag service="service" name="étiquette"/>
<tag service="service" name="étiquette">valeur</tag>
La balise tag
permet d’affecter une étiquette à un hôte ou un service.
L’attribut name
permet de préciser le nom de l’étiquette à ajouter. Il doit
correspondre au nom d’une image (privée de son extension) à afficher dans
VigiMap. Cette image doit se trouver dans /etc/vigilo/vigimap/public/images/tags
.
L’attribut service
permet, quant à lui, d’indiquer le nom du service auquel
cette étiquette sera affectée. Utilisez la valeur “host
” si l’étiquette
doit porter sur l’hôte en lui-même et non pas sur l’un de ses services.
Enfin, la valeur de l’étiquette est facultative et fait office de méta-donnée.
Exemple, pour associer à un hôte l’étiquette de MCO (l’image mco.png
est
fournie dans toute installation standard de Vigilo):
<tag service="host" name="mco"/>
Balise “group
Ҧ
Syntaxe:
<group>/Chemin complet/vers le/Groupe</group>
<group>Nom de groupe</group>
La balise group
permet d’indiquer les groupes métiers auxquels cet
équipement appartient. Les groupes sont organisés de manière hiérarchique (sous
la forme d’un arbre).
La première forme (chemin absolu) permet de se déplacer dans cette hiérarchie
en donnant le chemin complet jusqu’au groupe, de la racine de l’arbre vers les
feuilles. Chaque élément du chemin est précédé du symbole “/
”. Si le nom de
l’élément contient un “/
” ou un “\
”, vous devez le faire précéder du
caractère d’échappement “\
”. Ainsi, l’élément “Serveurs Linux/Unix
”
sera écrit dans les chemins comme “Serveurs Linux\/Unix
”.
La seconde forme (chemin relatif) permet d’ajouter l’équipement à tous les
groupes dont le nom vaut celui indiqué, quelque soit leur position dans
l’arbre. Il n’est pas possible de préciser plusieurs éléments (par exemple
“A/B
”) lorsque cette forme est utilisée. Les règles d’échappement de la
première forme s’appliquent également ici.
Note
Les groupes sont utilisés pour décider de la ventilation des équipements sur les différents groupes de supervision. Une fois tous les groupes exprimés sous la forme d’un chemin absolu, VigiConf suppose que le premier élément du chemin correspond au groupe à utiliser pour la ventilation. En cas de conflit, ou pour placer l’équipement dans un autre groupe de ventilation que celui déterminé automatiquement, vous devez utiliser l’attribut ventilation de la balise host afin de spécifier manuellement le groupe de ventilation à utiliser.
Remarques¶
De même que pour les tests, l’hôte peut disposer de directives de configuration
spécifiques destinées à Nagios. Celles-ci seront groupées sous une balise
nagios
(voir également la documentation concernant la balise test
ci-dessus).
Chaque hôte hérite implicitement d’un modèle appelé “default
”. Toutes les
directives définies dans le modèle “default
” sont donc appliquées à la
configuration des différents hôtes, et ce même si ces hôtes n’indiquent pas
explicitement qu’ils utilisent ce modèle, via la balise <template>
. Voir le
chapitre pour plus d’information.
Configuration des modèles d’hôtes¶
Le dossier “hosttemplates
” contient les fichiers de définition des modèles
d’hôtes. Un modèle d’hôtes permet de regrouper un ensemble d’éléments de
configuration communs à plusieurs hôtes. Les hôtes peuvent ensuite être
déclarés comme héritant de ce modèle. Tous les fichiers XML de ce dossier sont
analysés et doivent contenir la définition d’un ou plusieurs modèles.
La balise à la racine de ce document se nomme “hosttemplates
” et peut
contenir un ou plusieurs blocs “hosttemplate
”, correspondant chacun à la
définition d’un hôte.
Le fragment de code suivant rappelle la structure générale du fichier:
<?xml version="1.0"?>
<hosttemplates>
<hosttemplate attr1="..." attr2="..." attrN="..."> ... </hosttemplate>
<hosttemplate attr1="..." attr2="..." attrN="..."> ... </hosttemplate>
...
</hosttemplates>
Un bloc de données hosttemplate
possède les attributs suivants:
name
: Nom du modèle.
Un bloc de données hosttemplate contient les blocs suivants, en respectant l’ordre:
parent
(0 ou un)attribute
(0 ou plus)tag
(0 ou plus)group
(0 ou plus)class
(0 ou plus)test
(0 ou plus)nagios
(0 ou un)item
(0 ou plus)
Balise “parent
Ҧ
Un bloc de données parent
contient une simple chaîne de caractères, le nom
du template dont ce template hérite. Il est possible de créer autant de niveaux
d’héritage de templates que souhaité et chaque template peut hériter d’un ou
plusieurs templates (héritage multiple).
Exemple:
<parent>generic</parent>
Balise “attribute
Ҧ
Un bloc de données attribute
possède un attribut : name
.
Un bloc de données attribute
contient une valeur de type chaîne de
caractères.
Exemple:
<attribute name="snmpOIDsPerPDU">10</attribute>
Balise “tag
Ҧ
Syntaxe:
<tag service="service" name="étiquette"/>
<tag service="service" name="étiquette">valeur</tag>
La balise tag
permet d’affecter une étiquette à un hôte ou un service.
L’attribut name
permet de préciser le nom de l’étiquette à ajouter. Il doit
correspondre au nom d’une image (privée de son extension) à afficher dans
VigiMap. Cette image doit se trouver dans /etc/vigilo/vigimap/public/images/tags
.
L’attribut service
permet, quant à lui, d’indiquer le nom du service auquel
cette étiquette sera affectée. Utilisez la valeur “host
” si l’étiquette
doit porter sur l’hôte en lui-même et non pas sur l’un de ses services.
Enfin, la valeur de l’étiquette est facultative et fait office de méta-donnée.
Exemple, pour associer à un hôte l’étiquette de MCO (l’image mco.png
est
fournie dans toute installation standard de Vigilo):
<tag service="host" name="mco"/>
Balise “group
Ҧ
Un bloc de données group
contient une chaîne de caractères.
Exemple:
<group>AIX servers</group>
Balise “class
Ҧ
Un bloc de données class
contient une simple chaîne de caractère.
Exemple:
<class>aix</class>
Balise “test
Ҧ
Un bloc de données test
possède l’attribut suivant :
name
(1 exactement)
Un bloc de données test
contient les blocs suivants, dans l’ordre :
arg
(0 ou plus)nagios
(0 ou 1)
Reportez-vous à la documentation sur la configuration des tests d’un hôte pour plus d’information sur les attributs et blocs acceptés par cette balise.
Exemple:
<test name="Proc">
<arg name="label">aixmibd</arg>
<arg name="processname">.*aixmibd .*</arg>
<nagios> ... </nagios>
</test>
Balise “nagios
Ҧ
Voir la définition utilisée pour la balise host
: Balise “nagios”.
Balise “item
Ҧ
Un bloc de données item
contient une simple chaîne de caractère.
Exemple:
<item>item1</item>
Cas particulier du modèle “default.xml
Ҧ
Le modèle nommé “default.xml
” est un cas particulier de modèle. Il est
appliqué systématiquement à tous les hôtes configurés.
Par défaut, ce modèle contient des attributs destinés à configurer le
comportement de Nagios et à renseigner certaines informations relatives à la
configuration de SNMP sur le parc. Il contient également le test “UpTime
”
qui envoie une alerte lorsque la durée de fonctionnement d’une machine est trop
faible (c’est-à-dire lorsqu’elle a été redémarrée récemment).
Dossier “groups
Ҧ
Le dossier “groups
” contient les fichiers de définition des groupes
d’éléments supervisés. Tous les fichiers XML de ce dossier sont analysés et
doivent contenir la définition d’un ou plusieurs groupes.
L’utilisation de groupes facilite la gestion au quotidien des permissions (application en masse d’une permission sur un groupe d’éléments supervisés à un groupe d’utilisateurs).
La balise à la racine de ce document se nomme “groups
” et peut contenir un
ou plusieurs blocs “group
”, correspondant chacun à la définition d’un
groupe d’éléments supervisés.
Le fragment de code suivant rappelle la structure générale du fichier:
<?xml version="1.0"?>
<groups>
<group attr1="..." attr2="..." attrN="..."> ... </group>
<group attr1="..." attr2="..." attrN="..."> ... </group>
...
</groups>
Balise “group
Ҧ
Un bloc de données group
possède un attribut: name
.
Le bloc de données group
peut possèder un ou plusieurs sous-blocs
group
. Cette imbrication peut être répétée autant de fois que nécessaire et
permet de construire une hiérarchie de groupes. Cette hiérarchie est ensuite
utilisée dans les différentes interfaces, pour la gestion des permissions, ou
encore, pour organiser les informations.
Exemple:
<group name="group1" />
<group name="group2" >
<group name="group21"/>
...
</group>
Le même nom de groupe ne peut pas être utilisé plusieurs fois au même niveau dans la hiérarchie des groupes. C’est-à-dire que l’exemple suivant est interdit:
<!-- Attention, cet exemple ne fonctionne pas ! -->
<group name="group1">
<group name="group2"/>
<group name="group2"/>
</group>
En revanche, le même nom de groupe peut être utilisé dans des endroits séparés de l’arborescence, comme dans l’exemple ci-dessous:
<group name="group1">
<group name="group1">
<group name="group1"/>
</group>
</group>
Notez que chacun des “group1
” correspond à un groupe différent.
Dossier “hlservices
Ҧ
Cette fonctionnalité n’est disponible que dans la version Enterprise de Vigilo.
Configurations particulières¶
Ce chapitre recense des cas particuliers de configuration. Pour chaque cas, un exemple de configuration associée est donné.
Utilisation de SNMPv3¶
L’utilisation de SNMP version 3 nécessite un peu plus de configuration que pour SNMP version 1 ou 2c. En effet, en plus de la définition de la communauté de l’équipement, il est nécessaire de spécifier les éléments de sécurité permettant d’authentifier la connexion à l’équipement et/ou d’assurer la confidentialité des échanges SNMP avec l’équipement.
Aucun test particulier n’est à appliquer pour utiliser SNMPv3 dans Vigilo. Cependant, des attributs supplémentaires doivent être définis au niveau de la configuration de l’équipement fonctionnant avec SNMPv3.
Le listing suivant présente un exemple de configuration d’un hôte devant être interrogé en utilisant SNMPv3:
<attribute name="snmpVersion">3</attribute>
<attribute name="snmpSeclevel">authPriv</attribute>
<attribute name="snmpAuthproto">MD5</attribute>
<attribute name="snmpPrivproto">DES</attribute>
<attribute name="snmpSecname">snmpuser1</attribute>
<attribute name="snmpAuthpass">12345678</attribute>
<attribute name="snmpPrivpass">12345678</attribute>
Les noms des attributs suivent la terminologie standard de SNMPv3, excepté pour
le préfixe “snmp
” qui ne sert qu’à empêcher d’éventuels conflits de nommage
avec d’autres attributs similaires.
Le rôle de chacun de ces attributs est précisé ci-dessous :
- L’attribut “
snmpVersion
” indique que c’est la version 3 du protocole SNMP qui doit être utilisée pour interroger l’équipement. - L’attribut “
snmpSeclevel
” indique les contraintes de sécurité à apporter sur les communications avec l’équipement. Les valeurs possibles sont :- “
noAuthNoPriv
” (no authentication / no privacy) : aucune authentification n’a lieu et les échanges ne sont pas chiffrés. Cette valeur correspond à ce qui est fourni par SNMPv1 et SNMPv2c et n’offre aucune sécurité. Il est donc recommandé de ne pas utiliser cette valeur (sauf cas exceptionnels). - “
authNoPriv
” (authentication / no privacy) : Vigilo s’authentifiera auprès de l’équipement avec un nom d’utilisateur et un mot de passe dédiés. Les échanges avec l’équipement ne seront pas chiffrés et les communications pourront donc être écoutées par n’importe quelle personne disposant d’un accès physique au réseau. - “
authPriv
” (authentication / privacy) : Vigilo s’authentifiera auprès de l’équipement avec un nom d’utilisateur et un mot de passe dédiées. De plus, tous les échanges seront chiffrés. Cette valeur est celle offrant le plus de sécurité et est donc recommandée.
- “
- L’attribut “
snmpAuthproto
” est obligatoire lorsque “snmpSeclevel
” vaut “authNoPriv
” ou “authPriv
” et spécifie l’algorithme utilisé pour masquer le mot de passe lors des transmissions avec l’équipement. Les valeurs possibles sont “MD5
” et “SHA1
”. - L’attribut “
snmpPrivproto
” est obligatoire lorsque “snmpSeclevel
” vaut “authPriv
” et spécifie l’algorithme de chiffrement utilisé pour les échanges avec l’équipement. Les valeurs possibles sont “DES
” et “AES
”. - L’attribut “
snmpSecname
” est obligatoire lorsque “snmpSeclevel
” vaut “authNoPriv
” ou “authPriv
” et indique le nom d’utilisateur avec lequel Vigilo s’authentifiera auprès de l’équipement. - L’attribut “
snmpAuthpass
” est obligatoire lorsque “snmpSeclevel
” vaut “authNoPriv
” ou “authPriv
” et indique le mot de passe à utiliser pour s’authentifier auprès de l’équipement. Il peut être donné sous forme textuelle (comme dans l’exemple ci-dessus) ou sous forme de chaîne de caractères hexadécimaux en préfixant la valeur par “0x
”. - L’attribut “
snmpPrivpass
” est obligatoire lorsque “snmpSeclevel
” vaut “authPriv
” et spécifie la clé de chiffrement utilisée pour les échanges avec l’équipement. Elle peut être donnée sous forme textuelle (comme dans l’exemple ci-dessus) ou sous forme de chaîne de caractères hexadécimaux en préfixant la valeur par “0x
”.
Configuration des journaux¶
VigiConf est capable de transmettre un certain nombre d’informations au cours de son fonctionnement à un mécanisme de journalisation des événements (par exemple, des journaux systèmes, une trace dans un fichier, un enregistrement des événements en base de données, etc.).
La syntaxe de la configuration des journaux est la même que pour le reste
de la configuration. Les mécanismes utilisés pour gérer les journaux sont
ceux mis à disposition par le module logging
de Python.
Le reste de cette chapitre présente les informations basiques concernant la configuration des journaux. La documentation complète du format de configuration est disponible à l’adresse http://docs.python.org/library/logging.html#configuration-file-format
La configuration de la journalisation se fait en manipulant trois types d’objets :
- les
loggers
, qui permettent de configurer les modules python qui devront être journalisés et de définir les gestionnaires d’événements à appliquer ; - les
handlers
(gestionnaires d’événements), qui indiquent le traitement qui doit être appliqué aux événements reçus (enregistrement dans un fichier, dans les journaux Syslog du système, stockage en base de données, etc.) ; - les
formatters
, qui permettent de configurer le formatage appliqué aux événements.
Les sections qui suivent vous donnent des informations sur la configuration de chacun de ces éléments.
Configuration des loggers
¶
Les loggers permettent d’indiquer les sources d’événements pour lesquelles les événements de journalisation seront effectivement consignés. Ils permettent également de définir les traitements qui seront appliqués à ces événements (pour définir par exemple la destination des événements).
La configuration des loggers se fait en deux étapes :
- dans un premier temps, les loggers sont déclarés,
- puis, les loggers déclarés sont configurés.
Déclaration d’un logger
¶
La déclaration des loggers se fait sous la forme d’une liste des noms des loggers, contenue sous la clé « keys » de la section « loggers ».
Les loggers sont organisés sous une forme hiérarchique, qui suit l’organisation
des modules Python sur le disque dur. Si aucun logger n’est défini pour traiter
les messages d’un module, le logger défini sur le niveau supérieur est utilisé.
L’arborescence du système de fichiers est ainsi parcourue jusqu’à ce qu’un
logger
intercepte le message ou qu’on ne puisse plus remonter.
Si aucun logger
n’est trouvé après le parcours de la hiérarchie, un message
d’avertissement est affiché sur la console afin d’inciter l’utilisateur
à configurer correctement les journaux.
Par ailleurs, un logger
spécial est défini qui apparaît toujours au sommet
de la hiérarchie des loggers, nommé « root ».
Exemple de parcours de la hiérarchie des loggers :
Si le module Python vigilo.common.conf
émet un événement
et qu’aucun logger n’est associé à ce module, le gestionnaire de journaux
recherche un logger pour le module vigilo.common
. S’il n’en trouve pas,
il recherche un logger pour le module vigilo
.
Si après toutes ces recherches il n’en trouve toujours pas,
il recherche le logger root
.
Configuration d’un logger
¶
Chaque logger déclaré doit ensuite être configuré. La configuration d’un logger
appelé <nom_du_logger>
se fait en ajoutant une section appelée
logger_<nom_du_logger>
dans le fichier de configuration.
Pour chaque logger, les clés suivantes sont configurables :
level
(obligatoire) : niveau de criticité à partir duquel les messages seront pris en compte. Les niveaux utilisables sont (par ordre de criticité croissante) :- NOTSET pour que l’événement soit toujours pris en compte, quelle que soit sa criticité,
- DEBUG pour ne prendre en compte que les événements au niveau « débogage » ou supérieur,
- INFO pour ne prendre en compte que les événements au niveau « information » ou supérieur,
- WARNING pour ne prendre en compte que les événements au niveau « avertissement » ou supérieur,
- ERROR pour ne prendre en compte que les événements au niveau « erreur » ou supérieur,
- CRITICAL pour ne prendre en compte que les événements au niveau « critique ».
qualname
optionnel le nom du module Python qui sert de source pour les événements enregistrés par ce logger. Si ce champ est omis, c’est que le logger se trouve au sommet de la hiérarchie, et donc, qu’il s’agit du logger « root ».propagate
optionnel un entier qui indique si l’événement doit être propagé (1) aux loggers situés « au-dessus » dans la hiérarchie ou non (0). Par défaut, les messages sont propagés.handlers
obligatoire une liste contenant les noms des handlers gestionnaires d’événements qui traiteront les événements capturés par ce logger.
Exemple de configuration d’un logger
¶
L’encadré suivant présente un exemple de configuration d’un logger
nommé « log ». Cet exemple suppose par ailleurs qu’un handler
« hand »
a été défini dans la configuration.
[loggers]
keys=log
[logger_log]
level=WARNING
qualname=vigilo
handlers=hand
Ce logger intercepterait tous les événements émis par un composant de Vigilo et les enverrait au handler « hand » pour qu’ils soient traités.
Configurations des handlers
(gestionnaires d’événements)¶
Les handlers permettent d’indiquer comment sont traités les événements reçus. Ils permettent par exemple d’indiquer que les messages doivent être stockés dans une base de données, dans les journaux systèmes, envoyés par email, etc.
La configuration des handlers se fait en deux étapes :
- dans un premier temps, les handlers sont déclarés,
- puis, les handlers déclarés sont configurés.
Déclaration d’un handler
¶
La déclaration des handlers se fait sous la forme d’une liste des noms des handlers, contenue sous la clé « keys » de la section « handlers ».
Configuration d’un handler
¶
Chaque handler déclaré doit ensuite être configuré. La configuration d’un handler appelé <nom_du_handler> se fait en ajoutant une section appelée « handler_<nom_du_handler> » dans le fichier de configuration.
Pour chaque handler, les clés suivantes sont configurables :
class
(obligatoire) : la classe Python qui effectuera le stockage des messages. Les plus couramment utilisées sont « handlers.SysLogHandler » (enregistrement vers les journaux systèmes de Linux), « StreamHandler » (enregistrement dans un flux, comme par exemple la sortie standard du programme). La liste complète des handlers utilisables est disponible sur http://docs.python.org/library/logging.htmlargs
(optionnel) : arguments qui seront passés au constructeur de la classe désignée par la cléclass
.level
(obligatoire) : le niveau de criticité à partir duquel les messages seront pris en compte. Les niveaux utilisables sont les mêmes que pour les loggers.formatter
(obligatoire) : le nom duformatter
à utiliser pour mettre en forme les messages.
Exemple de configuration d’un handler
¶
L’encadré suivant présente un exemple de configuration d’un handler
nommé « hand ». Cet exemple suppose par ailleurs qu’un formatter
« fmt »
a été défini dans la configuration.
[handlers]
keys=hand
[handler_hand]
class=handlers.SysLogHandler
args='/dev/log', 'daemon'
level=NOTSET
formatter=fmt
Ce handler enregistre les événements dans le journal du système,
quelque soit leur niveau de criticité, en utilisant le formatter
« fmt ».
Configuration des formatters
¶
Les formatters permettent de mettre en forme les messages avant leur stockage. La configuration des formatters se fait en deux étapes :
- dans un premier temps, les formatters sont déclarés,
- puis, les formatters déclarés sont configurés.
Déclaration d’un formatter
¶
La déclaration des formatters se fait sous la forme d’une liste des noms des formatters, contenue sous la clé « keys » de la section « formatters ».
Configuration d’un formatter
¶
Chaque formatter déclaré doit ensuite être configuré. La configuration d’un formatter appelé <nom_du_formatter> se fait en ajoutant une section appelée «formatter_<nom_du_formatter> » dans le fichier de configuration.
Pour chaque formatter, les clés suivantes sont configurables :
format
(obligatoire) : un texte qui décrit la mise en forme du message. Ce texte peut faire références à des informations contextuelles concernant l’événement à enregistrer. Ces informations contextuelles sont insérées en utilisant le mécanisme de formatage des chaines de caractères de Python. Par exemple, le message original de l’événement peut être inséré dans le texte qui sera effectivement enregistré à l’aide de la substitution suivante%(message)s
La liste des informations contextuelles les plus fréquemment utilisées est fournie dans la suite de ce document. La liste complète peut être consultée en lisant la documentation de Python concernant le module
logging
.datefmt
(optionnel) : un texte indiquant le format à utiliser pour les dates. La description complète du format est présentée dans la documentation de Python (http://docs.python.org/library/time.html#time.strftime). Par défaut, le format ISO 8601 est utilisé.
Informations contextuelles disponibles pour les formatters
¶
Plusieurs informations contextuelles peuvent être insérées automatiquement par les formatters avant l’envoi d’un message dans les journaux.
Les informations contextuelles suivantes sont disponibles :
La date à laquelle l’événement est survenu peut être insérée, dans un format intelligible, grâce à la substitution suivante
%(asctime)s
La criticité du message reçu (DEBUG, WARNING, ERROR, etc.) peut être insérée sous forme textuelle grâce à la substitution suivante
%(levelname)s
Le nom du module qui a émis le message peut être inséré grâce à cette substitution
%(module)s
Le message original associé à l’événement peut être inséré grâce à cette substitution
%(message)s
Cette liste ne contient que les informations les plus couramment utilisées. La liste complète est disponible sur http://docs.python.org/library/logging.html#formatter.
Exemple de configuration d’un formatter
¶
L’encadré suivant présente un exemple de configuration d’un formatter nommé « fmt ».
[formatters]
keys=fmt
[formatter_fmt]
format=[%(asctime)s] %(levelname)s – %(message)s
datefmt=%a, %d %b %Y %H:%M:%S
Ce formateur affiche le niveau de criticité (sous forme textuelle) ainsi que le message de l’événement original. Le message est précédé de la date.
Un exemple de message enregistré en utilisant ce formateur serait :
[Thu, 28 Jun 2001 14:17:15] ERROR – Could not connect to memcached.
Exemple de configuration complète des journaux¶
L’encadré qui suit donne un exemple simple mais complet d’une configuration des journaux dans le cas du corrélateur de Vigilo. Le résultat de cette configuration est ensuite détaillé.
[loggers]
keys = root,rules
[handlers]
keys = syslog
[formatters]
keys = generic
[logger_root]
level = WARNING
handlers = syslog
[logger_rules]
level = INFO
handlers = syslog
qualname = vigilo.correlator.rules
[handler_syslog]
class=handlers.SysLogHandler
level=DEBUG
formatter=nullFormatter
args='/dev/log', 'daemon'
[formatter_generic]
format = %(message)s
datefmt =
Dans cette configuration, tous les messages émis par le corrélateur et qui ont un niveau de criticité au moins équivalent à « WARNING » sont enregistrés dans les journaux du système (syslog).
Par ailleurs, les messages issus des règles de corrélation
(module Python vigilo.correlator.rules
) sont consignés
dès lors que leur niveau de criticité est supérieur ou égal à « INFO ».
Le message enregistré a un formatage « brut » où seul le message apparaît. En effet, dans le cas d’un handler de type « handlers.SysLogHandler », il n’est pas nécessaire d’ajouter des informations supplémentaires (nom et PID du processus qui a envoyé l’événement, heure où l’événement a été consigné, etc.). Le système ajoute automatiquement ces informations à l’événement.
Utilisation de l’utilitaire “vigiconf
Ҧ
La génération des fichiers de configuration des différentes applications en
charge de la supervision du parc se fait en utilisant l’utilitaire
“vigiconf
” fourni lors de l’installation du paquet portant le même nom.
Cet utilitaire permet d’effectuer les opérations suivantes :
- Affichage des informations concernant la configuration actuelle ;
- Gestion des applications ;
- Retour arrière de la configuration ;
- Déploiement d’une nouvelle configuration ;
- Découverte des services présents sur le réseau.
La commande “vigiconf --help
” permet d’obtenir l’aide de l’utilitaire. Elle
affiche la sortie suivante:
usage : vigiconf [-h] [--debug] {info,server-status,discover,deploy} ...
Gestionnaire de configuration Vigilo
arguments optionnels:
-h, --help affiche ce message d'aide et quitte
--debug Mode de débogage
Sous-commandes: {info,server-status,discover,deploy}
info Affiche un résumé de la configuration actuelle.
deploy Déploie la configuration sur chaque serveur si la
configuration a changé.
discover Découvrir les services disponibles sur un serveur
distant.
server-status Active ou désactive un serveur Vigilo.
Ces différentes opérations sont détaillées dans les sections qui suivent.
Vous pouvez obtenir l’aide sur une commande en tapant
“vigiconf nom_de_la_commande --help
”.
Affichage des informations¶
L’affichage des informations concernant la configuration actuelle se fait en
exécutant la commande “vigiconf info
”.
La commande renvoie plusieurs informations, comme dans l’exemple d’exécution suivant:
VigiConf a été lancé depuis le compte 'root'. Utilisation du compte 'vigiconf' à la place.
Révision actuelle dans le dépôt : 358
Serveur supserver1.example.com:
déployé: 358
installé: 358
précédent: 358
Serveur supserver2.example.com:
déployé: 358
installé: 358
précédent: 358
DÉSACTIVÉ
VigiConf se termine
La révision actuelle correspond à la dernière version de la configuration validée sur la machine qui héberge VigiConf.
Les lignes suivantes affichent, pour chaque serveur de supervision : son nom, éventuellement son état (lorsque le serveur est désactivé), ainsi que les numéros de la révision de la configuration actuellement déployée (donc en production), de la dernière révision installée et de la précédente révision installée.
Vous pouvez préciser les noms des serveurs de supervision dont les informations doivent être affichés en passant simplement leur nom comme argument de la commande.
Note
Toutes les valeurs sont à 0 lors d’une nouvelle installation (car aucun des serveurs n’a encore été configuré).
Déploiement de la configuration¶
Une fois la configuration des différents éléments du parc effectuées, vous
pouvez la déployer sur les divers machines de la supervision à l’aide de la
commande “vigiconf deploy
”.
Vous pouvez passer en argument la liste des noms des serveurs de supervision pour lesquels une nouvelle version de la configuration doit être déployée.
Découverte des services à superviser sur un hôte¶
Afin d’assister l’administrateur dans sa configuration des tests de supervision d’un serveur, VigiConf dispose d’un mode de découverte automatique des services disponibles sur un hôte.
La commande “vigiconf discover
” prend en arguments les noms d’hôtes
(entièrement qualifiés) ou les fichiers de scan à analyser afin de découvrir
les services à superviser. Les fichiers de scan doivent avoir été générés à
l’aide de la commande “snmpwalk
” sur l’OID “.1
” en lui passant les
options “-OnQe
”.
Exemple de commande pour créer le fichier de scan:
SNMPCONFPATH=/dev/null snmpwalk -OnQe -v2c -c public hostname .1 \
> hostname-OnQe.walk
Note
“SNMPCONFPATH=/dev/null
” permet d’éviter l’import d’options
de configuration depuis des fichiers du système tels que :
/etc/snmp/snmp.local.conf
/etc/snmp/snmp.conf
Par défaut, cette commande affiche sur la sortie standard le fichier de configuration XML correspondant aux équipements analysés. Le listing suivant présente le résultat d’une telle analyse:
<?xml version="1.0"?>
<host address="127.0.0.1" name="localhost.localdomain">
<group>Servers</group>
<class>ucd</class>
<test name="Users" />
<test name="Partition">
<arg name="partname">/home</arg>
<arg name="label">/home</arg>
</test>
<test name="Partition">
<arg name="partname">/</arg>
<arg name="label">/</arg>
</test>
<test name="TotalProcesses" />
<test name="Swap" />
<test name="CPU" />
<test name="Load" />
<test name="RAM" />
<test name="UpTime" />
<test name="TCPConn" />
<test name="InterrCS" />
</host>
Le résultat de cette commande peut être enregistré directement dans un fichier
de configuration XML afin d’être lu ensuite par VigiConf en utilisant l’option
“-o
” suivie de l’emplacement du fichier dans lequel le résultat doit être
sauvegardé.
La découverte peut-être limitée à un test en particulier via l’option “-t
”.
Activation / désactivation d’un serveur de supervision¶
La commande “vigiconf server-status
” permet d’activer ou de désactiver un
ou plusieurs serveurs de la plate-forme de supervision. Elle doit être appelée
avec au moins 2 arguments.
Le 1er argument indique l’action à effectuer et peut valoir :
- “
enable
” pour activer un ou plusieurs serveurs de supervision précédemment désactivés. - “
disable
” pour désactiver un ou plusieurs serveurs de supervision.
Annexes¶
Tests de supervision disponibles dans Vigilo¶
Le tableau suivant recense les tests de supervision disponibles dans Vigilo.
Nom du test | Classes disponibles | Détails |
---|---|---|
Collector |
|
The Collector service |
CPU |
|
Check the CPU usage of a host (service only) Paramètres acceptés par le test :
|
DiskIO |
|
Monitor the disks Input/Output Paramètres acceptés par le test :
|
HTTP |
|
Check if the HTTP service is up |
HTTP_url |
|
Check if the HTTP service is up for a given url Paramètres acceptés par le test :
|
HTTPS |
|
Check if the SSL certificates on the HTTPS server are OK |
Interface |
|
Check the status of an interface, and graph its throughput Paramètres acceptés par le test :
|
InterrCS |
|
Check the Interrupts and Context Switches of a host Paramètres acceptés par le test :
|
Load |
|
Check the load of a host Paramètres acceptés par le test :
|
Metro |
|
Set a threshold on metrology values Paramètres acceptés par le test :
|
NagiosPlugin |
|
Test générique pour utiliser un plugin Nagios indépendant Paramètres acceptés par le test :
|
NTP |
|
Check if the NTP service is up |
NTPSync |
|
Check if a host’s time is synchronized with the NTP server (uses NRPE) |
Partition |
|
Check if a partition is filling up Paramètres acceptés par le test :
|
Ping |
|
Check if a host is up with a ping Paramètres acceptés par le test :
|
Process |
|
Check the number of instances of a process Paramètres acceptés par le test :
|
Proxy |
|
Check if the HTTP proxy works as expected Paramètres acceptés par le test :
|
RAID |
|
Check the RAID status of a host |
RAM |
|
Check the RAM usage of a host Paramètres acceptés par le test :
|
SSH |
|
Check if the SSH service is up |
Swap |
|
Graph the swap usage (no supervision test) |
TCP |
|
Check if the requested TCP port is open Paramètres acceptés par le test :
|
TCPConn |
|
Check the total number of TCP connections Paramètres acceptés par le test :
|
TotalProcesses |
|
Check the total number of running processes Paramètres acceptés par le test :
|
UpTime |
|
Check the SNMP server’s uptime Paramètres acceptés par le test :
|
Users |
|
Check the number of connected users Paramètres acceptés par le test :
|
Messages d’erreurs/d’alerte/d’informations¶
Ce chapitre recense les messages d’erreurs les plus courants que vous êtes susceptibles de rencontrer, ainsi que la méthode de résolution de ces problèmes.
- VigiConf n’a pas été lancé en utilisant le compte ‘vigiconf’. Abandon.
- Afin de garantir la sécurité du système, VigiConf doit être exécuté en tant
qu’utilisateur “
vigiconf
”. Ce message d’erreur s’affiche lorsque cette condition n’est pas remplie et VigiConf refuse de s’exécuter. Le compte “root
” peut également être utilisé pour exécuter VigiConf (dans ce cas, l’application commencera par basculer vers le compte “vigiconf
” avant de lâcher ses privilèges). L’utilisation du compte “root
” pour démarrer VigiConf en production est déconseillée. - VigiConf a été lancé depuis le compte “
root
” (super-utilisateur). Utilisation du compte ‘vigiconf’ à la place. - Ce message d’avertissement est affiché lorsque VigiConf est exécuté depuis
le compte “
root
”.
Glossaire - Terminologie¶
Ce chapitre recense les différents termes techniques employés dans ce document et donne une brève définition de chacun de ces termes.
- XML
- eXtensible Markup Language. Langage de balisage extensible.
- URL
- Uniform Resource Locator. Chaîne de caractères permettant d’identifier une ressource sur Internet.
- SGBD
- Système de Gestion de Base de Données. Logiciel permettant d’héberger une base de données sur la machine.
- SVN
- Subversion, système de contrôle de versions. URL : http://subversion.apache.org