<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Script on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/script/</link><description>Recent content in Script 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 Jun 2017 11:30:10 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/script/index.xml" rel="self" type="application/rss+xml"/><item><title>Déployer des machines virtuelles avec Ansible (VMware)</title><link>https://blog.zwindler.fr/2017/06/20/deployer-machines-virtuelles-ansible-vmware/</link><pubDate>Tue, 20 Jun 2017 11:30:10 +0000</pubDate><guid>https://blog.zwindler.fr/2017/06/20/deployer-machines-virtuelles-ansible-vmware/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/06/ansible-vmware.webp" alt="Featured image of post Déployer des machines virtuelles avec Ansible (VMware)" /&gt;&lt;h2 id="déployer-des-vms-via-ansible-"&gt;Déployer des VMs via Ansible ?
&lt;/h2&gt;&lt;p&gt;Depuis que j’automatise &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=ansible" &gt;tout ce qui peut l’être sur mes machines virtuelles avec l’aide d’Ansible&lt;/a&gt;, il y avait une corde qui manquait encore à mon arc.&lt;/p&gt;
&lt;p&gt;Jusqu’à présent, j’utilisais Ansible simultanément en tant qu’outil de déploiement de logiciel et aussi comme logiciel de « Configuration Management ».&lt;/p&gt;
&lt;p&gt;Je m’explique :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A partir d’un template de machine virtuelle, je suis capable de déployer une configuration par défaut en fonction du rôle de la machine (au sens large du terme, que ce soit des fichiers ou de l’installation de packages).&lt;/li&gt;
&lt;li&gt;Si jamais une modification de la configuration est faite, je suis capable de « pousser » cette modification sur toutes les machines d’un seul coup.&lt;/li&gt;
&lt;li&gt;Et enfin, si jamais des modifications ont été réalisées (par exemple en cas d’erreur) sur une partie de mes machines, je suis capable de « corriger » tous les serveurs « non-compliant » SANS TOUCHER à ceux qui le sont (car mes playbooks sont idempotent, comme mon module pour &lt;a class="link" href="https://blog.zwindler.fr/2016/12/20/ansible-module-clapi-centreon/" &gt;centreon&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/11/73068978.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Pour autant, j’étais frustré de ne pas avoir encore trouvé le moyen d’aller encore un peu plus loin : provisionner les machines directement depuis Ansible.&lt;/p&gt;
&lt;h2 id="pourquoi-ça-coince"&gt;Pourquoi ça coince
&lt;/h2&gt;&lt;p&gt;2 obstacles majeurs m&amp;rsquo;empêchaient d’aller au bout de la démarche.&lt;/p&gt;
&lt;h3 id="gather-facts"&gt;Gather facts
&lt;/h3&gt;&lt;p&gt;D’abord parce que par défaut, si vous donnez une liste de serveurs à Ansible dans votre inventaire avec pour but de les déployer, Ansible va tenter de les se connecter à ces machines&amp;hellip; qui n’existent pas encore !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-playbook -l 192.168.100.103 zwindler_deploy.yml
PLAY [xxxxxxaaaaaaaaaaa] ********************************************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************************************************************
fatal: [192.168.100.103]: UNREACHABLE! =&amp;gt; {&amp;#34;changed&amp;#34;: false, &amp;#34;msg&amp;#34;: &amp;#34;Failed to connect to the host via ssh: ssh: connect to host 192.168.100.103 port 22: No route to host\r\n&amp;#34;, &amp;#34;unreachable&amp;#34;: true}
PLAY RECAP **********************************************************************************************************************************************************************************
192.168.100.103 : ok=0 changed=0 unreachable=1 failed=0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans ce cas précis, il faut donc dire à Ansible de ne pas essayer de s’y connecter dans un premier temps. J’ai mis un moment à trouver. Dans certains cas (comme pour &lt;a class="link" href="https://blog.zwindler.fr/2016/12/07/automatisation-de-la-supervision-avec-centreon-et-ansible-3/" &gt;alimenter un serveur centreon avec CLAPI&lt;/a&gt;), j’ai utilisé la fonction &lt;strong&gt;delegate_to&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Mais le mieux dans le cas présent consiste à utiliser les options suivantes au début de votre playbook :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;gather_facts: false
connection: local
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Grâce à ces deux options, vous pourrez indiquer à Ansible de ne pas faire l’opération &lt;strong&gt;gather_facts&lt;/strong&gt;, étape préliminaire à l’exécution de tout playbook, et de ne même pas essayer de se connecter sur les futurs serveurs mais de tout exécuter localement.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Problem solved.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="vsphere_guest-versus-vmware_guest"&gt;vsphere_guest versus vmware_guest
&lt;/h3&gt;&lt;p&gt;Mon deuxième problème était qu’il existe 2 groupes de modules pour VMware dans les modules Ansible, et que l’un des deux est abandonné ! Et bien sûr comme c’est le plus ancien, c’est celui qui remonte le plus dans les exemples/articles sur Internet ;-).&lt;/p&gt;
&lt;p&gt;Dans un premier temps, j’avais fais des tests avec &lt;a class="link" href="https://docs.ansible.com/ansible/latest/collections/community/vmware/vmware_guest_module.html" target="_blank" rel="noopener"
&gt;vsphere_guest&lt;/a&gt;. Bien que « fonctionnel », ce module intégré à la suite Ansible en version 1.6 nécessite en dépendance python et surtout &lt;strong&gt;pysphere&lt;/strong&gt;. Or, &lt;a class="link" href="https://github.com/argos83/pysphere" target="_blank" rel="noopener"
&gt;pysphere&lt;/a&gt; n’est plus maintenu depuis 2013 !&lt;/p&gt;
&lt;p&gt;Dans l’absolu, on peut très bien utiliser &lt;strong&gt;vsphere_guest&lt;/strong&gt; pour provisionner des machines virtuelles. La dernière version normalement pour vSphere 5.0 fonctionne parfaitement sur vSphere 6.X. Un très bon exemple de ce que vous pouvez faire avec ce module est expliqué dans un article de &lt;a class="link" href="http://everythingshouldbevirtual.com/creating-vsphere-vms-using-ansible" target="_blank" rel="noopener"
&gt;EverythingShouldBeVirtual&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pour autant, vous ne pourrez pas :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Réaliser de modifications sur la machine virtuelle si vous la copiez depuis un template&lt;/li&gt;
&lt;li&gt;Réaliser des customisations côté OS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Personnellement, je travaille massivement avec des templates, qui sont ensuite agrémentés par des customisations via des playbooks Ansible. Mais j’ai besoin de customiser ces templates en fonction du contexte et je rechigne à faire la modification en 2 étapes. De plus, une fois déployée, j’ai quand même besoin de passer manuellement sur chacune des machines pour leur donner une adresse IP et un hostname unique par exemple.&lt;/p&gt;
&lt;p&gt;Heureusement, VMware ne s’est pas contenté du VIPerl et de PowerCLI ! Depuis quelques années, il existe un module Python, maintenu par VMware, et qui est régulièrement étendu avec les nouvelles fonctionnalités de l’API : &lt;a class="link" href="https://github.com/vmware/pyvmomi" target="_blank" rel="noopener"
&gt;pyvmomi&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A partir de cet API python, un module Ansible plus récent a donc été créé, et vous allez le voir, les possibilités sont bien plus étendues.&lt;/p&gt;
&lt;h2 id="et-la-lumière-fut"&gt;Et la lumière fut
&lt;/h2&gt;&lt;p&gt;La liste des modules Ansible qui utilisent le module pyvmomi est assez impressionnant. Il s’agit de tous les modules qui commencent par &lt;strong&gt;vmware_&lt;/strong&gt; (vous pouvez trouver la liste sur la &lt;a class="link" href="https://docs.ansible.com/ansible/2.9/modules/list_of_cloud_modules.html" target="_blank" rel="noopener"
&gt;documentation officielle d’Ansible&lt;/a&gt;, dans la section VMware).&lt;/p&gt;
&lt;p&gt;Deux d’entre eux ont particulièrement retenus mon attention, même s’il y en a plein d’autres intéressants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.ansible.com/ansible/latest/collections/community/vmware/vmware_guest_module.html" target="_blank" rel="noopener"
&gt;vmware_guest&lt;/a&gt; qui permet de gérer les machines virtuelle&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.ansible.com/ansible/latest/collections/community/vmware/vmware_vm_shell_module.html" target="_blank" rel="noopener"
&gt;vmware_vm_shell&lt;/a&gt; qui permet d’exécuter des commandes directement sur l’OS invité de la VM (si elle dispose des VMware Tools)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="prérequis"&gt;Prérequis
&lt;/h3&gt;&lt;p&gt;Pour exécuter ces modules, vous avez besoin de 2 choses :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;pyvmomi&lt;/strong&gt; et ces dépendances (python 2.6+ et sphinx)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pip install pyvmomi sphinx
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ansible 2.2&lt;/strong&gt; minimum (mais plutôt 2.3 voire 2.4 !)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;del datetime="2017-06-20T14:31:16+00:00"&gt;Sur le papier, le module « fonctionne » avec Ansible 2.2, l’actuelle version stable que vous pourrez trouvez sur tous les dépôts. Sauf que la plupart des fonction intéressantes n’apparaissent qu’avec la version 2.3 d’Ansible, pour l’instant uniquement disponible si vous compilez les sources !~~&lt;/p&gt;
&lt;p&gt;La version disponible en ce moment est la 2.3.1. Il n’est donc plus nécessaire de compiler les sources, SAUF si vous voulez utiliser les nouvelles fonctionnalités du modules introduites dans la 2.4. Je laisse la procédure de compilation en fin d’article.&lt;/p&gt;
&lt;h2 id="et-maintenant-le-playbook-"&gt;Et maintenant le playbook !
&lt;/h2&gt;&lt;p&gt;Voici un exemple de playbook qui :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prompte pour un mot de passe administrateur pour se connecter au vCenter&lt;/li&gt;
&lt;li&gt;Déploie une machine virtuelle depuis template&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce déploiement dépend d’un certain nombre de variables qui peuvent être renseignées dans le fichier hosts tels que :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;la taille du disque virtuel&lt;/li&gt;
&lt;li&gt;le nombre de vCPU&lt;/li&gt;
&lt;li&gt;la quantité de vRAM&lt;/li&gt;
&lt;li&gt;l’ESXi ou le datastore destination&lt;/li&gt;
&lt;li&gt;l’adresse IP de la VM&lt;/li&gt;
&lt;li&gt;Une fois la VM créée, l’adresse IP et le hostname est configurée dans l’OS invité&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat zwindler_vmware_add_normal.yml
---
- hosts: all
gather_facts: false
connection: local
vars_prompt:
- name: &amp;#34;vsphere_password&amp;#34;
prompt: &amp;#34;vSphere Password&amp;#34;
- name: &amp;#34;notes&amp;#34;
prompt: &amp;#34;VM notes&amp;#34;
private: no
default: &amp;#34;Deployed with ansible&amp;#34;
tasks:
# get date
- set_fact: creationdate=&amp;#34;{{lookup(&amp;#39;pipe&amp;#39;,&amp;#39;date &amp;#34;+%Y/%m/%d %H:%M&amp;#34;&amp;#39;)}}&amp;#34;
# Create a VM from a template
- name: create the VM
vmware_guest:
hostname: &amp;#39;{{ vsphere_host }}&amp;#39;
username: &amp;#39;{{ vsphere_user }}&amp;#39;
password: &amp;#39;{{ vsphere_password }}&amp;#39;
validate_certs: no
esxi_hostname: esxi_server
datacenter: &amp;#39;ZWINDLER&amp;#39;
folder: A_DEPLOYER
name: &amp;#39;{{ inventory_hostname }}&amp;#39;
state: poweredon
guest_id: rhel7_64Guest
annotation: &amp;#34;{{ notes }} - {{ creationdate }}&amp;#34;
disk:
- size_gb: 150
type: thin
datastore: &amp;#39;{{ vsphere_datastore }}&amp;#39;
networks:
- name: server_network
ip: &amp;#39;{{ custom_ip }}&amp;#39;
netmask: 255.255.252.0
gateway: 192.168.100.1
dns_servers:
- 192.168.100.10
- 192.168.101.10
hardware:
memory_mb: 4096
num_cpus: 2
customization:
dns_servers:
- 192.168.100.10
- 192.168.101.10
domain : zwindler.fr
hostname: &amp;#39;{{ inventory_hostname }}&amp;#39;
template: tmpl-rhel-7-3-app
wait_for_ip_address: yes
- name: add to ansible hosts file
lineinfile:
dest: /etc/ansible/hosts
insertafter: &amp;#39;^\[{{ ansible_host_group }}\]&amp;#39;
line: &amp;#39;{{ inventory_hostname }}&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir là, vous pouvez tout faire :)&lt;/p&gt;
&lt;p&gt;Juste une petite limitation que je n’ai malheureusement pas encore pu contourner : à la suite de la création de la VM, vous ne pourrez pas « enchainer » sur un autre playbook (par exemple pour vous connecter sur la machine pour ajouter un service). Vous devrez passez par un second playbook.&lt;/p&gt;
&lt;p&gt;La raison principale à ceci est qu’on a spécifié « connection local » et « gather facts » à faux pour que ça ne plante pas au début. Du coup le playbook ne s’exécuterait pas sur la bonne machine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EDIT : &lt;a class="link" href="https://blog.zwindler.fr/2017/11/14/deployer-vm-vmware-ansible-part-2/" &gt;la solution à ce problème est disponible sur l’article suivant&lt;/a&gt; !&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="liens-utiles"&gt;Liens utiles
&lt;/h2&gt;&lt;p&gt;Le module pause peut être utile dans certain cas, même si je n’en suis pas fan dans un environnement type « production ».&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/pause_module.html" target="_blank" rel="noopener"
&gt;docs.ansible.com/ansible/pause_module.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Également, je vais bientôt faire un article sur le module dédié a Proxmox dans les semaines qui viennent !!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.ansible.com/ansible/latest/collections/community/general/proxmox_kvm_module.html" target="_blank" rel="noopener"
&gt;docs.ansible.com/ansible/proxmox_kvm_module.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="nouvelles-fonctionnalités"&gt;Nouvelles fonctionnalités
&lt;/h2&gt;&lt;p&gt;En attendant donc que la &lt;del datetime="2017-06-20T14:31:16+00:00"&gt;2.3~~ 2.4 soit distribuée partout, voici l’erreur que vous risquez d’avoir si vous utilisez les fonctions &lt;strong&gt;linked_clone&lt;/strong&gt; ou &lt;strong&gt;snapshot_src&lt;/strong&gt; :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-playbook zwindler_vmware_add_micro.yml
vSphere Password:
VM notes [Deployed with ansible]:
PLAY [ansible_node] **********************************************************
TASK [create the VM] ***********************************************************
fatal: [ansible_node]: FAILED! =&amp;gt; {&amp;#34;changed&amp;#34;: false, &amp;#34;failed&amp;#34;: true, &amp;#34;msg&amp;#34;: &amp;#34;unsupported parameter for module: linked_clone&amp;#34;}
PLAY RECAP *********************************************************************
ansible_node : ok=0 changed=0 unreachable=0 failed=1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Voici la marche suivre pour compiler et installer la version 2.4 d’Ansible via les sources :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;git clone https://github.com/ansible/ansible
cd ansible
make
make install
ansible --version
ansible 2.4.0
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Réinventons la roue : j’automatise des actions via SSH+mdp avec un script expect</title><link>https://blog.zwindler.fr/2016/08/11/reinventons-roue-jautomatise-actions-via-sshmdp-script-expect/</link><pubDate>Thu, 11 Aug 2016 17:30:13 +0000</pubDate><guid>https://blog.zwindler.fr/2016/08/11/reinventons-roue-jautomatise-actions-via-sshmdp-script-expect/</guid><description>&lt;img src="https://blog.zwindler.fr/2016/08/expect.webp" alt="Featured image of post Réinventons la roue : j’automatise des actions via SSH+mdp avec un script expect" /&gt;&lt;h2 id="dans-quels-cas-ne-pas-utiliser-ce-script-expect"&gt;Dans quels cas ne pas utiliser ce script expect
&lt;/h2&gt;&lt;p&gt;Attention : je met en ligne ce script juste pour information. Cela peut aussi être utile si vous avez un besoin spécifique qui nécessite l’utilisation du binaire &lt;strong&gt;expect.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Si vous avez très rapidement besoin de réaliser sur un ensemble de serveur un tâche répétitive via SSH, le mieux est de jeter un œil vers &lt;strong&gt;Ansible&lt;/strong&gt;. Les modules sont nombreux, les possibilités infinies, la facilité du langage déconcertante. Et contrairement aux autres (puppet, chef, salt), c’est sans agent !&lt;/p&gt;
&lt;h2 id="alors-pourquoi-jai-pris-du-temps-pour-développer-un-script-expect-"&gt;Alors pourquoi j’ai pris du temps pour développer un script expect ?
&lt;/h2&gt;&lt;p&gt;Il y a deux ans, j’ai été chargé de réaliser une petite étude sur Puppet, un gestionnaire de configuration qui permet de définir un standard pour un groupe de machine. Un exemple simple est la gestion du NTP. En prenant le temps d’apprendre, on peut assez facilement définir sous Puppet un template qui stipule que tous les serveurs Linux doivent avoir le démon NTPd installé et opérationnel avec le bon fichier de configuration.&lt;/p&gt;
&lt;p&gt;Pour autant, la nécessité de déployer des agents sur des centaines de serveurs et le langage un peu pompeux (pour le néophyte que j’étais) m’avait freiné. Car bien sûr, j’avais besoin TOUT de suite de quelque chose d’opérationnel, je n’avais pas le temps de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mettre en production un serveur puppet&lt;/li&gt;
&lt;li&gt;Déployer les agents sur les machines&lt;/li&gt;
&lt;li&gt;Tester mes templates avant de passer la modification sur tous les serveurs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Une solution simple aurait été de déposer une clé SSH sur tous les serveurs et de réaliser une simple boucle. Dans le même temps, certains de mes collègues étaient en train de travailler sur ce sujet précis. Pour préserver la paix de l’openspace, je ne souhaitais pas leur marcher sur les pieds.&lt;/p&gt;
&lt;p&gt;Pour résoudre dans l’immédiat mon problème, j’ai utilisé &lt;strong&gt;expect&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="we-do-not-forgive-we-do-not-forget-"&gt;« We do not forgive, we do not forget, &amp;hellip; »
&lt;/h2&gt;&lt;p&gt;Pour ceux qui ne connaissent pas l’outil, il s’agit d’un binaire qui permet d’automatiser des tâches en fonction du retour renvoyé par le terminal. Cela peut être utile pour réaliser un ensemble de tâche sur via des outils tels que FTP (ou &lt;a class="link" href="https://web.archive.org/web/20240301182514/https://blog.info16.fr/index.php?article61/scripter-des-commandes-a-distance-expect" target="_blank" rel="noopener"
&gt;TFTP pour des switchs dans cet exemple (lien mort, j&amp;rsquo;utilise Internet Archive)&lt;/a&gt;). Et un script bash classique dans lequel vous ne pourrez **pas ** entrer un mot de passe (le prompt du mot de passe nécessite un « vrai » terminal). Expect lui peut le faire.&lt;/p&gt;
&lt;p&gt;Deuxième avantage d’expect, il existe un langage de script qui permet d’automatiser relativement facilement vos actions avec des structures conditionnelles de base. J’ai rédigé un script qui m’a permis de copier des fichiers sur un liste de triplet de type &lt;em&gt;hostname;username&lt;/em&gt;;&lt;em&gt;password&lt;/em&gt;;.&lt;/p&gt;
&lt;p&gt;Je l’ai &lt;a class="link" href="https://github.com/zwindler/expect.us" target="_blank" rel="noopener"
&gt;mis à disposition sur Github&lt;/a&gt; et voici comment cela fonctionne.&lt;/p&gt;
&lt;p&gt;Dans cet exemple je modifie le fichier repository yum sur un (seul) serveur distant et je nettoie le cache de yum.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;./expect.us scp serveur_distant root votremotdepasseenclair source/newrepo_el7.1.repo /etc/yum.repos.d/newrepo_el7.1.repo
./expect.us ssh serveur_distant root votremotdepasseenclair &amp;#34;yum clean all&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et dans cet exemple, le met à jour le fichier resolv.conf sur une liste de serveur avec un csv&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#!/bin/bash
for line in `cat expect_dns_no_nm.csv`
do
hostname=`echo $line | cut -d&amp;#34;;&amp;#34; -f1`
username=`echo $line | cut -d&amp;#34;;&amp;#34; -f2`
password=`echo $line | cut -d&amp;#34;;&amp;#34; -f3`
./expect.us ssh $hostname $username $password &amp;#34;cp /etc/resolv.conf /etc/resolv.conf.20151103&amp;#34;
./expect.us scp $hostname $username $password source/resolv.conf /etc/resolv.conf
done
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="le-mot-de-la-fin"&gt;Le mot de la fin
&lt;/h2&gt;&lt;p&gt;Entre le moment où j’ai écris le script et aujourd’hui où j’écris cet article (oui j’ai toujours du retard), j’ai découvert Ansible. Quand j’écrivais expect.us je savais que je réinventais la roue.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Depuis que j’utilise Ansible mon travail au quotidien a complètement changé.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Dans le cas où vous souhaitez automatiser des tâches et que vous êtes pressés par le temps, allez absolument voir Ansible.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Piloter Nagios (API) à travers le nagios.cmd</title><link>https://blog.zwindler.fr/2016/07/21/piloter-nagios-api-a-travers-nagios-cmd/</link><pubDate>Thu, 21 Jul 2016 12:00:55 +0000</pubDate><guid>https://blog.zwindler.fr/2016/07/21/piloter-nagios-api-a-travers-nagios-cmd/</guid><description>&lt;img src="https://blog.zwindler.fr/2015/07/nagios1.webp" alt="Featured image of post Piloter Nagios (API) à travers le nagios.cmd" /&gt;&lt;h2 id="i-command-thee-nagios"&gt;I command thee, Nagios
&lt;/h2&gt;&lt;p&gt;Pas la peine de vous faire l’affront de vous présenter Nagios ! Si vous tombez sur cet article, c’est probablement que vous connaissez déjà l’outil et que vous cherchez juste à automatiser des tâches à l’aide d’une API ou d’un CLI pour étendre les fonctionnalités par défaut.&lt;/p&gt;
&lt;p&gt;Car au delà de la configuration manuelle par fichier de configuration (ou via une interface web si vous utilisez Centreon par exemple), et l’interface web, il y a peu de moyens pour interagir avec Nagios.&lt;/p&gt;
&lt;p&gt;Par manque de documentation, je me souviens avoir notamment galéré pour récupérer des statistiques de santé de Nagios. Alors qu’en fait il existe un binaire &lt;strong&gt;nagiostats&lt;/strong&gt; ! Même s’il n’est pas forcément super facilement exploitable, c’est quand même un bon début&amp;hellip;&lt;/p&gt;
&lt;p&gt;Et donc, même si ce n’est pas du tout mis en avant par Nagios, OUI, il existe une méthode pour interagir avec le processus Nagios via des lignes de commandes. Mais je vous préviens tout de suite, il va falloir fouiller les docs archivées !&lt;/p&gt;
&lt;h2 id="petite-explication-de-la-façon-dont-nagios-fonctionne"&gt;Petite explication de la façon dont Nagios fonctionne
&lt;/h2&gt;&lt;p&gt;Nagios est une application monolithique écrite en C. L’interface graphique de Nagios est présentée par un serveur web apache à l’aide de scripts CGI. Je ne sais pas si le fait que l’interface de Nagios soit si &amp;hellip; « austère » (qui à dit « moche » ?) est une limitation liée aux choix technologique ou un réel choix ergonomique.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/07/nagios.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Troll à part, il faut comprendre que par défaut, il n’y a pas de méthode native pour faire communiquer Apache et l’application en C. La méthode la plus simple sous Unix consiste alors à passer par un fichier particulier : un pipe nommé. Sans rentrer dans les détails techniques :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;L’utilisateur clique sur un lien lié à une action (comme acquitter une alerte)&lt;/li&gt;
&lt;li&gt;D’un côté, le script CGI écrit des commandes dans ce fichier fictif qu’est le pipe nommé&lt;/li&gt;
&lt;li&gt;De l’autre, au lieu que les commandes soient écrites sur disques, elles sont envoyées directement dans le processus Nagios qui les interprété.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="eurêka-jai-trouvé-mon-premier-exemple-"&gt;Eurêka, j’ai trouvé mon premier exemple !
&lt;/h2&gt;&lt;p&gt;A partir de là, on a trouvé la solution. Il est donc possible d’émuler le comportement de la GUI pour réaliser des actions en ligne de commande. Il suffit d’écrite dans le pipe nommé la bonne commande.&lt;/p&gt;
&lt;p&gt;Forcément, on est par contre limité aux actions qu’on pourrait faire via la GUI. Typiquement, vous ne pourrez pas faire un script pour ajouter  des hôtes à chaud. Ce type d’actions ne sont possibles qu’en modifiant la configuration texte, pas de miracle&amp;hellip;&lt;/p&gt;
&lt;p&gt;Ça peut quand même être très utile. En astreinte, des administrateurs (rebelles) désactivaient les notifications des services qui les dérangeaient&amp;hellip; Les fourbes ! Voilà un petit script pour réactiver tous les mardi matin les alertes appartenant au groupe de services « Services en astreinte ».&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#!/bin/bash
#Script permettant de reactiver les notifications Nagios des services du groupe
#&amp;#34;Service_en_Astreinte&amp;#34; au cas ou elles auraient ete desactivees
################################################################################
now=`date +%s`
COMMANDFILE=&amp;#39;/usr/local/nagios/var/rw/nagios.cmd&amp;#39;
SERVICEGROUP=&amp;#39;Services_en_Astreinte&amp;#39;
/usr/bin/printf &amp;#34;[%lu] ENABLE_SERVICEGROUP_SVC_NOTIFICATIONS;$SERVICEGROUP\n&amp;#34; $now &amp;gt; $COMMANDFILE
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et un petit cron&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# Reinitialisation des notifications sur le groupe Service_en_astreinte (le mardi en HO)
30 10 * * 2 /scripts/reset_production_notifications.sh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour trouver la liste des commandes disponibles, vous pouvez soit cliquer sur tous les boutons de l’interface graphique tout en surveillant le nagios.log (c’est comme ça que j’ai trouvé mes premières commandes ;-)), soit fouiller le site de Nagios pour retrouver les archives de la v2.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://old.nagios.org/developerinfo/externalcommands/commandlist.php" target="_blank" rel="noopener"
&gt;old.nagios.org/developerinfo/externalcommands/commandlist.php&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="deuxième-exemple"&gt;Deuxième exemple
&lt;/h2&gt;&lt;p&gt;En fouillant le site, je suis tombé sur une autre commande qui m’a paru très utile. Après avoir installé un nouveau site, j’ai voulu vérifier que l’envoi des notifications fonctionnaient bien sur les services important. Pour le tester, j’aurai pu créer un service à positionner exprès en CRITICAL. Cependant je préfère cette solution qui se base sur la commande SEND_CUSTOM_SVC_NOTIFICATION.&lt;/p&gt;
&lt;table class="Content" border="0" width="750"&gt;
&lt;tr&gt;
&lt;td class="LargeBold"&gt;
SEND_CUSTOM_SVC_NOTIFICATION
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="MediumBold"&gt;
Command Format:
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
SEND_CUSTOM_SVC_NOTIFICATION;;;;;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td class="MediumBold"&gt;
Description:
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Allows you to send a custom service notification. Very useful in dire situations, emergencies or to communicate with all admins that are responsible for a particular service. When the service notification is sent out, the $NOTIFICATIONTYPE$ macro will be set to « CUSTOM ». The field is a logical OR of the following integer values that affect aspects of the notification that are sent out: 0 = No option (default), 1 = Broadcast (send notification to all normal and all escalated contacts for the service), 2 = Forced (notification is sent out regardless of current time, whether or not notifications are enabled, etc.), 4 = Increment current notification # for the service(this is not done by default for custom notifications). The comment field can be used with the $NOTIFICATIONCOMMENT$ macro in notification commands.
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Et le script qui va avec :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#!/bin/sh
now=`date +%s`
commandfile=&amp;#39;/usr/local/nagios/var/rw/nagios.cmd&amp;#39;
/usr/bin/printf &amp;#34;[%lu] SEND_CUSTOM_SVC_NOTIFICATION;SERVER1;/var;0;Test_notifier;Petit coucou de la part de ma nouvelle installation!\n&amp;#34; $now &amp;gt; $commandfile
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Avec ce petit script, j’ai bien reçu ma notification de la part du service /var de SERVER1 !&lt;/p&gt;
&lt;p&gt;Il y a bien sûr plein d’autres scripts qu’on peut imaginer, avec les actions sur les acquittements, les commentaires, les rechecks, les actions externes, &amp;hellip; Je vous laisse y penser !&lt;/p&gt;</description></item></channel></rss>