vCMDB

Introduction et philosophie

vCMDB (Vincent Configuration Management DataBase) a été développé au départ pour Rezopole pour centraliser dans une seule base de données l'intégralité du système d'information:

  • Equipements (serveurs, routeurs)
  • Sites et baies
  • Tiroirs optiques et numéro de fibres
  • Adresses IPs et VLAN

On aurait pu partir d'un logiciel déjà existant: GLPI, OCS, Racktables, Centreon…Ce sont de très bons outils, mais souvent très typés IT et ne pouvant stocker toutes les informations que vous souhaitez (essayez de mettre 12 alimentations à votre serveur pour voir si ca marche ^^). Il faut donc des patches/des plugins/synchros pour interconnecter tout ce que vous utilisez. Et fort à parier que vos données sont dupliquées à plusieurs endroits.

On préfère donc partir sur une base type Merise (ou UML) que vous façonnez à votre manière pour qu'elle représente de manière fidèle votre système d'information. Chacun aura le sien, mais vous pourrez créer les connexions que vous voulez. vCMDB, vous permettera de pouvoir extraire les données vers vos applicatifs préférés:

  • Nagios
  • MRTG
  • Cacti
  • dhcpd
  • named
  • bacula
  • dokuwiki
  • vtiger

Et le jour où vous ferez le choix (volontaire ou non) de changer un de ces outils, votre base de données ne changera pas, il faudra juste modifier vos exports.

Très orienté réseau au départ, j'ai voulu dés le départ un outil générique qui puisse être à la fois utilisé par les hébergeurs/FAI mais aussi par n'importe quelle entreprise qui souhaite mieux organiser ses données. Adieu donc le fichier excel et les post-it :)

Après une recherche approfondie des différents CMDB open source existants, la meilleure solution trouvée en 2012 était onecmdb. Le framework java étant très TRES lent, j'ai décidé de redévelopper en partant de zéro en PHP/MySQL.

vCMDB est distribué en Open Source sous la licence Affero GPL

 

Vidéo

 

Prérequis

Pour faire fonctionner vCMDB, il faut:

  • MySQL (InnoDB)
  • libapache2-mod-php5
  • php-fpdf
  • php5

INSTALLATION

 

Téléchargements

 

Manuel d'utilisation

 
 

Arborescence de fichiers

./triggers
./export
./storage
./scripts
./js
./import
./classes
./view
 

Triggers

Pour chaque objet, on veut pouvoir exécuter une action lorsque celui ci est ajouté/modifié/supprimé

Pour créer un trigger, il faut créer un fichier:<br> triggers/<object>.php

Et créer une fonction:
        function trigger_<object>($action, $prepost, $id, $fields=null){
                global $vcmdb;
                global $global_url;
        }

On ne charge pas tous les triggers au démarrage pour en pas surcharger le code et le chargement.<br>

La variable prepost peut soit valoir:

*”pre” si on veut exécuter une commande avant l'action *”post” si on veut exécuter une commande après l'action

 

Vues

Lorsque l'on affiche un objet par exemple voiture, la page d'édition cherche s'il existe une page:

view/voiture.php

Si celle-ci existe, il l'inclut dans le code PHP. On peut donc réaliser diverses opérations sur l'objet ou génération de la configuration. Toutes les variables de configuration sont déjà chargées:

  • $vcmdb Accès à la classe de gestion de la base de données
  • $data[] L'objet
  • $data_references[] Les liaisons 1 vers 1
  • $data_relations[] Les liaisons 1 vers n
 

Scripts

Les scripts peuvent se retrouver à 3 endroits différents

  • pour les scripts d'import de données dans vCMDB, on les placera dans imports
  • pour les scripts d'export de données ou de génération de configuration, on les placera dans exports
  • le répertoire scripts est réservé aux taches planifiées, ou aux scripts à lancer à la main avec le binaire PHP
 

Base de données MySQL

L'outil se veut le plus générique possible et stocke ces données dans une base de données.

Afin que l'on puisse éventuellement intérogger facilement la base de donnée, pour chaque objet, on créé une table. On utilise le modèle Merise 2.<br>

Attention: Il est interdit de créer une table qui s'appelle ANY.

Le caractère '_' et l'espace sont interdit dans les noms des objets (on évitera aussi les accents et apostrophes). Chaque objet est identifié par une table dans la base de données:

  • objet
  • objet1_objet2(_description) correspond à une jointure 1 vers 1 entre 2 objets

Voici comment sont décrites les clés en base de données:

  • id ⇒ clé primaire
  • id_table(_description) ⇒ clé étrangère vers une table particulière
  • id_any_description ⇒ clé étrangère vers n'importe quel objet stocké sous la forme table/id

Lorsque l'on créé un objet, les champs suivants sont créés automatiquement:

AttributDescription
id clé primaire
name nom de l'objet
created date/heure de création
lastModified date/heure de modification

Tables systèmes

vcmdb-action La liste des actions possibles sur un objet (utilisée pour la gestion des permissions)
vcmdb-history L'historique de vos objets
vcmdb-language La gestion des langues (A FAIRE)
vcmdb-menu Le menu du haut
vcmdb-menu-url Les sous menus
 

Stockage des fichiers

On a la possibilité pour chaque instance d'un objet de lui attacher un ou plusieurs fichiers. On peut ainsi rattacher:

  • des devis à un matériel
  • des bons de commandes signés à une société

Le stockage se fait actuellement sur le serveur web, mais le logiciel a été prévu pour pouvoir exporter le stockage en FTP par exemple.

 

Développement

Pour démarrer son premier script, il est important de bien lire le contenu de classes/vcmdb.inc.php

Cherche un objet

Voici un exemple simple pour démarrer, on affiche toutes les instances d'objet societe

 require_once("config.inc.php");
 foreach($vcmdb->search("societe") as $societe) {
  echo $societe['name'];
 }

Simple non ?

On peut aussi rechercher avec des conditions:

 require_once("config.inc.php");
 foreach($vcmdb->search("societe",Array('name'),'name',Array("name like '%a%'")) as $societe) {
  echo $societe['name'];
 }

Récupérer les infos d'un objet

 require_once("config.inc.php");
 $societe = $vcmdb->get("societe",1);
  echo $societe['name'];

Récupérer tous les objets liés

Cela permet de récupérer tous les objets qui font références à l'objet en question<br>

 require_once("config.inc.php");
 $array = $vcmdb->get_related_objects("societe",1);
 print_r($array);