<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ssh-Keyscan on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/ssh-keyscan/</link><description>Recent content in Ssh-Keyscan 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, 14 Nov 2017 12:45:27 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/ssh-keyscan/index.xml" rel="self" type="application/rss+xml"/><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></channel></rss>