<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Template on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/template/</link><description>Recent content in Template on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr-fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Wed, 21 Nov 2018 12:45:40 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/template/index.xml" rel="self" type="application/rss+xml"/><item><title>Récupérer les informations sur la distribution avec les facts Ansible</title><link>https://blog.zwindler.fr/2018/11/21/recuperer-les-informations-sur-la-distribution-avec-les-facts-ansible/</link><pubDate>Wed, 21 Nov 2018 12:45:40 +0000</pubDate><guid>https://blog.zwindler.fr/2018/11/21/recuperer-les-informations-sur-la-distribution-avec-les-facts-ansible/</guid><description>&lt;img src="https://blog.zwindler.fr/2018/10/ansible_logo.webp" alt="Featured image of post Récupérer les informations sur la distribution avec les facts Ansible" /&gt;&lt;h2 id="les-facts-dansible"&gt;Les facts d’Ansible
&lt;/h2&gt;&lt;p&gt;Si vous suivez le blog, vous savez que &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=ansible" &gt;j’utilise énormément Ansible&lt;/a&gt;. J’ai même été faire un &lt;a class="link" href="https://blog.zwindler.fr/2018/11/09/bdx-i-o-2018-ami-developpeur-deviens-un-ops-sans-effort-avec-ansible" &gt;talk sur le sujet à BDX I/O 2018, à l’ENSEIRB&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Aujourd’hui, plutôt que de vous donner un playbook tout fait pour installer sans effort une des multiples applications dont j’ai automatisé le déploiement avec Ansible, je vous propose d’explorer une des features les plus importantes et utiles d’Ansible, les &lt;strong&gt;facts&lt;/strong&gt;, par le biais d’un petit exemple.&lt;/p&gt;
&lt;h2 id="cest-quoi-les-facts-dans-ansible"&gt;C’est quoi les facts dans Ansible
&lt;/h2&gt;&lt;p&gt;Si vous avez déjà lancé un playbook, vous avez sûrement remarqué lors de son exécution, que la première tâche qui est réalisée n’est pas une tâche que vous avez demandée explicitement.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-playbook -i inventory/prod/blop -u blop --private-key=blop.key configure-blop.yml
[...]]
TASK [Gathering Facts] *********************************************************
ok: [blop-vm1]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Cette tâche &lt;strong&gt;[Gathering Facts]&lt;/strong&gt;, qui ne fait à première vue rien, correspond en fait à la connexion à la ou les machines sur lesquelles seront exécutées les playbooks. Si la connexion échoue, le playbook échouera sur cette cible, et continuera éventuellement sur les autres (s’il en reste). Si l’hôte répond, alors Ansible en profite pour récupérer moult informations en rapport avec cette machines et les stockent dans une variable &lt;strong&gt;ansible_facts&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="a-quoi-ça-ressemble-"&gt;A quoi ça ressemble ?
&lt;/h2&gt;&lt;p&gt;Comme je ne disais, à première vue, cette commande de fait rien. Si on ne sait pas qu’elle stocke des informations dans une variables, on ne peut rien en faire.&lt;/p&gt;
&lt;p&gt;Un bon moyen d’avoir un premier aperçu de ce qu’on peut en faire est de les afficher. On peut faire ça avec &lt;a class="link" href="http://docs.ansible.com/ansible/latest/collections/ansible/builtin/setup_module.html" target="_blank" rel="noopener"
&gt;le module « setup »&lt;/a&gt;, qui est en réalité le même module qui est appelé lors de l’étape &lt;strong&gt;[Gathering facts]&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Le retour se fera au format JSON, ce qui est certes peu digeste, mais facilitera grandement les manipulations de type « filtre » (via le flag filter intégré ou via l’utilitaire &lt;strong&gt;jq&lt;/strong&gt; par exemple).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible blop-vm1 i inventory/prod/blop -m setup
blop-vm1 | SUCCESS =&amp;gt; {
&amp;#34;ansible_facts&amp;#34;: {
&amp;#34;ansible_all_ipv4_addresses&amp;#34;: [
&amp;#34;10.1.1.10&amp;#34;
],
&amp;#34;ansible_apparmor&amp;#34;: {
&amp;#34;status&amp;#34;: &amp;#34;enabled&amp;#34;
},
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Je ne vous copie-colle pas tout, rien que pour cette machine, j’ai 719 lignes&amp;hellip; La quantité d’informations disponible est impressionnante, et on peut même en venir à se demander à quoi ça va bien pouvoir nous servir.&lt;/p&gt;
&lt;h2 id="ok-on-en-fait-quoi-"&gt;Ok, on en fait quoi ?
&lt;/h2&gt;&lt;p&gt;Du coup je profite de cet article pour faire un tuto tout simple et qui peut être utile dans de nombreux cas, réaliser des opérations différentes en fonction de la distribution de la machine concernée.&lt;/p&gt;
&lt;p&gt;L’information qui va nous intéresser ici concerne donc les remontées en tant que « nom » ou « version » d’une distribution. Je vais vous économiser la lecture de nos 700+ lignes, et vous indiquer que vous pouvez trouver ces informations en filtrant sur les mots clés « ansible_distribution&amp;hellip; » et « ansible_os&amp;hellip; »&lt;/p&gt;
&lt;p&gt;Voilà ce qu’on pourrait obtenir sur une machine CentOS :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible blop-vm1 -m setup -a &amp;#39;filter=ansible_distribution*&amp;#39;
blop-vm1 | SUCCESS =&amp;gt; {
&amp;#34;ansible_facts&amp;#34;: {
&amp;#34;ansible_distribution&amp;#34;: &amp;#34;CentOS&amp;#34;,
&amp;#34;ansible_distribution_major_version&amp;#34;: &amp;#34;7&amp;#34;,
&amp;#34;ansible_distribution_release&amp;#34;: &amp;#34;Core&amp;#34;,
&amp;#34;ansible_distribution_version&amp;#34;: &amp;#34;7.2.1511&amp;#34;
},
&amp;#34;changed&amp;#34;: false
}
ansible blop-vm1 -m setup -a &amp;#39;filter=ansible_os_family&amp;#39;
blop-vm1 | SUCCESS =&amp;gt; {
&amp;#34;ansible_facts&amp;#34;: {
&amp;#34;ansible_os_family&amp;#34;: &amp;#34;RedHat&amp;#34;
},
&amp;#34;changed&amp;#34;: false
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et sur une machine Ubuntu :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible blop-vm2 -m setup -a &amp;#39;filter=ansible_distribution*&amp;#39;
ansible blop-vm2 | SUCCESS =&amp;gt; {
&amp;#34;ansible_facts&amp;#34;: {
&amp;#34;ansible_distribution&amp;#34;: &amp;#34;Ubuntu&amp;#34;,
&amp;#34;ansible_distribution_file_parsed&amp;#34;: true,
&amp;#34;ansible_distribution_file_path&amp;#34;: &amp;#34;/etc/os-release&amp;#34;,
&amp;#34;ansible_distribution_file_variety&amp;#34;: &amp;#34;Debian&amp;#34;,
&amp;#34;ansible_distribution_major_version&amp;#34;: &amp;#34;16&amp;#34;,
&amp;#34;ansible_distribution_release&amp;#34;: &amp;#34;xenial&amp;#34;,
&amp;#34;ansible_distribution_version&amp;#34;: &amp;#34;16.04&amp;#34;
},
&amp;#34;changed&amp;#34;: false
}
ansible blop-vm2 -m setup -a &amp;#39;filter=ansible_os*&amp;#39;
blop-vm2 | SUCCESS =&amp;gt; {
&amp;#34;ansible_facts&amp;#34;: {
&amp;#34;ansible_os_family&amp;#34;: &amp;#34;Debian&amp;#34;
},
&amp;#34;changed&amp;#34;: false
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="utiliser-les-facts-dans-un-playbook"&gt;Utiliser les facts dans un playbook
&lt;/h2&gt;&lt;p&gt;Pour continuer dans l’exemple, on va faire une chose qu’il ne faut jamais faire : désactiver le firewall et SELinux.&lt;/p&gt;
&lt;p&gt;Imaginons que vous souhaitiez quand même le faire. Si vous lancez ce playbook sur tout votre parc et qu’il n’est pas homogène, vous allez tomber sur des groupes de machines Ubuntu, CentOS 5, 6, 7&amp;hellip;&lt;/p&gt;
&lt;p&gt;Un moyen de gérer les cas particuliers pourrait être de les classer tous vos hosts dans des groupes, et de créer un playbook pour chaque OS/version, restreint à un groupe de machines uniquement.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;---
- hosts: rhelcentos6only
tasks:
[…]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ce n’est d’ailleurs pas une mauvaise idée, surtout pour gérer les distrib aussi différentes que RHEL et Ubuntu par exemple.&lt;/p&gt;
&lt;p&gt;En revanche, dans le cas de RHEL, on a des différences qui apparaissent à partir de la RHEL 7, notamment la gestion du Firewall qui passe de IPtables à firewalld.&lt;/p&gt;
&lt;p&gt;On va donc faire appel à la clause &lt;strong&gt;when:&lt;/strong&gt; de ansible, qui conditionne l’exécution d’une tâche (ou d’un rôle ou d’un block) à une validation. Et ça donnerait quelque chose comme ça :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;---
- hosts: rhelcentos6only
tasks:
- name: &amp;#34;shutdown and disable IPtables for RHEL &amp;lt;= 6&amp;#34;
service:
name=iptables
state=stopped
enabled=no
when: (ansible_distribution == &amp;#34;CentOS&amp;#34; or ansible_distribution == &amp;#34;RedHat&amp;#34;) and
(ansible_distribution_major_version &amp;lt;= &amp;#34;6&amp;#34;)
- name: &amp;#34;shutdown and disable firewalld for RHEL &amp;gt;= 7&amp;#34;
service:
name=firewalld
state=stopped
enabled=no
when: (ansible_distribution == &amp;#34;CentOS&amp;#34; or ansible_distribution == &amp;#34;RedHat&amp;#34;) and
(ansible_distribution_major_version &amp;gt;= &amp;#34;7&amp;#34;)
- name: &amp;#34;disable selinux&amp;#34;
selinux:
state=disabled
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans cet exemple, lors de l’exécution du playbook, on aura donc, pour chaque VM CentOS ou RHEL, une tâche qui sera exécutée, et l’autre qui sera marquée « skipping » (en bleu clair) et le playbook marchera pour toutes les RHEL, quelque soit leur version.&lt;/p&gt;
&lt;h2 id="aller-plus-loin"&gt;Aller plus loin
&lt;/h2&gt;&lt;p&gt;Il existe une page spécifique sur la documentation d’Ansible pour parler des conditions dans les playbooks, accessible à l’adresse suivante : &lt;a class="link" href="https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_conditionals.html" target="_blank" rel="noopener"
&gt;https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_conditionals.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Vous pouvez aussi utiliser les facts dans les options des tasks, et dans les templates, en encadrant le nom de la variable souhaitée avec des « doubles curly braces » : &lt;code&gt;{{ xxx }}&lt;/code&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;- command: &amp;#34;echo {{ ma_super_variable }}&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="sources"&gt;Sources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://docs.ansible.com/ansible/latest/collections/ansible/builtin/setup_module.html" target="_blank" rel="noopener"
&gt;docs.ansible.com/ansible/latest/collections/ansible/builtin/setup_module.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_conditionals.html" target="_blank" rel="noopener"
&gt;docs.ansible.com/ansible/latest/playbook_guide/playbooks_conditionals.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Déployer des VM VMware avec Ansible – part 2</title><link>https://blog.zwindler.fr/2017/11/14/deployer-vm-vmware-ansible-part-2/</link><pubDate>Tue, 14 Nov 2017 12:45:27 +0000</pubDate><guid>https://blog.zwindler.fr/2017/11/14/deployer-vm-vmware-ansible-part-2/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/03/ansible_vpshere.webp" alt="Featured image of post Déployer des VM VMware avec Ansible – part 2" /&gt;&lt;h2 id="où-est-ce-quon-en-était-"&gt;Où est ce qu’on en était ?
&lt;/h2&gt;&lt;p&gt;La dernière fois qu’on a parlé de [machines virtuelles déployées à l’aide d’Ansible sur une infrastructure VMware][1], on avait un playbook fonctionnel, mais il me manquait encore un petit quelque chose.&lt;/p&gt;
&lt;p&gt;En fait, à l’issue du déploiement de la VM, je n’avais pas encore trouvé la possibilité d’enchaîner sur l’exécution d’autres playbooks permettant de configurer la VM. L’objectif ultime étant de faire en une seule étape de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;déployer la VM (que j’appellerai « déploiement »)&lt;/li&gt;
&lt;li&gt;et de la configurer, c’est à dire modifier les fichiers de configuration de la VM, installer les logiciels, etc&amp;hellip; (que j’appellerai « configuration »).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="premier-problème-connectionlocal"&gt;Premier problème, connection:local
&lt;/h2&gt;&lt;p&gt;Pour rappel, le premier problème quand on veut déployer une VM qui n’existe pas encore&amp;hellip; est justement le fait qu’elle n’existe pas encore !&lt;/p&gt;
&lt;p&gt;Si j’exécute un playbook deploy_vm.yml sur une VM « ma-vm » tel quel, je vais me prendre un message d’erreur (&lt;a class="link" href="https://blog.zwindler.fr/2017/06/20/deployer-machines-virtuelles-ansible-vmware/" &gt;pour plus de détails, lire l’article précédent&lt;/a&gt;) car Ansible tente de se connecter à la machine pour récupérer des informations sur elle.&lt;/p&gt;
&lt;p&gt;La méthode pour s’affranchir de ce genre de problèmes est de feinter Ansible en lui disant :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;de ne pas récupérer les informations de la machine&lt;/li&gt;
&lt;li&gt;d’exécuter le playbook sur une autre machine (le plus simple c’est localhost)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pour le premier point, la solution est mettre en haut du playbook l’option &lt;strong&gt;gather_facts: false&lt;/strong&gt;. Cela aura un impact mais on verra ça plus loin.&lt;/p&gt;
&lt;p&gt;Pour le second point, il existe 2 solutions. La première, que je préconisais dans l’article précédent, consiste à utiliser en haut du playbook l’option &lt;strong&gt;connection: local&lt;/strong&gt;. Cette option permet d’exécuter l’ensemble du playbook sur la machine locale et non pas la machine qu’on déploie.&lt;/p&gt;
&lt;p&gt;En réalité, il est en fait plus simple d’utiliser l’option &lt;strong&gt;delegate_to&lt;/strong&gt;, qui se limite à une seule tâche ou à un rôle, ce qui permet de déléguer la partie déploiement à localhost, puis tenter d’exécuter les autres playbooks sur la VM qu’on veut configurer.&lt;/p&gt;
&lt;h2 id="un-problème-de-nom--pas-si-facile-à-résoudre"&gt;Un problème de nom &amp;hellip; pas si facile à résoudre
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Vous avez vu le jeu de mot ? Ok, je sors&amp;hellip;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Bien sûr, on va se heurter à plusieurs problèmes&amp;hellip; Le premier est la résolution de nom. A moins d’avoir réalisé la mise à jour de votre DNS à l’avance (à la main du coup&amp;hellip; c’est nul), dès que le déploiement sera terminé et qu’on passera à la partie configuration de la VM, Ansible essayera de contacter votre nouveau serveur.&lt;/p&gt;
&lt;p&gt;Le plus propre serait d’ajouter à la partie « déploiement » une tâche permettant de mettre à jour le DNS. Dans mon environnement professionnel, le service DNS est géré par un serveur Windows Active Directory. La simple mise à jour du DNS depuis Linux est un vrai casse tête et le plus simple est d’intégrer la machine (qu’elle soit Windows ou Linux) dans le domaine Active Directory qui se charge alors de mettre à jour le DNS lui même.&lt;/p&gt;
&lt;p&gt;C’est un gros sujet et je ferai un article à part dessus. Dans un premier temps on peut se contenter de juste mettre à jour le fichier &lt;strong&gt;/etc/hosts&lt;/strong&gt; de la machine localhost.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;- name: add to /etc/hosts file
lineinfile:
dest: /etc/hosts
line: &amp;#39;{{ custom_ip }} {{ inventory_hostname }} {{ inventory_hostname }}.zwindler.fr&amp;#39;
with_items: &amp;#39;{{play_hosts}}&amp;#39;
when: &amp;#34;hostvars[item].inventory_hostname == inventory_hostname&amp;#34;
delegate_to: localhost
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="accès-concurrents"&gt;Accès concurrents
&lt;/h3&gt;&lt;p&gt;Si vous vous y connaissez un peu en Ansible, vous remarquerez que je ne me suis pas contenté d’un simple &lt;strong&gt;lineinfile&lt;/strong&gt;, mais que j’ai utilisé un &lt;em&gt;with_items&lt;/em&gt; et un &lt;em&gt;when&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;En fait, on peut utiliser mon playbook pour déployer en parallèle un grand nombre de VMs en même temps. Le souci que j’ai rapidement eu a été un accès concurrent sur le fichier, et des noms de VMs ont alors manqué.&lt;/p&gt;
&lt;p&gt;Il existe une fonction « serial » qui permet de désactiver la parallélisation des tâches, mais malheureusement, on ne peut l’appliquer qu’au playbook entier. Peut être qu’un jour la fonctionnalité sera ajoutée (la demande est référencée sur &lt;a class="link" href="https://github.com/ansible/ansible/issues/1217" target="_blank" rel="noopener"
&gt;Github&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;J’ai donc du passer par une boucle pour enregistrer tous les serveurs du play courant.&lt;/p&gt;
&lt;h2 id="clé-ssh"&gt;Clé SSH
&lt;/h2&gt;&lt;p&gt;OK, maintenant, on sait résoudre la (ou les) machine(s) qu’on vient d’ajouter. Cependant on est pas sorti de l’auberge !&lt;/p&gt;
&lt;p&gt;En partant du principe que vous n’avez pas oublié de déposer la clé SSH du serveur &lt;em&gt;localhost&lt;/em&gt; pour qu’Ansible puisse se connecter sur votre nouvelle machine, voilà ce qui va se passer :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;TASK [gather facts] *************************************************************************************************************************************************************************
The authenticity of host &amp;#39;zwindler01 (x.x.x.x)&amp;#39; can&amp;#39;t be established.
Are you sure you want to continue connecting (yes/no)? The authenticity of host &amp;#39;zwindler02 (x.x.x.x)&amp;#39; can&amp;#39;t be established.
Are you sure you want to continue connecting (yes/no)? The authenticity of host &amp;#39;zwindler03 (x.x.x.x)&amp;#39; can&amp;#39;t be established.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ansible bloque à la première connexion SSH vers votre VM nouvellement crée car il faut accepter l&amp;rsquo;empreinte de chaque VM manuellement au préalable. Même si on essaye de renseigner &lt;strong&gt;yes&lt;/strong&gt; à toutes les questions, ce n’est clairement pas idéal et encore moins automatisé !&lt;/p&gt;
&lt;h3 id="la-solution-temporaire-host_key_checkingfalse"&gt;La solution temporaire, host_key_checking=False
&lt;/h3&gt;&lt;p&gt;Il existe un paramètre dans Ansible qui permet de passer outre la vérification de l&amp;rsquo;empreinte de la machine, soit en modifiant le fichier de configuration &lt;strong&gt;ansible.cfg&lt;/strong&gt;, soit ajouter un flag à l’exécution de playbook, soit configurer une variable d’environnement.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-playbook -l zwindler* -i hosts_deploy -e &amp;#39;host_key_checking=False&amp;#39; deploy_vmware_guest.yml
#OU
export ANSIBLE_HOST_KEY_CHECKING=False
ansible-playbook -l zwindler* -i hosts_deploy deploy_vmware_guest.yml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Vous trouverez plus d’informations sur cette solution de contournement sur les sites suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://stackoverflow.com/questions/23074412/how-to-set-host-key-checking-false-in-ansible-inventory-file" target="_blank" rel="noopener"
&gt;stackoverflow.com/questions/23074412/how-to-set-host-key-checking-false-in-ansible-inventory-file&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://docs.ansible.com/ansible/latest/intro_getting_started.html#id7" target="_blank" rel="noopener"
&gt;docs.ansible.com/ansible/latest/intro_getting_started.html#id7&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cette solution de contournement est à proscrire en production, car elle va ignorer l&amp;rsquo;empreinte de TOUTES les machines et pour TOUS vos playbooks. Au delà du problème évident de sécurité que ça pose, si vous enlevez l’option à un moment donné, c’est retour à la case départ. Vous aurez de nouveau la question sur tous les serveurs dont vous n’avez pas explicitement accepté l&amp;rsquo;empreinte.&lt;/p&gt;
&lt;h3 id="ssh-keyscan-à-la-rescousse"&gt;ssh-keyscan à la rescousse
&lt;/h3&gt;&lt;p&gt;On va donc ajouter la tâche suivante à notre playbook de déploiement :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;- name: accept new ssh fingerprints
shell: ssh-keyscan {{ custom_ip }},{{inventory_hostname}} &amp;gt;&amp;gt; ~/.ssh/known_hosts
with_items: &amp;#39;{{play_hosts}}&amp;#39;
when: &amp;#34;hostvars[item].inventory_hostname == inventory_hostname&amp;#34;
delegate_to: localhost
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Je sais&amp;hellip; c’est terrible : la solution que j’ai à l’heure actuelle, bien que fonctionnelle, N’EST PAS IDEMPOTENTE&amp;hellip; :-( mais elle fonctionne.&lt;/p&gt;
&lt;p&gt;Et on fini par un petit &lt;strong&gt;setup&lt;/strong&gt; pour récupérer les facts.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;- name: gather facts
setup:
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="et-maintenant-"&gt;Et maintenant ?
&lt;/h2&gt;&lt;p&gt;Et bien ! Maintenant, ça marche ! Vous pouvez enchainer d’autres tâches (ou des rôles) en ne mettant plus delegate_to, et ces tâches de « configuration » seront bien lancées sur le serveur que vous venez de déployer, dans un seul et même playbook.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;---
- hosts: all
gather_facts: false
vars_prompt:
- name: &amp;#34;vsphere_password&amp;#34;
prompt: &amp;#34;vSphere Password&amp;#34;
- name: &amp;#34;esxi_host&amp;#34;
promt: &amp;#34;ESXi host&amp;#34;
private: no
- name: &amp;#34;notes&amp;#34;
prompt: &amp;#34;VM notes&amp;#34;
private: no
default: &amp;#34;Deployed with ansible&amp;#34;
roles:
- deploy_vmware_guest
- other_role_for_configuration
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pari réussi !&lt;/p&gt;
&lt;h2 id="et-le-playbook-il-est-où-"&gt;Et le playbook, il est où ?
&lt;/h2&gt;&lt;p&gt;Une fois de plus, je suis sympa, &lt;a class="link" href="https://github.com/zwindler/ansible-deploy-vmware-guest" target="_blank" rel="noopener"
&gt;je vous donne un exemple de code sur mon Github&lt;/a&gt; !&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><item><title>Une erreur grave s’est produite lors de l’exécution de sysprep sur l’ordinateur</title><link>https://blog.zwindler.fr/2016/03/05/a-fatal-error-occurred-while-trying-to-sysprep-the-machine/</link><pubDate>Sat, 05 Mar 2016 13:00:52 +0000</pubDate><guid>https://blog.zwindler.fr/2016/03/05/a-fatal-error-occurred-while-trying-to-sysprep-the-machine/</guid><description>&lt;img src="https://blog.zwindler.fr/2016/01/sysprep_error-1.webp" alt="Featured image of post Une erreur grave s’est produite lors de l’exécution de sysprep sur l’ordinateur" /&gt;&lt;h2 id="dépassement-du-nombre-de-sysprep-autorisé"&gt;Dépassement du nombre de sysprep autorisé
&lt;/h2&gt;&lt;p&gt;A force d&amp;rsquo;(ab)user de virtualisation de serveurs, on prend forcément gout aux fonctionnalités offertes par l’infrastructure. Hormis VMware qui fait encore payer les templates (tacle gratuit, même si on peut &lt;a class="link" href="https://blog.zwindler.fr/2011/03/20/copier-une-vm-windows-xp-sous-esxi-sans-vcenter/" &gt;s’en sortir comme ceci&lt;/a&gt;), la plupart des éditeurs d’hyperviseurs proposent &lt;em&gt;&lt;strong&gt;gratuitement&lt;/strong&gt;&lt;/em&gt; la fonctionnalité qui permet, à partir d’une machine virtuelle existante, de créer un modèle qui servira de socle pour les déploiement futurs.&lt;/p&gt;
&lt;p&gt;On gagnera un temps fou en s’évitant l’installation de l’OS à chaque fois (même si ça s’automatise d’autres façons je l’accorde) et surtout à toujours reparametrer les mêmes choses comme les DNS, le NTP, le client de supervision, &amp;hellip;&lt;/p&gt;
&lt;p&gt;Ça marchera plutôt bien sur vos bons vieux Linux (sauf dans pour &lt;a class="link" href="https://blog.zwindler.fr/2016/02/20/nettoyage-carte-ethernet-apres-deploiement-dun-template-centos-rhel-6/" &gt;la gestion du réseau CentOS/RHEL6&lt;/a&gt;, corrigé en 7), mais Microsoft, lui, ne l’entendra pas de cette oreille !&lt;/p&gt;
&lt;p&gt;Lorsque vous déployez un serveur ou un poste de travail sous Windows, vous êtes limités dans le nombre de &lt;strong&gt;sysprep&lt;/strong&gt; consécutifs que vous pouvez exécuter pour réinitialiser les variables de types SID dans le registre de la machine.&lt;/p&gt;
&lt;p&gt;Or, pour des raisons de stabilité et de sécurité, de nombreux administrateurs réalisent un &lt;strong&gt;sysprep&lt;/strong&gt; une fois que leur template est terminé, ce qui permet de réinitialiser le SID du modèle, ce qui rendra par la suite la future VM unique au moment de son déploiement. Et si vous modifiez régulièrement vos templates, la limite peut arriver vite.&lt;/p&gt;
&lt;h2 id="lerreur-et-sa-solution"&gt;L’erreur et sa solution
&lt;/h2&gt;&lt;p&gt;Lorsque l’on déploie une image sur un poste ou un serveur et qu’on reçoit le message d’erreur suivant :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Une erreur grave s’est produite lors de l’exécution de sysprep sur l’ordinateur&lt;/p&gt;
&lt;p&gt;A fatal error occurred while trying to sysprep the machine&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La procédure pour contourner le compteur de Microsoft se passe en plusieurs étapes.&lt;/p&gt;
&lt;h3 id="regedit"&gt;Regedit
&lt;/h3&gt;&lt;p&gt;Premièrement, il faut commencer par modifier les trois chaînes regedit suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HKEY_LOCAL_MACHINE\SYSTEM\Setup\Status\SysprepStatus\CleanupState:2&lt;/li&gt;
&lt;li&gt;HKEY_LOCAL_MACHINE\SYSTEM\Setup\Status\SysprepStatus\GeneralizationState:7&lt;/li&gt;
&lt;li&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform\SkipRearm:1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Éventuellement, on peut préférer exécuter un fichier &lt;strong&gt;.reg&lt;/strong&gt; contenant les lignes suivantes :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\Setup\Status\SysprepStatus]
&amp;#34;GeneralizationState&amp;#34;=dword:00000007
&amp;#34;CleanupState&amp;#34;=dword:00000002
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SoftwareProtectionPlatform]
&amp;#34;SkipRearm&amp;#34;=dword:00000001
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Deuxièmement, effectuer deux commandes (dans l’invité de commandes ou exécuter Powershell en tant qu’administrateur), en attendant 5 à 10 secondes entre chaque commandes. Cette opération est réellement nécessaire car j’ai eu des échecs en essayant de ne pas le faire, pour voir.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;msdtc -uninstall
msdtc -install
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="dernière-étape-avant-le-sysprep--le-skiprearmxml"&gt;Dernière étape avant le sysprep : le skiprearm.xml
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Attention, ce fichier dépend de votre version.&lt;/strong&gt; Suite à un commentaire je me suis rendu compte que le fichier que je fournissais ne fonctionne plus sur les versions « récentes » de Windows.&lt;/p&gt;
&lt;p&gt;Pour les vielles versions (2003 jusqu’à 2008 mais pas trop à jour?)&lt;/p&gt;
&lt;p&gt;Troisièmement, créer un fichier nommé &lt;strong&gt;c:\Windows\system32\sysprep\skiprearm.xml&lt;/strong&gt; contenant le texte suivant :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;
&amp;lt;unattend xmlns=&amp;#34;urn:schemas-microsoft-com:unattend&amp;#34;&amp;gt;
&amp;lt;settings pass=&amp;#34;generalize&amp;#34;&amp;gt;
&amp;lt;component name=&amp;#34;Microsoft-Windows-Security-Licensing-SLC&amp;#34; processorArchitecture=&amp;#34;x86&amp;#34; publicKeyToken=&amp;#34;31bf3856ad364e35&amp;#34; language=&amp;#34;neutral&amp;#34; versionScope=&amp;#34;nonSxS&amp;#34; xmlns:wcm=&amp;#34;http://schemas.microsoft.com/WMIConfig/2002/State&amp;#34; xmlns:xsi=&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;&amp;gt;
&amp;lt;SkipRearm&amp;gt;1&amp;lt;/SkipRearm&amp;gt;
&amp;lt;/component&amp;gt;
&amp;lt;/settings&amp;gt;
&amp;lt;/unattend&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour les versions plus récentes et à jour&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;utf-8&amp;#34;?&amp;gt;
&amp;lt;unattend xmlns=&amp;#34;urn:schemas-microsoft-com:unattend&amp;#34;&amp;gt;
&amp;lt;settings pass=&amp;#34;generalize&amp;#34;&amp;gt;
&amp;lt;component name=&amp;#34;Microsoft-Windows-Security-SPP&amp;#34; processorArchitecture=&amp;#34;amd64&amp;#34; publicKeyToken=&amp;#34;31bf3856ad364e35&amp;#34; language=&amp;#34;neutral&amp;#34; versionScope=&amp;#34;nonSxS&amp;#34; xmlns:wcm=&amp;#34;http://schemas.microsoft.com/WMIConfig/2002/State&amp;#34; xmlns:xsi=&amp;#34;http://www.w3.org/2001/XMLSchema-instance&amp;#34;&amp;gt;
&amp;lt;SkipRearm&amp;gt;1&amp;lt;/SkipRearm&amp;gt;
&amp;lt;/component&amp;gt;
&amp;lt;/settings&amp;gt;
&amp;lt;/unattend&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="le-sysprep"&gt;Le sysprep
&lt;/h3&gt;&lt;p&gt;Une fois que ces trois étapes ont été réalisées, on reboot le serveur et on peut exécuter le sysprep en ligne de commande à la suite.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cd c:\windows\system32\sysprep
sysprep /generalize /oobe /shutdown /unattend:c:\Windows\system32\sysprep\skiprearm.xml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans mon exemple, je ne fais que couper la machine en fin de processus, il n’y a pas de reboot. Ceci me permet de transformer ma machine virtuelle en modèle à la suite. Ainsi, les VMs qui seront déployées avec ce modèle auront déjà eu leur sysprep au moment du premier boot, ce qui me gagne du temps.&lt;/p&gt;
&lt;h2 id="note-complémentaire"&gt;Note complémentaire
&lt;/h2&gt;&lt;p&gt;Il y a débat sur le fait que le &lt;strong&gt;sysprep&lt;/strong&gt; soit toujours nécessaire aujourd’hui, surtout depuis l’article du TechNet « &lt;em&gt;The Machine SID Duplication Myth (and Why Sysprep Matters)&lt;/em&gt; » de Mark Russinovich, auteur de NewSID.exe, &lt;strong&gt;l’Utilitaire&lt;/strong&gt;  (avec un grand U) utilisé pour réinitialiser les SID sous XP/2003.&lt;/p&gt;
&lt;p&gt;On y apprend en gros qu’il n’y a aucun risques à cloner des machines Windows sans réinitialiser les SID et que dans la grande majorité des cas, le sysprep n’est donc pas nécessaire depuis 2008. C’est d’ailleurs pour cela que l’auteur indique ne plus maintenir son NewSID.exe.&lt;/p&gt;
&lt;p&gt;Pour autant, je peux attester personnellement de deux contextes en Windows 2008 et pour lesquels la duplication du SID a provoqué un dysfonctionnement majeur du fonctionnement des applications Microsoft (notamment l’installation d’un domaine Active Directory). Donc jusqu’à preuve du contraire, je continuerai à faire des sysprep sur mes clones/templates Windows Server.&lt;/p&gt;
&lt;h2 id="nombre-de-sysprep-restants"&gt;Nombre de sysprep restants
&lt;/h2&gt;&lt;p&gt;Il existe une commande pour vérifier le nombre de sysprep qu’on peut encore refaire (trouvé sur &lt;a class="link" href="http://power-shell.blogspot.fr/2011/11/comment-eviter-que-la-commande-sysprep.html" target="_blank" rel="noopener"
&gt;Power Shell&lt;/a&gt;) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;slmgr.vbs /dlv
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/03/sysprep_1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="sources-additionnelles"&gt;Sources additionnelles
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://support.microsoft.com/en-us/kb/929828" target="_blank" rel="noopener"
&gt;Le KB Microsoft qui explique le problème et donne quelques pistes pour le contourner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blogs.technet.microsoft.com/markrussinovich/2009/11/03/the-machine-sid-duplication-myth-and-why-sysprep-matters/" target="_blank" rel="noopener"
&gt;L’article TechNet censé nous expliquer que les duplications de SID ne pose aucun problèmes réels&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www.infoworld.com/article/2628004/microsoft-windows/the-sid-debate--to-sysprep-or-not-to-sysprep.html" target="_blank" rel="noopener"
&gt;Une autre analyse sur le sujet de chez InfoWorld&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Centreon / hostgroups / modèles d’hôtes, la réponse de Centreon à mon article</title><link>https://blog.zwindler.fr/2015/04/18/centreon-hostgroups-modeles-dhotes-la-reponse-de-centreon-a-mon-article/</link><pubDate>Sat, 18 Apr 2015 21:05:59 +0000</pubDate><guid>https://blog.zwindler.fr/2015/04/18/centreon-hostgroups-modeles-dhotes-la-reponse-de-centreon-a-mon-article/</guid><description>&lt;img src="https://blog.zwindler.fr/2015/04/Centreon-Monitoring-Services-AllServices-2.webp" alt="Featured image of post Centreon / hostgroups / modèles d’hôtes, la réponse de Centreon à mon article" /&gt;&lt;p&gt;J’ai reçu une réponse par commentaire d’une personne de chez Centreon (apparemment) à la suite de mon article &amp;lt;/2014/09/11/rage-non-centreon-nautorise-pas-les-hostgroups-pour-les-modeles-dhotes/&amp;gt;&lt;/p&gt;
&lt;p&gt;Pour rappel, Centreon gère les héritages via les modèles d’une façon un peu différente de Nagios. Au moment de la création de l’hôte dans Centreon, l’héritage est « aplati » et les services sont unitairement créés sur l’hôte, qui devient autonome. La configuration ainsi générée est simplifiée.&lt;br&gt;
S’il y a surement de nombreuses raisons pour procéder de la sorte, une des conséquences et que, lorsqu’on met à jour un modèle d’hôte, les hôtes déjà créés ne bénéficient pas de cette mise à jour.&lt;/p&gt;
&lt;p&gt;Je propose dans l’article en question plusieurs méthodes de contournement sans pour autant avoir de solution idéale, notamment via la liaison par de services à des groupes d’hôtes, qui eux restent dynamiques malgré quelques limitations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Laurent Pinsivy&lt;/strong&gt; (si c’est bien lui, on ne sait jamais trop avec L’Internet) en propose une autre.&lt;/p&gt;
&lt;h2 id="la-solution"&gt;La « solution »
&lt;/h2&gt;&lt;p&gt;Admettons que je mette à jour mon modèle d’hôte Win_2K (par exemple, j’ajoute un service grâce à un modèle de service).&lt;br&gt;
Pour que les serveurs prennent en compte l’ajout du nouveau service, je commence par filtrer l’ensemble des serveurs qui héritent de ce modèle :&lt;br&gt;
&lt;img src="https://blog.zwindler.fr/2015/04/01_technique_centreon.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Je peux ainsi sélectionner l’ensemble des serveurs qui héritent &lt;em&gt;directement&lt;/em&gt; (c’est important) de ce modèle, puis via l’option « Changement Massif » les modifier tous d’un coup.&lt;br&gt;
&lt;img src="https://blog.zwindler.fr/2015/04/02_technique_centreon.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Pour que les paramètres modifiés dans le modèle soient propagés dans les hôtes en héritant, je coche l’option « Créer aussi les services liés au modèle ». Centreon réitère le processus d’aplatissement de l’héritage -comme lors de la création de l’hôte- ce qui a pour effet de remettre à jour nos hôtes.&lt;br&gt;
&lt;img src="https://blog.zwindler.fr/2015/04/03_technique_centreon.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Petite subtilité :&lt;/strong&gt; selon ce que l’on souhaite faire, il faut positionner le mode de mise à jour à « Incrémentale » dans le cas d’un ajout dans le modèle et « Remplacement » pour une modification d’un des attributs du modèle.&lt;/p&gt;
&lt;h2 id="mon-avis-après-test"&gt;Mon avis après test
&lt;/h2&gt;&lt;p&gt;J’ai quand même de gros doutes sur cette « solution » :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;[à mon gout] c’est beaucoup moins souple/pratique que le mode d’héritage de Nagios, voire même l’utilisation des services par groupes d’hôtes (même si il faut bidouiller pour gérer les exceptions).&lt;/li&gt;
&lt;li&gt;J’ai donné ici l’exemple d’un ajout ou de la modification d’un service existant. Pour la suppression d’un modèle, je ne suis sûr ni des impacts ni même que ça fonctionne&amp;hellip;&lt;/li&gt;
&lt;li&gt;Si je modifie un modèle (generic-host par exemple) dont hérite un modèle fils (win_2k), et que je filtre sur le modèle père, je ne vais sélectionner que les hôtes qui héritent explicitement du modèle père.&lt;br&gt;
On « oublie » alors tous ceux qui héritent du modèle fils (et donc implicitement du modèle père), alors qu’ils sont pourtant potentiellement concernés si le modèle fils n’écrase pas certains paramètres. C’est pourtant souvent le cas, c’est l’intérêt même de l’héritage multiple.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Une fois encore, je peux rater quelque chose. Mais en l’état, pour moi, le manque reste entier ;-)&lt;/p&gt;</description></item><item><title>Créer un modèle/template VM Windows XP sous ESXi sans vCenter</title><link>https://blog.zwindler.fr/2011/03/20/copier-une-vm-windows-xp-sous-esxi-sans-vcenter/</link><pubDate>Sun, 20 Mar 2011 21:58:23 +0000</pubDate><guid>https://blog.zwindler.fr/2011/03/20/copier-une-vm-windows-xp-sous-esxi-sans-vcenter/</guid><description>&lt;img src="https://blog.zwindler.fr/2015/07/vmware2.webp" alt="Featured image of post Créer un modèle/template VM Windows XP sous ESXi sans vCenter" /&gt;&lt;p&gt;VMare a beau prétendre proposer un hyperviseur gratuit, la plupart des fonctions vitales d’un hyperviseur y sont absentes si on ne dispose pas d’une licence, contrairement aux concurrents (libres ou non). Sans prôner le libre à tout prix (je veux bien comprendre qu’il faut vivre de son produit, et ajouter des fonctionnalités selon les licences n’est pas une stratégie marketing dénuée de sens), il est quand même vraiment dommage de proposer un produit gratuit sans donner la possibilité de l’utiliser dans un environnement réel. Ça donne un peu le gout amer de shareware&amp;hellip;&lt;/p&gt;
&lt;p&gt;Parmi ces fonctions vitales qui n’ont aucunes raisons d’être payantes selon moi, j’ai nommé :&lt;/p&gt;
&lt;p&gt;La possibilité de disposer d’un moyen de copier facilement des machines virtuelles pour déployer en peu de temps un SI virtualisé. Rien de plus horrible que de devoir se taper une demi heure de réponses débiles dans l’écran d’installation d’un OS. N’importe quel admin système a désespérément besoin de cette fonctionnalité, aussi petit soit le SI en question, et sans laquelle la virtualisation perd une bonne partie de son avantage en terme de gain de temps par rapport à une architecture physique&amp;hellip;&lt;/p&gt;
&lt;p&gt;Mais heureusement, il y a une petite astuce assez simple pour s’en affranchir.&lt;/p&gt;
&lt;p&gt;Ne cherchez pas dans votre vSphere, la fonctionnalité pour copier des VMs n’apparaitra pas si vous ne disposez pas d’un vCenter. Cependant, en fouillant bien, on retrouve des fonctionnalités utilisant une notion un peu similaire, qui est la notion de template&amp;hellip;&lt;/p&gt;
&lt;p&gt;vSphere propose de créer et d’importer des virtuals appliances. Pour faire simple, ce sont des machines virtuelles « prêtes à fontionner », généralement diffusées sur Internet dans le but de fournir  des produits logiciels un peu complexe sans installation (OS de supervision prêt à l&amp;rsquo;emploi, VM faisant office de pare feu, &amp;hellip;).&lt;/p&gt;
&lt;p&gt;En détournant cette fonctionnalité à notre avantage, il est donc possible de créer des templates (littéralement « modèle » ou « gabarit ») qui représentent des copies complètes de machines virtuelles à un instant donné. A partir de ce template, il sera donc possible de recréer autant de machines virtuelles identiques que l’on souhaite. CQFD&lt;/p&gt;
&lt;p&gt;Voici donc un petit tuto dans la lignée du précédent (rien de techniquement agressif et probablement &lt;strong&gt;beaucoup trop&lt;/strong&gt; détaillé) pour créer un template de VM Windows XP en prenant garde de modifier les paramètres qui doivent rester uniques. En effet, deux machines virtuelles créées à partir d’un template ne peuvent pas fonctionner sur un même réseau, pour les raisons suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si la carte réseau virtuelle était configurée avec une adresse IP, elles auront la même adresse IP&lt;/li&gt;
&lt;li&gt;Si elles hébergent un système d’exploitation Windows :
&lt;ul&gt;
&lt;li&gt;Elles auront le même identifiant supposé unique (SID)&lt;/li&gt;
&lt;li&gt;Elles auront le même nom complet sur le réseau&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Comme les données du disque dur sont enregistrées dans le template, il est conseillé de créer des templates avec le moins de données possible sur le disque dur, autant pour des raisons d’économie de l’espace disque que pour gagner en temps de création/déploiement.&lt;/p&gt;
&lt;p&gt;Ainsi, il deviendra possible de recréer en quelques minutes des machines virtuelles minimalistes préconfigurées pour une tâche. Attention à ne pas tomber dans l’excès non plus :  il est tout de même malin d’installer toutes les mises à jour et tous les logiciels susceptibles d’être installé sur tous les postes, le but de la création de template étant de gagner du temps!&lt;/p&gt;
&lt;p&gt;Pour faciliter le déploiement de VM sous Windows, il est conseillé d’ajouter l’utilitaire NewSID.exe qui sera bine utile pour modifier les identifiants uniques de la machine avant de l’introduire sur le réseau.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Créer un template à partir du client vSphere&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Choisir une machine à exporter en template, et l’éteindre&lt;/li&gt;
&lt;li&gt;Sélectionner la machine virtuelle choisie&lt;/li&gt;
&lt;li&gt;Cliquer sur &lt;strong&gt;File/Export/Export OVF Template&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Entrer un nom et un répertoire de destination pour le template [Next]&lt;/li&gt;
&lt;li&gt;Choisir le format d’enregistrement (OVF ou OVA) [Finish]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2011/03/template.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2011/03/ovf.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Ces deux formats sont tous les deux des valeurs possibles. OVF (Open Virtualization Format) est plus standard que OVA, il sera donc plus simple d’importer des fichiers OVF sur un autre système de virtualisation. Cependant, OVA offre la possibilité de tout stocker dans un seul fichier, contrairement à OVF qui génèrera plusieurs fichiers (configuration et disque dur).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exporter un template à partir du client vSphere&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cliquer sur &lt;strong&gt;File/Deploy OVF Template&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Choisir un template sur le disque ou depuis une url [Next]&lt;/li&gt;
&lt;li&gt;L’assistant affiche une description du template [Next]&lt;/li&gt;
&lt;li&gt;Entrez un nom pour la nouvelle machine virtuelle (qui n’existe pas déjà sur le serveur de virtualisation!) [Next]&lt;/li&gt;
&lt;li&gt;Choisir dans quel pool la machine virtuelle doit être affectée [Next]&lt;/li&gt;
&lt;li&gt;Choisir un Datastore dans lequel la machine virtuelle et sa configuration seront stockées [Next]&lt;/li&gt;
&lt;li&gt;[Finish]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2011/03/template2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2011/03/ovf2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Une fois ces opérations terminées, la machine virtuelle est prête à être démarrée par le serveur ESXi. Cependant, il reste quelques opérations à effectuer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Si la machine est sous Windows :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Il faut changer le SID de la machine car cet SID est supposé unique. Or, toutes les machines déployées avec ce template auront le même SID : il faut donc en générer un nouveau. Ceci peut être fait à l’aide du programme &lt;strong&gt;NewSID.exe&lt;/strong&gt; (voir la section « utilisation de NewSID.exe »). La modification de ce paramètre ne peut prendre effet qu’après redémarrage de la machine.&lt;/li&gt;
&lt;li&gt;Il faut donner un nouveau nom complet à la machine, car ce nom est supposé unique sur le réseau, et des noms identiques pourraient provoquer des conflits. L’utilitaire NewSID.exe permet de changer ce nom complet, après avoir généré un nouvel SID. Une autre manière de le faire est de d’effectuer l’opération suivante : &lt;strong&gt;Panneau de configuration/Système/Nom de l’ordinateur/Modifier&lt;/strong&gt; et entrer un nom unique sur le réseau. La modification de se paramètre ne peut prendre effet qu’après redémarrage de la machine.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Attribuer à l’interface réseau virtuelle une adresse IP unique en fonction du plan d’adressage du réseau, un masque de réseau adéquat et l’adresse IP du serveur DNS.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Intégrer la machine nouvellement configurée au domaine. Pour se faire, il faut effectuer l’opération suivante : &lt;strong&gt;Panneau de configuration/Système/Nom de l’ordinateur/Modifier&lt;/strong&gt;, sélectionner &lt;strong&gt;Membre de Domaine&lt;/strong&gt;, et entrez le nom du domaine à intégrer.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Utilisation de NewSID.exe&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pour pouvoir modifier le SID et le nom complet de la machine, il faut suivre les étapes suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Exécuter NewSID.exe [Next]&lt;/li&gt;
&lt;li&gt;L’utilitaire affiche le SID actuel, et propose d’en générer un nouveau [Next]&lt;/li&gt;
&lt;li&gt;[Next]&lt;/li&gt;
&lt;li&gt;L’utilitaire propose de renommer la machine, entrer un nouveau nom complet [Next]&lt;/li&gt;
&lt;li&gt;[Next]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Normalement, après ces étapes, le SID sera modifié dans le registre, le nom complet sera modifié, et la machine redémarrera d’elle-même à la fin de la procédure.&lt;/p&gt;</description></item><item><title>Création d’un template CentOS 5.5 pour XenServer 5.6</title><link>https://blog.zwindler.fr/2011/02/15/creation-dun-template-centos-5-5-pour-xenserver-5-6/</link><pubDate>Tue, 15 Feb 2011 21:46:29 +0000</pubDate><guid>https://blog.zwindler.fr/2011/02/15/creation-dun-template-centos-5-5-pour-xenserver-5-6/</guid><description>&lt;img src="https://blog.zwindler.fr/2011/02/citirx-xenserver11.webp" alt="Featured image of post Création d’un template CentOS 5.5 pour XenServer 5.6" /&gt;&lt;p&gt;Depuis quelques temps, ma solution de virtualisation est en place, mes VMs ronronnent, et je me suis lancé un peu plus profondément dans la supervision et tout ce qui s’en approche. Ceux qui lisent mes lignes de temps à autres sauront que j’avais déjà travaillé sur EyesOfNetwork et Nagios, mais j’ai voulu m’attaquer à quelque chose de nouveau et (à mon avis) mieux pensé.&lt;/p&gt;
&lt;p&gt;Je parle bien évidemment de l’épopée Shinken, démarrée par un gars de la région, qui a aussi fait mon école, et dont je suis la progression depuis maintenant un moment (pratiquement le début en fait, même si ca à souvent été d’un œil distrait). Seulement voilà, pour pouvoir tester Shinken au maximum de ses capacitées, j’ai besoin de plusieurs VM vierges.&lt;/p&gt;
&lt;p&gt;Fini l’époque bénie des VMs construites sur l’envie du moment : j’en ai marre! Il à donc bien fallut s’y résoudre : Créer des templates pour déployer rapidement (et proprement) un réseau complet.&lt;/p&gt;
&lt;p&gt;Donc rien de bien « techniquement agressif » (comme dirait l’autre) aujourd’hui, je vous propose un petit tuto pour créer de bout en bout un template CentOS 5.5 sur un XenServer 5.6 (qui ne supporte théoriquement que CentOS jusqu’à 5.4 même si nous verrons que ce n’est vraiment pas un problème).&lt;/p&gt;
&lt;p&gt;La première chose à faire pour créer un template c’est de commencer par créer la VM qui nous servira de modèle. Ceux qui auront toujours la même version 5.6 de XenServer que moi s’apercevront qu’il n’y a pas de template prédéfini pour CentOS 5.5. Nous prenons donc un 5.4, ça ne pose pas de problèmes dans le cas d’une installation par le Net (ce que je présenterai ici). Dans le cas d’une installation par l’iso, je crois que c’est plus problématique, et qu’il n’y a pas vraiment de solution à par installer via un DVD 5.4 puis changer de version par la suite (à vérifier).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2011/02/new_vm.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Comme je l’ai sous-entendu plus haut, je vais profité du fait qu’il est possible d’installer CentOS via HTTP pour pouvoir disposer directement d’une version CentOS 5.5 dans ma VM.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2011/02/install_url.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Dans le cas où vous passez par un DVD, il est possible de réaliser cette installation par le net de la même façon, en sélectionnant le média FTP ou HTTP lors de l’installation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;URL : mirrors.centos.org&lt;/li&gt;
&lt;li&gt;Directory : centos/5.5/os/x86_64&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CentOS se met donc à s’installer sur la VM, une fois que vous avez répondu à toutes les questions. Pour tous les paramètres réseaux, comme il s’agit d’un template, il vaut mieux se contenter de garder des paramètre simple : Si possible, laisser le DHCP, on pourra reconfigurer l’IP de la VM au cas par cas sans risquer de provoquer de conflit d’IP lors de gros déploiement.&lt;/p&gt;
&lt;p&gt;Si tout se passe bien, il fini par rebooter au bout d’un moment. La première chose à faire une fois que la VM est fonctionnelle, c’est d’installer les XenServer-Tools. En effet, ce sont eux qui permettent à la VM d’être complètement « consciente » de son état de VM et donc d’atteindre &lt;del&gt;l’ataraxie&lt;/del&gt; la paravirtualisation (gain de performance et gain en contrôle sur la VM). Par défaut, ces XenServer Tools sont situées dans un iso que l’on monte donc sur la VM.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2011/02/xs-tools.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et on lance les commandes suivantes pour monter et exécuter le programme d’installation :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir /mnt/cdrom
mount /dev/xvdd /mnt/cdrom
/mnt/cdrom/Linux/install.sh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Une fois le programme installé, un reboot s’impose! Selon les gouts « shutdown -r now » ou « init 6 ». Une fois que c’est fait, il faut mettre son système à jour avec « yum upgrade », et pourquoi pas installer tous les produits et logiciels indispensable à tout votre parc? Pourquoi pas non plus ajouter des repos additionnels tant qu’on y est (cf cette page du &lt;a class="link" href="https://web.archive.org/web/20150811012515/http://wiki.centos.org/AdditionalResources/Repositories" target="_blank" rel="noopener"
&gt;wiki.centos.org (lien mort, remplacé par Internet Archive)&lt;/a&gt;)?&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
rpm -K rpmforge-release-0.5.2-2.el5.rf.*.rpm
rpm -i rpmforge-release-0.5.2-2.el5.rf.*.rpm
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;et&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;yum list htop
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;pour vérifier que l’importation à bien fonctionné (d’ailleur il y a la base des rpms dispo qui devrait se reconstruire dans la foulée)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2011/02/rpmforge.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Voilà, on a maintenant le parfait candidat pour un template! Pour pouvoir le créer, on doit éteindre la VM. Pour créer ce template, on a plusieurs possibilités. D’abord, on peut créer une Appliance, qui est en fait un template destiné à être exporté sur le web dans un format standardisé (.ovf). Typiquement, ce mécanisme est utilisée par des personnes qui fournissent une VM fournissant un service préinstallé, ou, dans le cas de la virtualisation VMware, par les utilisateurs de ESXi sans vCenter pour contourner l’absence de cette fonctionnalité :-p (je ferai un article là dessus bientôt).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2011/02/appliance.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Sinon on peut aussi convertir la VM en un template (opération « définitive ») et elle n’apparaitra plus dans la liste comme une VM mais bien comme un template. C’est ce que je vais faire ici.&lt;/p&gt;
&lt;p&gt;Il est désormais possible de créer très rapidement des VMs à partir de ce template. Les seules choses à modifier une fois le déploiement terminés sont donc&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le hostname (bah oui, c’est quelque chose d’unique!)&lt;/li&gt;
&lt;li&gt;supprimer l’interface eth0.bak créée par XenServer lors du déploiement&lt;/li&gt;
&lt;li&gt;et éventuellement modifier les infos IP de la machine&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;rm /etc/sysconfig/networking/devices/ifcfg-eth0.bak
rm /etc/sysconfig/network-scripts/ifcfg-eth0.bak
system-config-network
service network restart
&lt;/code&gt;&lt;/pre&gt;</description></item></channel></rss>