<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>CLAPI on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/clapi/</link><description>Recent content in CLAPI on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr-fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Tue, 20 Dec 2016 13:00:49 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/clapi/index.xml" rel="self" type="application/rss+xml"/><item><title>Module Ansible ansible-module-clapi : automatiser la configuration dans Centreon</title><link>https://blog.zwindler.fr/2016/12/20/ansible-module-clapi-centreon/</link><pubDate>Tue, 20 Dec 2016 13:00:49 +0000</pubDate><guid>https://blog.zwindler.fr/2016/12/20/ansible-module-clapi-centreon/</guid><description>&lt;img src="https://blog.zwindler.fr/2016/12/centreon_clapi_3.webp" alt="Featured image of post Module Ansible ansible-module-clapi : automatiser la configuration dans Centreon" /&gt;&lt;h2 id="avant-de-parler-de-ansible-module-clapi"&gt;Avant de parler de ansible-module-clapi
&lt;/h2&gt;&lt;p&gt;Cet article fait parti d’une suite d’articles ayant trait à l’automatisation de la configuration de la supervision Centreon à l’aide de CLAPI et d’Ansible, dont 2 que j’avais lu sur &lt;a class="link" href="https://www.monitoring-fr.org/" target="_blank" rel="noopener"
&gt;monitoring-fr&lt;/a&gt;. Dans &lt;a class="link" href="https://blog.zwindler.fr/2016/12/07/automatisation-de-la-supervision-avec-centreon-et-ansible-3/" &gt;l’article précédent&lt;/a&gt;, j’avais montré comment aller encore un peu plus loin que ce que Cédric Temple nous avait présenté.&lt;/p&gt;
&lt;p&gt;A la fin de l’article, j’introduisais le fait qu’Ansible n’est pas seulement un outil permettant d’exécuter des tâches. Ansible est surtout un gestionnaire de configuration (comme Puppet, Salt, &amp;hellip;).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ansible&lt;/em&gt; is the simplest way to automate apps and IT infrastructure. Application Deployment + Configuration Management + Continuous Delivery.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Le but est de garantir qu’un ensemble de serveurs donnés, on a &lt;strong&gt;toujours&lt;/strong&gt; la même configuration.&lt;/p&gt;
&lt;p&gt;Si on utilise Ansible de cet manière, le playbook n’a plus vocation a être utilisé « one shot » après installation d’un serveur. La gestion de la configuration de supervision devient un sous ensemble des configurations par défaut qui sont régulièrement vérifiées. Les playbooks qui définissent le SI sur l’ensemble des serveurs pour s’assurer qu’ils sont tous « conformes », tout est automatique et on élimine ainsi le risque d’erreurs humaines (type « oublis » ou « suppression accidentelle »).&lt;/p&gt;
&lt;h2 id="quelle-conséquence-sur-nos-playbooks-"&gt;Quelle conséquence sur nos playbooks ?
&lt;/h2&gt;&lt;p&gt;Car bien entendu, cela demande un peu plus de travail et de réflexion.&lt;/p&gt;
&lt;h3 id="les-exécutions-multiples"&gt;Les exécutions multiples
&lt;/h3&gt;&lt;p&gt;Si on exécute plusieurs fois le même playbook sur un serveur, -il faut impérativement que les commandes de ce playbook n’aient aucune incidence sur l’état du serveur si celui ci est déjà correctement configuré.&lt;/p&gt;
&lt;p&gt;J’insiste&amp;hellip; La modification &lt;strong&gt;ne doit ce faire que si nécessaire&lt;/strong&gt;. Dans le langage Ansible, on dit d’une commande qu’elle est &lt;strong&gt;idempotent&lt;/strong&gt;. Retenez bien, c’est important ;-).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/11/73068978.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Prenons pour exemple l’ajout d’une ligne dans le fichier &lt;strong&gt;/etc/sudoers&lt;/strong&gt; pour permettre à notre client NRPE d’avoir le droit de réaliser un sudo pour avoir l’exhaustivité des informations renvoyées par multipath. On pourrait « naïvement » réaliser la tâche suivante dans Ansible de la façon suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;---
- hosts: all
tasks:
- shell: &amp;#39;echo &amp;#39;nrpe ALL = NOPASSWD: /sbin/multipath&amp;#39; &amp;gt;&amp;gt; /etc/sudoers&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ce playbook fonctionnerait parfaitement.&lt;/p&gt;
&lt;h3 id="vraiment-"&gt;Vraiment ?
&lt;/h3&gt;&lt;p&gt;Pour autant, à chaque exécution du playbook, une ligne sera ajoutée dans chaque serveur et on se retrouvera potentiellement avec des effets de bords à force de modifications successives.&lt;/p&gt;
&lt;p&gt;On peut repérer ces changements à l’aide du récapitulatif en fin d’exécution qui serait toujours en &lt;em&gt;changed&lt;/em&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;PLAY RECAP *********************************************************************
srv-nouveau-01 : ok=11 changed=1 unreachable=0 failed=0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;En fait, il est recommandé d’éviter d’utiliser les modules &lt;strong&gt;shell&lt;/strong&gt; et &lt;strong&gt;command&lt;/strong&gt; d’Ansible lorsqu’il existe des modules pour réaliser la même action. Typiquement dans ce cas là, l’idéal sera plutôt d’utiliser le module &lt;strong&gt;lineinfile&lt;/strong&gt;, qui permet de s’assurer qu’une ligne bien précise est présente ou non, et de ne surtout rien faire (et donc ne rien modifier) si la ligne est déjà présente.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;---
- hosts: all
tasks:
- lineinfile: &amp;#39;dest=/etc/sudoers state=present line=&amp;#39;nrpe ALL = NOPASSWD: /usr/sbin/pvs, /sbin/multipath&amp;#39;&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Pour vérifier que votre playbook est idempotent&lt;/strong&gt;, le plus simple est donc de lancer plusieurs fois un même playbook et de vérifier que le résultat à la seconde exécution est bien du type :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;PLAY RECAP *********************************************************************
srv-nouveau-01 : ok=12 changed=0 unreachable=0 failed=0
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="les-erreurs"&gt;Les erreurs
&lt;/h3&gt;&lt;p&gt;Il ne faut pas non plus que les commandes renvoient un code erreur lorsqu’elles s’exécutent pour la 2ème fois. Auquel cas, l’exécution du playbook sera arrêtée en cours de route.&lt;/p&gt;
&lt;p&gt;Si j’exécute une première fois le playbook centreon_add_host.yml, j’obtiendrais le retour suivant.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;TASK [monitor : centreon add host] *********************************************
changed: [srv-nouveau-01 -&amp;gt; superviseur.company.lan]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Tout va bien, mon hôte apparaît dans Centreon. Par contre, si je l’exécute une seconde fois &amp;hellip;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;TASK [monitor : centreon add host] *********************************************
fatal: [srv-nouveau-01 -&amp;gt; superviseur.company.lan]: FAILED! =&amp;gt; {&amp;#39;changed&amp;#39;: true, &amp;#39;cmd&amp;#39;: &amp;#39;/usr/bin/centreon -u admin -p admin -o HOST -a add -v \&amp;#39;srv-nouveau-01;srv-nouveau-01;192.168.1.12;generic-host;central;Ping_LAN\&amp;#39;&amp;#39;, &amp;#39;delta&amp;#39;: &amp;#39;0:00:00.098198&amp;#39;, &amp;#39;end&amp;#39;: &amp;#39;2016-07-25 17:17:01.268410&amp;#39;, &amp;#39;failed&amp;#39;: true, &amp;#39;rc&amp;#39;: 1, &amp;#39;start&amp;#39;: &amp;#39;2016-07-25 17:17:01.170212&amp;#39;, &amp;#39;stderr&amp;#39;: &amp;#39;&amp;#39;, &amp;#39;stdout&amp;#39;: &amp;#39;Object already exists (srv-nouveau-01)&amp;#39;, &amp;#39;stdout_lines&amp;#39;: [&amp;#39;Object already exists (srv-nouveau-01)&amp;#39;], &amp;#39;warnings&amp;#39;: []}
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="ignorer-les-erreurs"&gt;Ignorer les erreurs
&lt;/h3&gt;&lt;p&gt;La méthode la plus simple pour gérer ce problème serait d’ignorer les erreurs. Ici CLAPI ne renvoie une erreur que pour m’informer que l’hôte existe déjà. Donc la gestion des erreurs et ici l’ajout multiple d’un même hôte est correctement géré par CLAPI.&lt;/p&gt;
&lt;p&gt;Ansible le permet à l’aide de l’option &lt;em&gt;ignore_errors: True&lt;/em&gt;. Dans ce cas là, l’exécution de la commande CLAPI qui renvoie une erreur sera ignoré dans le cas où l’hôte est déjà présent.&lt;/p&gt;
&lt;p&gt;Mais la solution n’est pas satisfaisante : on peut se retrouver à masquer de vraies erreurs. Par exemple, si je n’ai pas fourni le bon chemin d’accès au binaire, l’erreur sera cachée et je ne saurai pas que mon playbook ne fonctionne jamais correctement. On peut imaginer plein d’autres cas d’erreurs qui nous laisseraient penser que l’ajout d’hôte se fait bien alors qu’en fait l’erreur est juste masquée.&lt;/p&gt;
&lt;p&gt;A l’inverse, on peut trouver des cas où masquer l’erreur peut être légitime. Vous pouvez donc aller voir &lt;a class="link" href="https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_conditionals.html" target="_blank" rel="noopener"
&gt;ici&lt;/a&gt; pour plus de renseignements.&lt;/p&gt;
&lt;h3 id="tester-préalablement-la-présence-de-lhôte"&gt;Tester préalablement la présence de l’hôte
&lt;/h3&gt;&lt;p&gt;Toujours dans l’esprit &lt;strong&gt;idempotent&lt;/strong&gt;, le mieux est donc de vérifier préalablement que le serveur n’est pas déjà renseigné avant de réaliser l’action d’ajout dans Centreon.&lt;/p&gt;
&lt;p&gt;Malheureusement, à date, il n’existe pas de fonction dans CLAPI permettant de faire une recherche dans un seul hôte. Je le leur soufflerais peut être ;-). En attendant, on peut quand même s’en sortir grâce à la fonction &lt;em&gt;show&lt;/em&gt; qui affiche une liste de tous les serveurs et un &lt;em&gt;grep&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;En fonction de la présence ou non de la ligne, on obtiendra un code retour de 0 ou 1, ce qui nous permet de valider la présence ou non du serveur.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;- name: centreon check presence
shell: /usr/bin/centreon -u &amp;#39;{{ clapi_username }}&amp;#39; -p &amp;#39;{{ clapi_password }}&amp;#39; -o HOST -a show | grep &amp;#39;{{ inventory_hostname }};&amp;#39; &amp;gt;/dev/null
delegate_to: &amp;#39;{{ centreon_poller }}&amp;#39;
register: centreon_output
- name: centreon add host
shell: /usr/bin/centreon -u &amp;#39;{{ clapi_username }}&amp;#39; -p &amp;#39;{{ clapi_password }}&amp;#39; -o HOST -a add -v &amp;#39;{{ inventory_hostname }};{{ inventory_hostname }};{{ ansible_default_ipv4.address }};generic-host;{{ centreon_poller }};Ping_LAN&amp;#39;
delegate_to: &amp;#39;{{ centreon_poller }}&amp;#39;
when: centreon_output.rc != 0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Cette solution fonctionne mais est loin d’être optimale. D’abord, elle se base sur &lt;em&gt;grep&lt;/em&gt;, un binaire externe à CLAPI, pour valider la présence du serveur. Ça peut ne pas marcher à tous les coups !&lt;/p&gt;
&lt;p&gt;Ensuite, le module &lt;strong&gt;shell&lt;/strong&gt; à la fâcheuse caractéristique de ne pas être &lt;strong&gt;idempotent&lt;/strong&gt; (c’est une obsession). A chaque exécution, Ansible considérera que le simple fait d’exécuter la commande change le système et affichera &lt;strong&gt;toujours&lt;/strong&gt; « changed » même quand en réalité vos serveurs n’auront pas été modifiés !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;PLAY RECAP *********************************************************************
srv-nouveau-01 : ok=10 changed=1 unreachable=0 failed=0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Avec &lt;strong&gt;shell&lt;/strong&gt; il n’y a pas vraiment de parade au niveau Ansible. L’idéal serait donc pouvoir disposer d’un module Ansible capable d’interagir avec CLAPI tout en étant idempotent. #Teasing ;-)&lt;/p&gt;
&lt;h2 id="créer-un-nouveau-module-ansible"&gt;Créer un nouveau module Ansible
&lt;/h2&gt;&lt;p&gt;Heureusement il est très facile de créer un nouveau module dans Ansible. &lt;a class="link" href="http://docs.ansible.com/ansible/developing_modules.html" target="_blank" rel="noopener"
&gt;Un exemple est proposé sur le site officiel&lt;/a&gt; avec des guides pour la proposition de module pour ajout dans les « extra modules ». Et j’ai également pas mal utilisé ce site pour me guider (blog.toast38coza.me, lien mort pas sauvegardé dans Internet Archive).&lt;/p&gt;
&lt;p&gt;J’ai donc développé pour mon usage personnel des modules Ansible qui utilisent CLAPI et qui permettent pour l’instant de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ajouter/supprimer un hôte&lt;/li&gt;
&lt;li&gt;ajouter/supprimer des templates d’hôtes à un hôte&lt;/li&gt;
&lt;li&gt;ajouter/supprimer un groupe d’hôtes&lt;/li&gt;
&lt;li&gt;ajouter/supprimer des serveurs dans un groupe d’hôtes&lt;/li&gt;
&lt;li&gt;régénérer la configuration et redémarrer un poller pour prise en compte des modifications&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et le code est disponible &lt;a class="link" href="https://github.com/zwindler/ansible-module-clapi" target="_blank" rel="noopener"
&gt;ici sur mon Github dans le projet ansible-module-clapi&lt;/a&gt; sous licence GPLv3.&lt;/p&gt;
&lt;p&gt;Une fois les sources récupérées, vous pouvez exécuter ces modules Ansible complémentaires en créant un dossier librairie au même niveau que vos playbooks et en collant les fichiers Python du dépôt.&lt;/p&gt;
&lt;p&gt;Un dossier &lt;em&gt;test_suite&lt;/em&gt; contient le fichier hosts de cet article, le dossier group_vars avec les variables par groupes, ainsi qu’un playbook de test qui réalisera les actions suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ajouter un hôte dans centreon&lt;/li&gt;
&lt;li&gt;supprimer ce même hôte de centreon&lt;/li&gt;
&lt;li&gt;le resupprimer pour vérifier que la suppression d’un hôte déjà supprimé ne provoque pas d’erreur car l’hôte n’existe plus&lt;/li&gt;
&lt;li&gt;supprimer un groupe testgroup qui n’existe pas pour voir si une erreur est renvoyée&lt;/li&gt;
&lt;li&gt;ajouter le groupe testgroup&lt;/li&gt;
&lt;li&gt;ajouter le groupe testgroup pour voir si cela génère une erreur à la 2ème exécution&lt;/li&gt;
&lt;li&gt;ajouter l’hôte au groupe testgroup&lt;/li&gt;
&lt;li&gt;ajouter un template à l’hôte&lt;/li&gt;
&lt;li&gt;si un template d’hôte a été ajouté (oui, on vient de le faire)
&lt;ul&gt;
&lt;li&gt;déclencher un « handler » =&amp;gt; appliquer à l’hôte l’ensemble des templates de services liés au template d’hôte&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;et si n’importe laquelle de ces actions a provoqué une modification sur la base de Centreon (toutes en réalité)
&lt;ul&gt;
&lt;li&gt;déclencher un « handler » =&amp;gt; régénérer la configuration et redémarrer le moteur&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="conclusion"&gt;Conclusion
&lt;/h3&gt;&lt;p&gt;Ceci vous permet d’avoir une vue d’ensemble des fonctionnalités disponibles pour l’instant. Ce n’est bien entendu qu’un début et je continuerai d’ajouter des fonctionnalités à partir de l’API CLAPI qui propose beaucoup plus de fonctionnalités.&lt;/p&gt;
&lt;p&gt;Pour autant, ce module me permet aujourd’hui automatiser complètement l’ajout et la suppression des hôtes dans mon serveur Centreon. Actuellement pratiquement 120 serveurs sont gérés de cette manière :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/11/centreon_ces02.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;J’attends bien entendu vos remarques, que ce soit sur le blog ou directement sur Github, avec impatience !&lt;/p&gt;</description></item><item><title>Automatisation de la supervision avec Centreon et Ansible (3)</title><link>https://blog.zwindler.fr/2016/12/07/automatisation-de-la-supervision-avec-centreon-et-ansible-3/</link><pubDate>Wed, 07 Dec 2016 13:00:47 +0000</pubDate><guid>https://blog.zwindler.fr/2016/12/07/automatisation-de-la-supervision-avec-centreon-et-ansible-3/</guid><description>&lt;img src="https://blog.zwindler.fr/2016/12/centreon_clapi_3.webp" alt="Featured image of post Automatisation de la supervision avec Centreon et Ansible (3)" /&gt;&lt;h2 id="articles-précédents-sur-centreon-et-ansible"&gt;Articles précédents sur Centreon et Ansible
&lt;/h2&gt;&lt;p&gt;Cet article fait suite aux deux articles rédigés en mai 2015 par Cédric Temple (&lt;a class="link" href="http://www.monitoring-fr.org/2015/05/automatisation-de-la-supervision-exemple-avec-centreon-et-ansible-1/" target="_blank" rel="noopener"
&gt;ici&lt;/a&gt; et &lt;a class="link" href="http://www.monitoring-fr.org/2015/05/automatisation-de-la-supervision-exemple-avec-centreon-et-ansible-2/" target="_blank" rel="noopener"
&gt;ici&lt;/a&gt;) qui donnent des pistes pour automatiser l’ajout de nœuds à superviser dans un console Centreon grâce à Ansible et CLAPI.&lt;/p&gt;
&lt;p&gt;Pour ceux qui ne connaissent pas &lt;a class="link" href="https://www.ansible.com/" target="_blank" rel="noopener"
&gt;Ansible&lt;/a&gt;, je vous invite fortement à vous documenter sur cet outil de déploiement et de gestion de configuration très complet et qui bénéficie en ce moment d’un fort engouement, surtout depuis qu’Ansible a été racheté par RedHat ;-).&lt;/p&gt;
&lt;p&gt;Et pour ceux qui ne connaissent pas &lt;a class="link" href="https://docs.centreon.com/fr/docs/api/clapi/" target="_blank" rel="noopener"
&gt;CLAPI&lt;/a&gt;, il s’agit d’une API mise à disposition avec &lt;a class="link" href="https://www.centreon.com/fr/" target="_blank" rel="noopener"
&gt;Centreon&lt;/a&gt;. Elle est installée par défaut dans les dernières versions. Elle permet de réaliser la totalité des opérations pouvant être faites depuis la console web en ligne de commande.&lt;/p&gt;
&lt;p&gt;Les deux articles sur &lt;strong&gt;Monitoring-fr&lt;/strong&gt; que je cite au début sont une bonne base pour appréhender ces deux sujets. Pour autant, on peut encore aller un peu plus loin et c’est pourquoi je vous propose de repartir de là où s’arrête l’article précédent.&lt;/p&gt;
&lt;h2 id="lexemple-de-lajout-de-lhôte"&gt;L’exemple de l’ajout de l’hôte
&lt;/h2&gt;&lt;p&gt;A la fin de l’article précédent, on sait donc :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;installer automatiquement les clients de supervision sur un nouvel hôte&lt;/li&gt;
&lt;li&gt;et réaliser de manière unitaire via Ansible et des playbooks l’ajout et la modification d’hôtes dans Centreon.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J’aimerai revenir sur l’ajout d’hôtes dans Centreon. Pour reprendre l’exemple du playbook d’ajout d’hôtes de Cédric :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat centreon_add_host.yml
- name: centreon add host
shell: /usr/share/centreon/www/modules/centreon-clapi/core/centreon -u admin -p admin -o HOST -a add -v &amp;#39;{{ inventory_hostname }};{{ inventory_hostname }};{{ ansible_default_ipv4.address }};generic-host;central;ALL_HOST&amp;#39;
delegate_to: superviseur.company.lan
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et voici le fichier d’inventaire dans lequel on déclare l’ensemble de nos serveurs, triés par groupes.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat /etc/ansible/hosts #fichier hosts d&amp;#39;Ansible
#ne pas confondre avec le hosts d&amp;#39;un serveur Linux
[serveurs-centreon]
superviseur.company.lan
pollerprod.company.lan
[serveurs-prod]
srv-prod-01
srv-prod-02
[serveurs-rect]
srv-rect-01
srv-rect-02
[nouveaux]
srv-nouveau-01
srv-nouveau-02
[serveurs-linux:children]
serveurs-prod
serveurs-rect
nouveaux
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans cet exemple simple, la première chose qu’on se dit si on regarde un peu rapidement, c’est qu’on aurait pu réaliser cet ajout à la main (ou via un script) avec CLAPI.&lt;/p&gt;
&lt;p&gt;Le gain apporté par Ansible se situe « seulement » dans l’apport des variables &lt;em&gt;inventory_hostname&lt;/em&gt; et &lt;em&gt;ansible_default_ipv4.address&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Ici on tire partie de la faculté qu’a Ansible de récupérer des « facts » sur les machines, telle que l’adresse IP, que nous n’avons pas eu à renseigner.&lt;/p&gt;
&lt;p&gt;C’est déjà un bon point par rapport à un script ou une commande à la main &amp;hellip; mais on peut faire mieux !!&lt;/p&gt;
&lt;h2 id="aller-plus-loin--avec-les-variables-de-groupes"&gt;Aller plus loin : avec les variables de groupes
&lt;/h2&gt;&lt;p&gt;La première chose que je vais montrer dans cet article est qu’on peut également affecter aux groupes d’hôtes dans Ansible des variables.&lt;/p&gt;
&lt;p&gt;Dans notre exemple, je vais donc créer un répertoire &lt;em&gt;group_vars&lt;/em&gt; dans lequel je vais créer des fichiers de configuration dédiés à chaque groupe. J’en créé un par groupe (ou pas), et Ansible analysera automatiquement le répertoire group_vars et appliquera à mes hôtes toutes ces variables en fonction de ses groupes.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat /etc/ansible/group_vars/serveurs-linux.yml
#NRPE Servers
nrpe_servers: [&amp;#39;192.168.100.10&amp;#39;, &amp;#39;192.168.100.11&amp;#39;]
#Poller Centreon
centreon_server: &amp;#39;superviseur.company.lan&amp;#39;
centreon_pollername : &amp;#39;Central&amp;#39;
centreon_clapi_username : &amp;#39;admin&amp;#39;
centreon_clapi_password : &amp;#39;admin&amp;#39;
centreon_clapi_path : &amp;#39;/usr/share/centreon/www/modules/centreon-clapi/core/centreon&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Je modifie donc mon playbook de la façon suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat centreon_add_host.yml
---
- name: centreon add host
shell: &amp;#39;{{centreon_clapi_path}}&amp;#39; -u &amp;#39;{{ centreon_clapi_username }}&amp;#39; -p &amp;#39;{{ centreon_clapi_password }}&amp;#39; -o HOST -a add -v &amp;#39;{{ inventory_hostname }};{{ inventory_hostname }};{{ ansible_default_ipv4.address }};generic-host;{{ centreon_pollername }};ALL_HOST&amp;#39;
delegate_to: &amp;#39;{{centreon_server}}&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le playbook est beaucoup plus &lt;em&gt;réutilisable&lt;/em&gt; qu’avant. Qu’est ce qui a changé ?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;J’ai variabilisé le chemin vers le binaire d’appel de CLAPI, qui était quand même vraiment long  (Même si on préfèrera probablement plutôt ajouter le chemin dans le PATH, simplement) !&lt;/li&gt;
&lt;li&gt;Je n’ai plus à renseigner le username et le mot de passe pour CLAPI à chaque appel.&lt;/li&gt;
&lt;li&gt;Si j’ai plusieurs serveurs Centreon (plusieurs réseaux distincts par exemple), je n’ai qu’à créer un groupe et un fichier de variables dans group_vars dans lequel je renseignerai « centreon_server », « clapi_username » et « clapi_password » différents. Mon playbook restera inchangé.&lt;/li&gt;
&lt;li&gt;Si j’ai plusieurs pollers (pollerprod pour la prod dans cet exemple), je peux affecter le serveur directement au bon poller avec la variable « centreon_pollername ».&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="encore-un-peu-plus-loin--avec-les-groupes-et-lhéritage"&gt;Encore un peu plus loin : avec les groupes et l’héritage
&lt;/h2&gt;&lt;p&gt;Dans la configuration exemple que je donne plus haut, vous aurez peut être remarqué le groupe &lt;strong&gt;serveurs-linux&lt;/strong&gt; qui regroupe tous les serveurs des groupes serveurs-prod, serveurs-rect et nouveaux.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[serveurs-linux:children]
serveurs-prod
serveurs-rect
nouveaux
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;De cette manière, tous les paramètres communs à tous les serveurs linux peuvent être configurés au niveau serveurs-linux. Les variables seront héritées lors de l’exécution du playbook.&lt;/p&gt;
&lt;p&gt;On peut aussi utiliser les groupes comme conditions de l’exécution d’un playbook. Ainsi, le playbook suivant ne s’exécutera que si le serveur fait parti du groupe serveurs-prod.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat centreon_add_host_prod.yml
---
- name: centreon add host when in serveurs-prod
shell: &amp;#39;{{centreon_clapi_path}}&amp;#39; -u &amp;#39;{{ centreon_clapi_username }}&amp;#39; -p &amp;#39;{{ centreon_clapi_password }}&amp;#39; -o HOST -a add -v &amp;#39;{{ inventory_hostname }};{{ inventory_hostname }};{{ ansible_default_ipv4.address }};generic-host;{{ centreon_pollername }};ALL_HOST&amp;#39;
delegate_to: &amp;#39;{{centreon_server}}&amp;#39;
when: &amp;#34;&amp;#39;serveurs-prod&amp;#39; in group_names&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="toujours-plus-loin--avec-les-variables-et-les-templates"&gt;Toujours plus loin : avec les variables et les templates
&lt;/h2&gt;&lt;p&gt;Les variables sont vraiment un gros plus !&lt;/p&gt;
&lt;p&gt;Elles me permettent notamment de configurer les fichiers &lt;strong&gt;nrpe.conf&lt;/strong&gt; (ou &lt;strong&gt;ntpd.conf&lt;/strong&gt;, &lt;strong&gt;snmpd&lt;/strong&gt;, &lt;strong&gt;resolv.conf&lt;/strong&gt;, &amp;hellip;) pour accepter les connexions des bons serveurs en fonction de la localisation ou du groupe.&lt;/p&gt;
&lt;p&gt;La fonctionnalité la plus utile dans ce cas là est l’utilisation de &lt;strong&gt;templates&lt;/strong&gt;. Il s’agit de fichiers de configurations &lt;em&gt;variabilisés&lt;/em&gt; qui sont déployés uniquement si nécessaire sur les serveurs cibles en fonction de leurs variables.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exemple d’un template de fichier nrpe.conf&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;{{ ansible_managed }}
cat nrpe.conf.j2
log_facility=daemon
pid_file=/var/run/nrpe.pid
server_port=5666
nrpe_user=nagios
nrpe_group=nagios
allowed_hosts={% for i in nrpe_servers %} {{ i }}, {% endfor %}
debug=0
command_timeout=60
connection_timeout=300
command[check_users]=/libexec/check_users -w 5 -c 10
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le playbook suivant permettra de le déployer sur l’ensemble de mes serveurs CentOS et Redhat le package du client &lt;strong&gt;nrpe&lt;/strong&gt; et ses dépendances et configurer le fichier &lt;strong&gt;nrpe.cfg&lt;/strong&gt; &lt;em&gt;en fonction du contexte&lt;/em&gt; (pour ceux qui n’ont pas encore ce fichier ou une version différente).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat nrpe.yml
---
- hosts: all
tasks:
- yum: name={{ item }} state=installed
with_items:
- nrpe.x86_64
- net-snmp
- sysstat
- ...
- template: src=nrpe.cfg.j2 dest=/etc/nagios/nrpe.cfg
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Une fois exécuté avec la commande suivante, Ansible balayera l’ensemble des serveurs renseignés dans le fichier /etc/ansible/hosts, vérifiera qu’ils ont tous les packages &lt;strong&gt;nrpe&lt;/strong&gt; d’installés, puis déploiera sur les serveurs nécessaires le fichier de configuration en fonction des variables de chacun.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-playbook -i /etc/ansible/hosts /etc/ansible/nrpe.yml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et dans mon exemple on obtiendra un fichier de la forme suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# Ansible managed: nrpe.cfg.j2 modified on 2016-08-14 10:52:51 by ansible on hostname
log_facility=daemon
pid_file=/var/run/nrpe.pid
server_port=5666
nrpe_user=nagios
nrpe_group=nagios
allowed_hosts=192.168.100.10, 192.168.100.11,
debug=0
command_timeout=60
connection_timeout=300
command[check_users]=/libexec/check_users -w 5 -c 10
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="mais-ansible-est-avant-tout-un-gestionnaire-de-configuration"&gt;Mais Ansible est avant tout un gestionnaire de configuration
&lt;/h2&gt;&lt;p&gt;Ansible ne sert pas uniquement à déployer des applications sur un serveur ou à exécuter des tâches automatisables. Au delà de ces rôles qu’il rempli à merveille, Ansible est surtout un gestionnaire de configuration (comme Puppet, Salt, &amp;hellip;).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ansible&lt;/em&gt; is the simplest way to automate apps and IT infrastructure. Application Deployment + Configuration Management + Continuous Delivery.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;On le voit avec mon dernier exemple : le but est de garantir qu’un ensemble de serveurs donnés, on a &lt;strong&gt;toujours&lt;/strong&gt; la même configuration.&lt;/p&gt;
&lt;p&gt;C’est le principe fondamental des outils de gestion de configuration et on comprend vite le gain :&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;
Si une modification est réalisée par erreur, elle sera automatiquement corrigée au prochain passage du playbook =&gt; on n’aura pas besoin d’attendre qu’un administrateur passe par hasard sur un serveur pour remarquer une anomalie sur le NTP par exemple.
&lt;/p&gt;
&lt;p&gt;Appliqué à la supervision et Centreon&lt;/p&gt;
&lt;p style="padding-left: 30px;"&gt;
Je garanti que tous les serveurs inscris dans Ansible sont automatiquement ajoutés dans Centreon, en fonction de leur groupe. Si un administrateur oublie d’ajouter un serveur ou en supprime un, il sera ré-ajouté à l’exécution d’après sans intervention manuelle.
&lt;/p&gt;
&lt;p&gt;C’est donc de cette manière qu’il est conseillé d’utiliser Ansible. Le playbook n’est pas là pour être joué une fois par serveur, au fil de l’eau, car c’est source d’erreur ou d’oublis. On préférera plutôt exécuter régulièrement l’ensemble des playbooks qui définissent le SI sur l’ensemble des serveurs pour s’assurer qu’ils sont tous « conformes », sur tous les aspects dont la supervision.&lt;/p&gt;
&lt;p&gt;Le réel gain en terme d’automatisation ce trouve ici.&lt;/p&gt;
&lt;h2 id="et-dans-larticle-qui-va-suivre-"&gt;Et dans l’article qui va suivre ?
&lt;/h2&gt;&lt;p&gt;Et c’est sur cette deuxième partie que nous nous attarderons dans le prochain article : la gestion de playbook pour automatiser la configuration de la supervision pour l’ensemble de nos hôtes via des playbooks idempotent (#teasing) !&lt;/p&gt;</description></item></channel></rss>