Petite introduction a ninac Description sommaire ninac veut dire "Ninac Is Not A Cron". ninac est un ordonnanceur permettant d'executer des taches. Mais son mode d'operation est completement different de CRON: D'ou le nom (ninac is not a cron). Le but de ninac est de commander l'execution de taches inter-reliees (inter-dependantes). En fonction de condition etablie par des processus externe, ninac decide d'executer certaines taches. Les conditions peuvent etre -Une certaine periode de la journee -Le succes de l'execution d'une autre tache -Le fait que certaines taches ne sont pas en train d'executer (acces exclusif a une ressource) -N'importe quoi (condition testable par une fonction definie par l'usager) Ce que ninac ne peut pas faire Contrairement a CRON, ninac peut difficilement executer une tache a toute les X minutes par exemple. Avant de commencer Nous utilisons ninac pour commander une batterie de serveurs. Chaque serveur, appele un maitre, supporte une serie de vservers. Ce concept n'est pas essentiel dans l'operation de ninac, mais est tres apparent. On retrouve certaine reference a des variables MASTER permettant d'identifier le serveur physique hebergeant une cible. Principes d'operation Un tache est definie comme suit -un nom -une cible -une serie de conditions (0 ou plus) -une serie de fonctions condition (0 ou plus) -une serie de fonction de pre/post-execution (0 ou plus) Lorsque toutes les conditions sont vrais et que toute les fonctions condition retournent vrai, la tache est executee. Ninac ne sait pas vraiment execute une tache. Un tache correspond a un script quelque part. Ninac execute simplement l'utilitaire ninacexec qui lui saura trouver le bon script. Une tache ne peut etre execute que si elle est armee. En fait, c'est ce qui empeche ninac d'executer sans arret la meme tache (Tant que les conditions sont vrais). Quand ninac execute une tache, il desarme celle-ci. La tache va se re-armer des qu'une des conditions devient fausse. Pas de cron Ninac n'est pas un cron. Il n'y a pas de notion d'heure dans ninac. Par contre, on utilisera generalement ninac en collaboration avec un cron qui etablira certaines conditions et le retirera en fonction d'un calendrier. Voici un exemple de cron 0 22 * * 0-5 ninaccmd setstate entretien_soir 0 1 * * 0-5 ninaccmd unsetstate entretien_soir 0 18 * * 6 ninaccmd setstate entretien_semaine 0 1 * * 6 ninaccmd unsetstate entretien_semaine 0 1 * * 1-5 ninaccmd setstate loader_time 0 12 * * 1-5 ninaccmd unsetstate loader_time Un certain nombre de tache seront definie en fonction des condition entretien_soir, entretien_semaine et loader_time. Base de donnee ninac peut etre considere comme une petite base de donnee. On peut enregistrer des variables avec valeur, les changer, les chercher etc... Certaines variables sont essentielles pour l'operation de ninac. Mais il n'y a pas de restriction. On peut y placer les informations que l'on souhaite. ninaccmd setvar variable valeur [ timestamp ] Variable ou condition Pour des raisons historiques, ninac a differencie les conditions et les variables. Plus tard, nous avons simplifie le design et les conditions ont ete geres comme des variables. Pour eviter les collisions, toutes les conditions recoivent un prefixe avant de les stocker comme variable. La commande ninaccmd ninac est un serveur qui ne pose aucune question. Il recoit toutes ses informations via la commande ninaccmd. Meme lorsque ninac execute une tache, la commande ninacexec l'informe du resultat via la commande ninaccmd. La commande ninaccmd sans argument fourni la liste des commandes supportees. Securite Le fichier /etc/ninac/ninaccmd.conf contient le secret transmis par ninaccmd pour s'identifier au serveur ninac. Le fichier exemple est fourni. Le fichier /etc/ninac/clients.conf contient les secrets utilises par les differents clients (ninaccmd). Par defaut, le nom d'un client est std. On peut change ceci via l'option --id de ninaccmd. La communication entre ninaccmd et ninac se fait en clair. Par contre, le transmission du secret est secure. Un protocole de type challenge/response est utilise. ninaccmd communique avec ninac soit via TCP, soit via un "unix domain socket". On peut changer le mode d'operation de ninaccmd soit via sa ligne de commande, soit via le fichier /etc/ninac/ninaccmd.conf. Les fichiers /var/log/ninac/journal.log C'est un journal contenant toutes les modifications enregistrees dans la base de donnees de ninac. Lorsqu'on redemarre le service ninac, ce journal est automatiquement relue. Ninac conserve donc son etat d'une execution a l'autre. Un mecanisme de rotation est prevu (via logrotate) pour eviter que le journal grossisse a l'infini. Le mecanisme renomme le fichier est demande a ninac d'inscrire toutes les variables courante dans le nouveau journal. /var/log/ninac/ninac.log C'est le journal d'execution des taches. La commande ninac-last permet de relire ce journal et de montrer les taches en cours ainsi que les taches completes. /var/log/ninac/cible/tache/PID/... Les messages produits par l'execution d'une tache sont collectes ici (erreur,out,info). Emplacement des script-taches Lorsqu'une tache est executee, ninac execute la commande ninacexec. ninacexec realise les taches suivantes -localise le script a executer -Creation d'un repertoire dans /var/log/ninac pour collecter les resultats -collecte les messages d'erreur et de sortie -Recueille le code de retour -Inscrit la date de depart et de fin dans /var/log/ninac/ninac.log -Avertit ninac que la tache a complete (notant le code de retour)