<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>RHEL on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/rhel/</link><description>Recent content in RHEL on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Tue, 11 Jul 2023 06:00:00 +0200</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/rhel/index.xml" rel="self" type="application/rss+xml"/><item><title>Oracle à la rescousse de Linux ? Quelle blague!</title><link>https://blog.zwindler.fr/2023/07/11/oracle-a-la-rescousse-de-linux-quelle-blague/</link><pubDate>Tue, 11 Jul 2023 06:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2023/07/11/oracle-a-la-rescousse-de-linux-quelle-blague/</guid><description>&lt;img src="https://blog.zwindler.fr/2023/07/oracle-linux.webp" alt="Featured image of post Oracle à la rescousse de Linux ? Quelle blague!" /&gt;&lt;h2 id="petit-billet-dhumeur-ça-faisait-longtemps"&gt;Petit billet d&amp;rsquo;humeur, ça faisait longtemps
&lt;/h2&gt;&lt;p&gt;Oracle vient à la rescousse de Linux ? Quelle blague&amp;hellip;&lt;/p&gt;
&lt;p&gt;En 2018, j&amp;rsquo;écrivais un article intitulé &lt;a class="link" href="https://blog.zwindler.fr/2018/10/19/lopen-source-bashing-a-encore-de-beaux-jours-devant-lui/" &gt;L’open source bashing a encore de beaux jours devant lui&lt;/a&gt;, prémisse d&amp;rsquo;un de mes tout premiers talks. A PSES ensuite, en 2019, je donnais une de mes toutes premières conférences en tant que speaker intitulée &amp;ldquo;Le logiciel libre a-t-il de beaux jours devant lui ?&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Dans cet article et ce talk, j&amp;rsquo;avais parlé des &amp;ldquo;super-vilains&amp;rdquo; de l&amp;rsquo;histoire, les géants du monde propriétaires.&lt;/p&gt;
&lt;p&gt;Ceux qui étaient passés de l&amp;rsquo;ignorance du logiciel libre, à la moquerie, puis au combat. Et finalement du rachat de RedHat par IBM.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;First they ignore you,&lt;/p&gt;
&lt;p&gt;Then they laugh at you,&lt;/p&gt;
&lt;p&gt;Then they fight you,&lt;/p&gt;
&lt;p&gt;Then &lt;strong&gt;they buy you&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/07/then-they-buy.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="redhat-verrouille-des-sources-rhel-derrière-un-paywall"&gt;RedHat verrouille des sources RHEL derrière un paywall
&lt;/h2&gt;&lt;p&gt;Aujourd&amp;rsquo;hui, rien n&amp;rsquo;a changé.&lt;/p&gt;
&lt;p&gt;Les super-vilains cyniques sont les mêmes, ils changent juste alternativement de rôles dans le &lt;a class="link" href="https://fr.wikipedia.org/wiki/Triangle_dramatique" target="_blank" rel="noopener"
&gt;triangle de karpman&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: Si vous avez loupé cette news qui a pas mal chahuté le petit monde de l&amp;rsquo;OSS et du logiciel libre, je vous ai fait une petite compilation de liens en fin d&amp;rsquo;article.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;IBM/RedHat tue CentOS en 2020 (alors que normalement le support de la 8 courrait pendant encore plusieurs années), puis utilise en juin 2023 &amp;ldquo;une faille&amp;rdquo; (selon Jeff Geerling) de la GPL pour empêcher les clones de RHEL.&lt;/p&gt;
&lt;p&gt;Et comme la saison du troll semble ainsi ouverte, aujourd&amp;rsquo;hui Oracle fait semblant d&amp;rsquo;aider l&amp;rsquo;open source (juste pour troller IBM), tout en ayant été de l&amp;rsquo;autre côté de la barrière tout aussi récemment.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.oracle.com/news/announcement/blog/keep-linux-open-and-free-2023-07-10/" target="_blank" rel="noopener"
&gt;Oracle.com - Keep Linux Open and Free—We Can’t Afford Not To&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et au milieu de tout ça, Microsoft Loves Linux, bien entendu 😏&lt;/p&gt;
&lt;p&gt;Bref, l&amp;rsquo;histoire de l&amp;rsquo;informatique est un éternel recommencement.&lt;/p&gt;
&lt;h2 id="addendum--suse"&gt;Addendum : SUSE
&lt;/h2&gt;&lt;p&gt;SUSE vient (aujourd&amp;rsquo;hui !) de rajouter un pavé dans la marre en annonçant forker RHEL et investissant plus de 10 millions de dollars dessus.&lt;/p&gt;
&lt;p&gt;*&lt;a class="link" href="https://www.suse.com/news/SUSE-Preserves-Choice-in-Enterprise-Linux/" target="_blank" rel="noopener"
&gt;SUSE Preserves Choice in Enterprise Linux by Forking RHEL with a $10+ Million Investment&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;SUSE is committed to working with the open source community to develop a long-term, enduring compatible alternative for RHEL and CentOS users. SUSE plans to contribute this project to an open source foundation, which will provide ongoing free access to alternative source code.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Merci à ceux qui me l&amp;rsquo;ont forwardé :)&lt;/p&gt;
&lt;h2 id="sources"&gt;Sources
&lt;/h2&gt;&lt;p&gt;Pour comprendre rapidement (mais faut aimer les vidéos)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.youtube.com/watch?v=sxZLFxU2FEo" target="_blank" rel="noopener"
&gt;Vidéo Adrien LinuxTricks - Edito Red Hat : Debrief autour de la &amp;ldquo;fermeture des sources&amp;rdquo; &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les différents billets de blogs&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.redhat.com/en/blog/furthering-evolution-centos-stream" target="_blank" rel="noopener"
&gt;Le billet d&amp;rsquo;annonce des changements dans RHEL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://fosspost.org/red-hat-is-shooting-itself-in-the-foot-again/" target="_blank" rel="noopener"
&gt;fosspost.org - Red Hat is Shooting Itself in the Foot, Again&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://linux.developpez.com/actu/345794/-Avez-vous-perdu-la-tete-Red-Hat-fustige-pour-le-verrouillage-des-sources-RHEL-derriere-un-paywall-Jeff-Geerling-AlmaLinux-et-Rocky-Linux-expriment-leur-deception/" target="_blank" rel="noopener"
&gt;linux.developpez.com - « Avez-vous perdu la tête ? », Red Hat fustigé pour « le verrouillage des sources RHEL derrière un paywall »&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.redhat.com/en/blog/red-hats-commitment-open-source-response-gitcentosorg-changes" target="_blank" rel="noopener"
&gt;Red Hat’s commitment to open source: A response to the git.centos.org changes (on est pas méchants, c&amp;rsquo;est faux !)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.jeffgeerling.com/blog/2023/im-done-red-hat-enterprise-linux" target="_blank" rel="noopener"
&gt;Jeff Geerling (geerlingguy) - I&amp;rsquo;m done with Red Hat (Enterprise Linux)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.oracle.com/news/announcement/blog/keep-linux-open-and-free-2023-07-10/" target="_blank" rel="noopener"
&gt;Oracle.com - Keep Linux Open and Free—We Can’t Afford Not To&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ma conférence à PSES 2019 / BDX I/O 2019 (sur mon peertube)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://peertube.zwindler.fr/w/qKSSnN8URQePggjxgdxfN3" target="_blank" rel="noopener"
&gt;PSES 2019 - Le logiciel libre a-t-il de beaux jours devant lui&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://peertube.zwindler.fr/w/kr5duRcm5quu1cfWKUjoo1" target="_blank" rel="noopener"
&gt;BDX IO 2019 - Le logiciel libre a-t-il de beaux jours devant lui&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><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>Installer un cluster Kubernetes sur des VMs CentOS 7</title><link>https://blog.zwindler.fr/2017/06/07/installer-cluster-kubernetes-vm-centos/</link><pubDate>Wed, 07 Jun 2017 12:00:53 +0000</pubDate><guid>https://blog.zwindler.fr/2017/06/07/installer-cluster-kubernetes-vm-centos/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/06/kubernetes2.webp" alt="Featured image of post Installer un cluster Kubernetes sur des VMs CentOS 7" /&gt;&lt;h2 id="kubernetes-cest-quoi-ça-"&gt;Kubernetes, c’est quoi ça ?
&lt;/h2&gt;&lt;p&gt;Dans cet article, je vais vous guider pour installer pas à pas un cluster Kubernetes sur des serveurs CentOS/RHEL 7. Attention cet article est un gros morceau !&lt;/p&gt;
&lt;p&gt;Pour ceux qui ne connaissent pas Kubernetes, il faut savoir que c’est un des leaders dans le domaine des orchestrateurs de containers Docker ou Rkt.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/06/kubernetes01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Un bel empilage de couches, pour au final exécuter des applications dans des containers LXC (ou Windows)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pour ce qui est de la genèse de Kubernetes, c’est un outil dont le code provient de Borg d’un outil maison de chez Google. Au bout de 10 ans d’utilisation, quand les containers Linux ont commencés à percer, le code source a été légué en 2015 à la &lt;a class="link" href="https://www.cncf.io/" target="_blank" rel="noopener"
&gt;CNCF (Cloud Native Computing Foundation)&lt;/a&gt;. L’outil est donc maintenant open source.&lt;/p&gt;
&lt;p&gt;Sa couverture fonctionnelle est (pour l’instant) supérieure à celle de &lt;a class="link" href="https://blog.zwindler.fr/2017/01/31/premiers-pas-avec-swarm-fr/" &gt;Docker Swarm&lt;/a&gt;, notamment grâce à :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;une gestion de la multitenancy via les namespaces&lt;/li&gt;
&lt;li&gt;une gestion des secrets (bien que limitée)&lt;/li&gt;
&lt;li&gt;une gestion des replicas pour un même container, avec scale-up/down&lt;/li&gt;
&lt;li&gt;une gestion native du loadbalancing&lt;/li&gt;
&lt;li&gt;une gestion des rolling upgrades&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un article sympa d’Octo &lt;a class="link" href="http://blog.octo.com/docker-en-production-la-bataille-sanglante-des-orchestrateurs-de-conteneurs/" target="_blank" rel="noopener"
&gt;résume pas mal l’écosystème et la guerre qui fait rage dans ce domaine&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="prérequis"&gt;Prérequis
&lt;/h2&gt;&lt;p&gt;Avant de commencer le tutoriel, il faut déjà avoir une bonne connaissance de l’écosystème de la containerisation (sujet sur lequel &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=container" &gt;j’ai écris quelques articles&lt;/a&gt; mais qui est bien plus vaste que ça!).&lt;br&gt;
Il faut savoir que Kubernetes est aussi un outil assez complet mais complexe, avec ses propres concepts et sa terminologie associée. Je vous conseille d’abord de vous familiariser avec ces concepts sur &lt;a class="link" href="https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes" target="_blank" rel="noopener"
&gt;un des tutos de Digital Ocean (ils sont souvent très biens fait)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pour ceux qui sont extrêmement pressés, on peut dire brièvement que, dans la terminologie Kubernetes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un &lt;strong&gt;Node&lt;/strong&gt; est un serveur qui exécute les applications&lt;/li&gt;
&lt;li&gt;le &lt;strong&gt;Kubelet&lt;/strong&gt; est un service (au sens démon) présent sur tous les nodes qui leur permet de discuter et de recevoir les ordres&lt;/li&gt;
&lt;li&gt;un &lt;strong&gt;Pod&lt;/strong&gt;, généralement décrit comme « la plus petite unité de traitement de Kubernetes ». Il est composé d’un ou plusieurs containers et on le caractérise généralement comme « &lt;strong&gt;une&lt;/strong&gt; application »&lt;/li&gt;
&lt;li&gt;un &lt;strong&gt;Service&lt;/strong&gt; représente un répartiteur de charge qui est conscient de la présence d’un ensemble de containers (backend) et qui permet de rediriger les flux entrants vers eux&lt;/li&gt;
&lt;li&gt;un &lt;strong&gt;Deployment&lt;/strong&gt; est un ensemble de sous éléments (comme les Pods et les Services, mais aussi d’autres que je ne présentent pas) qui permet de déployer une application avec toutes ses caractéristiques (volumes, secrets) et ses contraintes (nombres de réplicas)&lt;/li&gt;
&lt;li&gt;toutes les interactions avec Kubernetes se font avec une seule commande : &lt;strong&gt;kubeadm&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/06/kubernetes02.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Source : kubernetes.io&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="solutions-de-déploiement"&gt;Solutions de déploiement
&lt;/h2&gt;&lt;p&gt;D’abord, la première chose à dire est qu’il existe de nombreuses manières de déployer Kubernetes qui a donc créé un page dédiée à centraliser &lt;a class="link" href="https://kubernetes.io/docs/setup/" target="_blank" rel="noopener"
&gt;l’ensemble des solutions possibles&lt;/a&gt;. Et elle est longue !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/05/kubernetes2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ceci n’est qu’une fraction des solutions actuellement proposées sur le site. Ça ne rentre pas sur mon écran 29 pouces&amp;hellip;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dans mon cas, je suis parti du plus simple pour moi, avec les ressources que j’ai à disposition, c’est à dire 2 machines virtuelles sous CentOS 7.3 :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;controlplane01 : 192.168.100.100&lt;/li&gt;
&lt;li&gt;worker01 : 192.168.100.101&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour autant, les solutions avec Vagrant ou sur des clouds publics sont aussi des solutions valables pour commencer si vous maitrisez ces outils. Je vous laisserai regarder la documentation associée si ça vous intéresse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A noter&lt;/strong&gt;, en fonction de la solutions choisie, il existe aussi des considérations réseaux à avoir, et &lt;a class="link" href="https://kubernetes.io/docs/concepts/cluster-administration/networking/" target="_blank" rel="noopener"
&gt;elles sont documentées ici&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="le-plus-simple--minikube"&gt;Le plus simple : Minikube
&lt;/h2&gt;&lt;p&gt;Je ne vais pas m’attarder sur cette méthode mais celle qui me semble vraiment la plus simple si vous voulez commencer rapidement à jouer avec Kubernetes est d’utiliser &lt;strong&gt;minikube&lt;/strong&gt;. Elle utilise de la virtualisation pour déployer l’environnement Kubernetes de manière automatisée sur votre poste et ça fonctionne très bien.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;minikube start
Starting local Kubernetes cluster...
Running pre-create checks...
Creating machine...
Starting local Kubernetes cluster...
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="la-solution-de-larticle--utiliser-kubeadm"&gt;La solution de l’article : Utiliser Kubeadm
&lt;/h2&gt;&lt;p&gt;On ne va pas se le cacher, installer Kubernetes à la main est complexe. Tellement complexe qu’il existe de nombreuses méthodes clé en main pour automatiser le processus.&lt;/p&gt;
&lt;p&gt;La solution que je vous présente ici est un script qui package l’installation des différents composants de Kubernetes. Ces composants sont en fait containerisés pour faciliter leur déploiement.&lt;/p&gt;
&lt;p&gt;La documentation officielle de cette méthode est disponible à l’adresse &lt;a class="link" href="https://kubernetes.io/docs/getting-started-guides/kubeadm/" target="_blank" rel="noopener"
&gt;suivante&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="configuration-des-dépôts"&gt;Configuration des dépôts
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Sur les deux nœuds&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A noter : Dans le cas où vous ne disposeriez pas d’un serveur DNS en propre, le plus simple est de configurer sur vos deux machines leurs noms complets dans le fichier « hosts ». Cela vous évitera des bugs et effets de bords.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;echo &amp;#34;192.168.100.100 controlplane01.example.org
192.168.100.101 worker01.example.org&amp;#34; &amp;gt;&amp;gt; /etc/hosts
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Configurer les repositories officiels :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF &amp;gt; /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://yum.kubernetes.io/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
#yum install -y yum-utils
#yum-config-manager \
# --add-repo \
# https://download.docker.com/linux/centos/docker-ce.repo
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;J’ai volontairement commenté l’ajout du dépôt de Docker car à date, la dernière version de Kubernetes n’a pas encore complètement validé les dernières versions de Docker (celles depuis le grand renommage, qui sont sur le modèle YY.MM comme la 17.03). C’est pourquoi j’utilise dans ce tutoriel la version packagée par mon OS, la 1.12.6.&lt;/p&gt;
&lt;h3 id="selinux"&gt;SELinux
&lt;/h3&gt;&lt;p&gt;A l’heure actuelle, SELinux est mal supporté par kubelet, le client de Kubernetes présent sur chaque machine. Il est donc malheureusement nécessaire de désactiver cette sécurité pour pouvoir utiliser Kubernetes, pour l’instant.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Disabling SELinux by running setenforce 0 is required in order to allow containers to access the host filesystem, which is required by pod networks for example. You have to do this until SELinux support is improved in the kubelet.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il se peut aussi que le firewall pose des problèmes s’il est activé et mal configuré&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;firewalld is active, please ensure ports [6443 10250] are open or your cluster may not function correctly&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dans le cadre d’un PoC, on pourra éventuellement se permettre de désactiver le firewall et SELinux si on estime que l’environnement est suffisamment sécurisé. C’est bien entendu hors de question pour tout autre environnement non éphémère !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;setenforce 0
vi /etc/selinux/config
[...]
SELINUX=disabled
systemctl disable firewalld
systemctl stop firewalld
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="installation-des-packages"&gt;Installation des packages
&lt;/h3&gt;&lt;p&gt;Comme dit plus haut, j’installe la version Docker de l’OS et non la dernière version. Dans les versions suivantes, Kubernetes aura probablement rattrapé ce retard (si ce n’est pas déjà le cas). On termine par démarrer Docker puis le démon kubelet.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;yum install -y docker kubelet kubeadm kubectl kubernetes-cni
#yum install -y docker-ce kubelet kubeadm kubectl kubernetes-cni
systemctl enable docker &amp;amp;&amp;amp; systemctl start docker
systemctl enable kubelet &amp;amp;&amp;amp; systemctl start kubelet
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="initialisation-du-cluster"&gt;Initialisation du cluster
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Sur le controlplane&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Maintenant que les prérequis sont installés, on peut démarrer Kubernetes. L’ensemble des commandes de Kubernetes utilise le binaire kubeadm et la première à utiliser est kubeadm init.&lt;/p&gt;
&lt;p&gt;Attention cependant, la commande kubeadm init peut nécessiter des arguments complémentaires en fonction du fournisseur de réseau qui sera choisi.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubeadm init
#ou
kubeadm init --pod-network-cidr 10.244.0.0/16 #Si on utilise flannel
#ou
kubeadm init --pod-network-cidr=192.168.0.0/16 #Si on utilise Calico
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si vous avez un proxy chez vous, n’hésitez pas d’exporter la variable http_proxy et à configurer docker pour l’utiliser (voir &lt;a class="link" href="https://stackoverflow.com/questions/23111631/cannot-download-docker-images-behind-a-proxy" target="_blank" rel="noopener"
&gt;ce thread sur stackoverflow&lt;/a&gt;).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;export http_proxy=http://@IP_proxy.zwindler.fr:8080/
export no_proxy=localhost,127.0.0.0,[@IP_control_plane]
mkdir /etc/systemd/system/docker.service.d
cat &amp;gt; /etc/systemd/system/docker.service.d/http-proxy.conf &amp;lt;&amp;lt; EOF
[Service]
Environment=&amp;#34;HTTP_PROXY=http://@IP_proxy.zwindler.fr:8080/&amp;#34;
EOF
systemctl daemon-reload
systemctl restart docker
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On termine l’initialisation côté serveur controlplane avec les commandes suivantes (indiquées dans le retour donné par le kubeadm init) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A noter, en toute fin de retour, kubeadm nous donne la ligne de commande nécessaire pour ajouter des nœuds supplémentaires au cluster via un token. Copiez et conservez cette partie pour plus tard. NE PAS LE FAIRE MAINTENANT !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#You can now join any number of machines by running the following on each node
#as root:
# kubeadm join --token &amp;lt;token&amp;gt; &amp;lt;ip_controlplane&amp;gt;:6443
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, le cluster va s’initialiser et déployer tous les containers nécessaires. Cela peut prendre un certain temps et certains containers peuvent passer par un état Fail, mais au final tout doit être dans l’état « Running », à l’exception des kube-dns*.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system etcd-controlplane01.example.org 1/1 Running 0 13m
kube-system kube-apiserver-controlplane01.example.org 1/1 Running 0 12m
kube-system kube-controller-manager-controlplane01.example.org 1/1 Running 0 13m
kube-system kube-dns-3913472980-gnt72 0/3 Pending 0 13m
kube-system kube-proxy-4m1nd 1/1 Running 0 13m
kube-system kube-scheduler-controlplane01.example.org 1/1 Running 0 13m
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Vérifiez la présence du controlplane avec la commande :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl get nodes
NAME STATUS AGE VERSION
controlplane01.example.org NotReady 12m v1.6.2
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A noter : Le Nœud restera à NotReady tant que les containers « kube-dns- » ne seront pas démarrés. Or, les « kube-dns- » ne démarreront pas tant que la configuration des « Network Pods » n’est pas faite (on va voir ça plus loin), ce qui est donc normal pour l’instant.&lt;/p&gt;
&lt;h3 id="waiting-for-the-control-plane-to-become-ready-qui-ne-rend-jamais-la-main"&gt;« waiting for the control plane to become ready » qui ne rend jamais la main
&lt;/h3&gt;&lt;p&gt;En cas de blocage sur l’étape « &lt;em&gt;[apiclient] Created API client, waiting for the control plane to become ready&lt;/em&gt;« , vérifier les logs dans &lt;strong&gt;/var/log/messages&lt;/strong&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Apr 26 16:27:58 controlplane01 kubelet: error: failed to run Kubelet: failed to create kubelet: misconfiguration: kubelet cgroup driver: &amp;#34;cgroupfs&amp;#34; is different from docker cgroup driver: &amp;#34;systemd&amp;#34;
Apr 26 16:27:58 controlplane01 systemd: kubelet.service: main process exited, code=exited, status=1/FAILURE
Apr 26 16:27:58 controlplane01 systemd: Unit kubelet.service entered failed state.
Apr 26 16:27:58 controlplane01 systemd: kubelet.service failed.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ceci est du à un &lt;a class="link" href="https://github.com/kubernetes/kubernetes/issues/43805" target="_blank" rel="noopener"
&gt;bug de kubeadm sur CentOS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Il n’y a pas vraiment de solution à partir de là. On ne peut pas utiliser « kubeadm reset » pour désinstaller proprement car cela supprime le fichier &lt;strong&gt;10-kubeadm.conf&lt;/strong&gt;, celui qui doit être corrigé/modifié.&lt;br&gt;
La seule possibilité d’est d’interrompre le processus « kubeadm init », de modifier le 10-kubeadm.conf puis de recommencer.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[CTRL-C]
sed -i &amp;#39;s#Environment=&amp;#34;KUBELET_KUBECONFIG_ARGS=-.*#Environment=&amp;#34;KUBELET_KUBECONFIG_ARGS=--kubeconfig=/etc/kubernetes/kubelet.conf --require-kubeconfig=true --cgroup-driver=systemd&amp;#34;#g&amp;#39; /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
systemctl daemon-reload
systemctl restart kubelet
#Puis relancer
kubeadm init #--pod-network-cidr 10.244.0.0/16
[kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters.
[init] Using Kubernetes version: v1.6.2
[init] Using Authorization mode: RBAC
[preflight] Running pre-flight checks
[preflight] WARNING: docker version is greater than the most recently validated version. Docker version: 17.03.1-ce. Max validated version: 1.12
[preflight] Some fatal errors occurred:
/etc/kubernetes/manifests is not empty
[preflight] If you know what you are doing, you can skip pre-flight checks with `--skip-preflight-checks`
kubeadm init --skip-preflight-checks
#Là, ça devrait fonctionner
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="taint-node"&gt;Taint node
&lt;/h3&gt;&lt;p&gt;Par défaut, Kubernetes n’utilise pas le controlplane pour faire tourner des pods. Si vous voulez changer ce comportement, on peut le faire avec la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl taint nodes --all node-role.kubernetes.io/controlplane-
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="configuration-des-network-pods"&gt;Configuration des Network Pods
&lt;/h2&gt;&lt;p&gt;La première chose à configurer sur le cluster est le « Network Pod ». On a le choix entre un certain nombre de modules, dont la liste est disponible sur &lt;a class="link" href="https://kubernetes.io/docs/concepts/cluster-administration/addons/" target="_blank" rel="noopener"
&gt;cette documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="flannel"&gt;Flannel
&lt;/h3&gt;&lt;p&gt;La configuration la plus couramment utilisée semble être flannel (de CoreOS), donc le fichier de configuration yaml est disponible sur Github&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sur le controlplane&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
serviceaccount &amp;#34;flannel&amp;#34; created
configmap &amp;#34;kube-flannel-cfg&amp;#34; created
daemonset &amp;#34;kube-flannel-ds&amp;#34; created
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="calico"&gt;Calico
&lt;/h3&gt;&lt;p&gt;On peut aussi essayer &lt;a class="link" href="http://docs.projectcalico.org/v2.1/getting-started/kubernetes/installation/hosted/kubeadm/" target="_blank" rel="noopener"
&gt;Calico&lt;/a&gt;. Personnellement j’ai eu des disfonctionnement avec la version Flannel et donc j’utilise Calico.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sur le controlplane&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl apply -f http://docs.projectcalico.org/v2.4/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml
configmap &amp;#34;calico-config&amp;#34; created
daemonset &amp;#34;calico-etcd&amp;#34; created
service &amp;#34;calico-etcd&amp;#34; created
daemonset &amp;#34;calico-node&amp;#34; created
deployment &amp;#34;calico-policy-controller&amp;#34; created
clusterrolebinding &amp;#34;calico-cni-plugin&amp;#34; created
clusterrole &amp;#34;calico-cni-plugin&amp;#34; created
serviceaccount &amp;#34;calico-cni-plugin&amp;#34; created
clusterrolebinding &amp;#34;calico-policy-controller&amp;#34; created
clusterrole &amp;#34;calico-policy-controller&amp;#34; created
serviceaccount &amp;#34;calico-policy-controller&amp;#34; created
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Les pods pour le réseaux se créent. Vérifiez que tout a bien fonctionné avant d’ajouter des nœuds dans le cluster :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl get pods --all-namespaces
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="ajout-de-nœuds-supplémentaires"&gt;Ajout de nœuds supplémentaires
&lt;/h2&gt;&lt;p&gt;A partir de cette étape, le cluster Kubernetes fonctionne réellement, tous les composants sont opérationnels, à ceci près que c’est un cluster avec seulement une machine. On peut donc maintenant intégrer les machines supplémentaires.&lt;/p&gt;
&lt;p&gt;Récupérez la commande avec le token que vous avez conservé précédemment (lors du kubeadm init) et exécutez la sur le nœud « worker ».&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sur le worker&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubeadm join --token &amp;lt;token&amp;gt; 192.168.100.100:6443
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si on obtient l’erreur suivante, il faut ajouter 2 lignes dans le fichier « sysctl.conf » et appliquer la modification.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[preflight] Some fatal errors occurred:
/proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
[preflight] If you know what you are doing, you can skip pre-flight checks with `--skip-preflight-checks`
echo &amp;#34;net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1&amp;#34; &amp;gt;&amp;gt; /etc/sysctl.conf
sysctl -p
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Sur le controlplane&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Vérifier la présence du controlplane et de son worker avec la commande kubectl :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl get nodes
NAME STATUS AGE VERSION
worker01.example.org NotReady 1m v1.6.2
controlplane01.example.org Ready 33m v1.6.2
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="déployer-la-console-web"&gt;Déployer la console web
&lt;/h2&gt;&lt;p&gt;Bravo, votre cluster Kubernetes fonctionne !&lt;/p&gt;
&lt;p&gt;Un bon moyen de débuter est d’installer la WebUI de Kubernetes. Comme tout le reste sur Kubernetes, elle se déploie simplement avec un fichier YAML. La documentation officielle est &lt;a class="link" href="https://kubernetes.io/docs/tasks/web-ui-dashboard/" target="_blank" rel="noopener"
&gt;disponible à cette adresse&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Add kubernetes-dashboard repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Deploy a Helm Release named &amp;#34;kubernetes-dashboard&amp;#34; using the kubernetes-dashboard chart&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La console est déployée. Elle est accessible de 2 manières.&lt;/p&gt;
&lt;h3 id="kubectl-proxy"&gt;kubectl proxy
&lt;/h3&gt;&lt;p&gt;Cette sous commande kubectl permet de faire un tunnel entre le poste depuis lequel la commande est lancée et le serveur exécutant les pods. Cette commande est pratique pour tester les connexions à des pods sans avoir à travailler sur le serveur (depuis son poste par exemple).&lt;/p&gt;
&lt;p&gt;Le Dashboard deviendra accessible via l’URL :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;http://localhost:8001/ui&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cependant, dans ce cas là, l’interface ne sera disponible que depuis votre poste, ce qui peut ne pas vous convenir.&lt;/p&gt;
&lt;h3 id="via-le-serveur-controlplane"&gt;Via le serveur controlplane
&lt;/h3&gt;&lt;p&gt;On peut également accéder à la console directement depuis l’URL /ui, qui pointe sur le serveur « controlplane » (controlplane01 dans notre cas).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;https://@ip_controlplane]/ui&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La console demandera un login/mdp que l’on peut retrouver avec kubectl&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubectl config view
&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;Ça y est, vous savez tout.&lt;/p&gt;
&lt;p&gt;Vous êtes maintenant en mesure de déployer vos premières applications avec Kubernetes, et vous amuser à Scale-up &amp;amp; scale-down, faire des rolling upgrades, tester la haute disponibilité et la répartition de charge !&lt;/p&gt;
&lt;p&gt;Have fun :)&lt;/p&gt;</description></item><item><title>Comprendre et configurer SELinux sur RHEL</title><link>https://blog.zwindler.fr/2016/10/26/comprendre-configurer-selinux-rhel-7/</link><pubDate>Wed, 26 Oct 2016 12:00:13 +0000</pubDate><guid>https://blog.zwindler.fr/2016/10/26/comprendre-configurer-selinux-rhel-7/</guid><description>&lt;img src="https://blog.zwindler.fr/2016/10/selinux.webp" alt="Featured image of post Comprendre et configurer SELinux sur RHEL" /&gt;&lt;h2 id="présentation"&gt;Présentation
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Security-Enhanced Linux, abrégé SELinux, est un Linux security module (LSM), qui permet de définir une politique de contrôle d’accès obligatoire aux éléments d’un système issu de Linux.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wikipedia&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Des fois, pas la peine de chercher plus loin : les définitions sont techniques sur Wikipedia sont souvent très bonnes et concises.&lt;/p&gt;
&lt;p&gt;Concrètement, SELinux permet de n’autoriser des processus ou des groupes de processus à ne réaliser &lt;strong&gt;que&lt;/strong&gt; des opérations (écrire dans tel FS, ouvrir un port, etc) qui sont légitimes par rapport à leur utilisation. L’avantage : en cas de vulnérabilité sur tel ou tel processus, l’attaquant sera limité aux fonctionnalités normalement utilisées par le processus en question, lui compliquant la tâche.&lt;/p&gt;
&lt;p&gt;Par défaut, SELinux est activé sur tous les serveurs RHEL mais il est souvent désactivé pour pallier certains effets de bords difficilement décelables (charge CPU très importante, plantages de certaines fonctions d’un logiciels).&lt;/p&gt;
&lt;p&gt;Je me souviens avoir lu un jour un fervent défenseur de ce mécanisme de sécurité le qualifier de logiciel le plus incompris de Linux et je suis assez en phase avec cette analyse, tant il est courant de voir comme premier élément d’une procédure d’installation « Désactivez SELinux », même de la part de grandes multinationales comme IBM&amp;hellip;&lt;/p&gt;
&lt;p&gt;Pour autant, comme toute mesure de sécurité, il n’est évidement pas conseillé de le désactiver, même si cela demande effectivement un peu plus de travail ;-). Et comme tout système, il n’est évidemment pas infaillible non plus donc n’allez pas nécessairement vous croire sortir couvert (plusieurs failles ont été remontées).&lt;/p&gt;
&lt;h2 id="commandes-de-gestion-de-selinux"&gt;Commandes de gestion de SELinux
&lt;/h2&gt;&lt;h3 id="afficher-létat-actuel"&gt;Afficher l’état actuel
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;getenforce
Disabled
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;SELinux est complètement désactivé&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;getenforce
Permissive
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;SELinux n&amp;rsquo;empêche pas les processus de réaliser des actions non préalablement autorisées mais logue tous les accès non autorisés dans &lt;em&gt;/var/log/messages&lt;/em&gt;. Pour autant, certains effets de bords (comme des surcharges CPU) peuvent quand même apparaitre&amp;hellip;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;getenforce
Enforcing
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;SELinux est activé. Toutes les actions non préalablement autorisées sont bloquées par sécurité et logué dans &lt;em&gt;/var/log/audit/audit.log&lt;/em&gt; et &lt;em&gt;/var/log/messages&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id="ajout-dautorisations-selinux"&gt;Ajout d’autorisations SELinux
&lt;/h3&gt;&lt;p&gt;Par défaut lorsque SELinux est réglé sur &lt;em&gt;Permissive&lt;/em&gt; ou &lt;em&gt;Enforcing&lt;/em&gt;, chaque action non autorisée génère une remontée dans &lt;em&gt;/var/log/messages&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Exemple de message dans &lt;em&gt;messages&lt;/em&gt; :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Oct 16 03:43:38 tstbench01 setroubleshoot: SELinux is preventing /usr/bin/bash from getattr access on the file /usr/bin/sudo. For complete SELinux messages. run sealert -l 9a71f3f1-e624-470a-99ae-af04934769e3
Oct 16 03:43:38 tstbench01 python: SELinux is preventing /usr/bin/bash from getattr access on the file /usr/bin/sudo.
***** Plugin catchall (100. confidence) suggests **************************
If you believe that bash should be allowed getattr access on the sudo file by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# grep sh /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;SELinux a beaucoup évolué et est maintenant relativement simple a administrer. L’ensemble des erreurs provoquées par les modes &lt;em&gt;Enforcing&lt;/em&gt; et &lt;em&gt;Permissive&lt;/em&gt; sont logués dans &lt;em&gt;/var/log/messages&lt;/em&gt; et indiquent la marche à suivre pour corriger le problème.&lt;/p&gt;
&lt;h4 id="exemple-de-résolution-pour-des-plugins-nagios-exécutés-via-nrpe"&gt;Exemple de résolution pour des plugins Nagios exécutés via NRPE
&lt;/h4&gt;&lt;p&gt;Le check &lt;strong&gt;check_cpu_stats&lt;/strong&gt; ne fonctionne pas correctement à cause de SELinux et provoque de fausse alertes sur l’utilisation du CPU. On peut créer un fichier de définitions et le réutiliser pour d’autres serveurs.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;grep check_cpu_stats /var/log/audit/audit.log | audit2allow -M nrpe
******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i nrpe.pp
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;La commande &lt;strong&gt;audit2allow&lt;/strong&gt; parse le log &lt;strong&gt;audit.log&lt;/strong&gt; puis consolide les autorisations à ajouter dans un fichier de définitions. On peut directement corriger le problème simplement en exécutant la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;semodule -i nrpe.pp
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si on souhaite savoir quelles autorisations ont été ajoutés, il est possible de consulter les règles en ouvrant le fichier nrpe.te et éventuellement y réaliser des modifications si nécessaire.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat nrpe.te
module nrpe 1.0;
require {
type nrpe_t;
type tmp_t;
type var_lib_t;
class dir { write remove_name add_name };
class file { execute read create getattr execute_no_trans write ioctl unlink open };
}
#============= nrpe_t ==============
allow nrpe_t tmp_t:dir { write remove_name add_name };
allow nrpe_t tmp_t:file { write create unlink open };
allow nrpe_t var_lib_t:file { ioctl execute read open getattr execute_no_trans };
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ici, on voit que le plugin souhaite effectuer des opérations sur /var/lib et /tmp.&lt;/p&gt;
&lt;p&gt;Ce fichier « .te » modifié ne peut pas être directement appliqué sur le serveur. Il devra être compilé avant de pouvoir être appliqué sur les serveurs.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;checkmodule -M -m -o nrpe.mod nrpe.te
semodule_package -o nrpe.pp -m nrpe.mod
semodule -i nrpe.pp
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Une fois compilé et installé sur le serveur, le fichier « .pp » se retrouve dans un dossier spécifique de SELinux.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;updatedb
locate nrpe
/etc/selinux/targeted/modules/active/modules/nrpe.pp
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On peut ensuite propager ce fichier de définition de sécurité sur tous les serveurs concernés.&lt;/p&gt;
&lt;h3 id="modification-manuelle-de-la-politique-de-sécurité"&gt;Modification manuelle de la politique de sécurité
&lt;/h3&gt;&lt;p&gt;ATTENTION : la commande &lt;strong&gt;setenforce&lt;/strong&gt; ne survie pas au reboot.&lt;/p&gt;
&lt;p&gt;Passer de &lt;em&gt;Enforcing&lt;/em&gt; à &lt;em&gt;Permissive&lt;/em&gt; (pas possible de passer directement à &lt;em&gt;Disabled&lt;/em&gt;).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;setenforce 0
getenforce
Permissive
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Passer à &lt;em&gt;Enforcing&lt;/em&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;setenforce 1
getenforce
Enforcing
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour faire des modifications permanentes, il est nécessaire de modifier le fichier &lt;strong&gt;/etc/selinux/config&lt;/strong&gt;. La valeur a modifier est &lt;strong&gt;SELINUX=&lt;/strong&gt; avec comme choix &lt;em&gt;enforcing&lt;/em&gt;, &lt;em&gt;permissive&lt;/em&gt; ou &lt;em&gt;disabled.&lt;/em&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinu security policy is enforced.
# permissive - SELinu prints warnings instead of enforcing.
# disabled - No SELinu policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;ATTENTION : une erreur dans ce fichier (même une simple faute de frappe) aura pour effet de bloquer la machine au boot. Il faudra passer en mode maintenance ou rescue pour éditer et corriger le fichier. Prudence donc !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RAPPEL : Comme tout mécanisme de sécurité, il est évidemment fortement déconseillé de désactiver SELinux de façon permanente !&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="désactivation-automatisée"&gt;Désactivation automatisée
&lt;/h3&gt;&lt;p&gt;Pour ceux qui utilisent Ansible, sachez qu’il existe également un module officiel permettant de activer/désactiver SELinux.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat no_selinux.yml
---
# Playbook pour couper SE Linux
- name: &amp;#34;No SE Linux&amp;#34;
hosts: all
remote_user: root
tasks:
- selinux: state=disabled
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="sources"&gt;Sources
&lt;/h2&gt;&lt;p&gt;Un article détaillant de manière plus complète SELinux est disponible sur &lt;a class="link" href="https://wiki.centos.org/HowTos/SELinux" target="_blank" rel="noopener"
&gt;les HowTos de CentOS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Et aussi :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.microlinux.fr/selinux" target="_blank" rel="noopener"
&gt;SELinux expliqué aux administrateurs frileux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Le guide de déploiement de CentOS (lien mort, pas dispo sur Internet Archive)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://web.archive.org/web/20220823151858/http://selinux.gave.me.this.remoteshell.org/" target="_blank" rel="noopener"
&gt;Les limites de la sécurité apportée par SELinux (lien mort, j&amp;rsquo;utilise Internet Archive)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Tutoriel] Installation d’Oracle VM for x86 – partie 2</title><link>https://blog.zwindler.fr/2016/10/18/tutoriel-installation-doracle-vm-for-x86-part-2/</link><pubDate>Tue, 18 Oct 2016 12:00:57 +0000</pubDate><guid>https://blog.zwindler.fr/2016/10/18/tutoriel-installation-doracle-vm-for-x86-part-2/</guid><description>&lt;img src="https://blog.zwindler.fr/2016/10/oracle-vm.webp" alt="Featured image of post [Tutoriel] Installation d’Oracle VM for x86 – partie 2" /&gt;&lt;p&gt;Cet article fait suite à l’article &lt;a class="link" href="https://blog.zwindler.fr/2016/10/11/tutoriel-installation-doracle-vm-for-x86-part-1/" &gt;&lt;strong&gt;Installation d’Oracle VM for x86 - partie 1&lt;/strong&gt;&lt;/a&gt; dans lequel j’ai introduis Oracle VM et installé la console de management Oracle VM Manager. Je vous conseille de commencer par là ;-).&lt;/p&gt;
&lt;h2 id="connexion-du-serveur-oracle-vm-avec-la-console-ovmm"&gt;Connexion du serveur Oracle VM avec la console OVMM
&lt;/h2&gt;&lt;p&gt;Maintenant que la console OVMM est opérationnelle et qu’on a pu s’y connecter, on remarque que les menus sont assez intuitifs bien qu’un peu austères !&lt;/p&gt;
&lt;p&gt;Un onglet Health donne l’état général de la plateforme, puis les autres onglets permettent de configurer les différents aspects attendus d’une console d’administration de virtualisation x86.&lt;/p&gt;
&lt;p&gt;La première étape pour nous est donc bien entendu d’ajouter dans OVMM le serveur Oracle VM préalablement installé, au même titre qu’on pourrait le faire avec un ESXi dans un vCenter.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Hormis les icônes pas forcément très parlantes, le menu de « découverte » de nouveaux serveurs est très simple. On a juste besoin de l’IP et du compte OVM Agent créé lors du déploiement de l’ISO d’installation.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm2-1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;En bas de l’écran, un bandeau vous donne l’état des dernières opérations déclenchées sur le cluster.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm3-1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm4-1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Un bref coup d’œil permet de voir que le serveur est bien ajouté. Des informations sur sa configuration s’affichent.&lt;/p&gt;
&lt;h2 id="créer-un-groupe-de-serveurs-server-pool"&gt;Créer un groupe de serveurs « server pool »
&lt;/h2&gt;&lt;p&gt;Vous aurez peut être remarqué que votre serveur de virtualisation a été ajouté dans le groupe de serveurs « Unassigned ». Intellectuellement ça me gène, et j’ai donc voulu créer un groupe de serveurs, pour « faire propre ».&lt;/p&gt;
&lt;p&gt;Au delà de ça, c’est notamment via la création de ces groupes (clusters dans VMware) que l’on peut gérer la haute disponibilité et les clusters de machines. C’est donc plutôt important ;-).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm4-1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Ce groupe peut se créer via l’icône située juste à droite de celle sur laquelle nous avons cliqué pour « découvrir » le serveur Oracle VM.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm20.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm21.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm22.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm23.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Cependant, lorsque j’ai tenté de créer mon groupe de serveurs, j’ai reçu l’erreur suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;OVMAPI_4010E Attempt to send command: create_server_pool to server: lab01 failed.
OVMAPI_4004E Sync command failed on server: x.x.x.32.
Command: create_server_pool, Server error: org.apache.xmlrpc.XmlRpcException: &amp;lt;type &amp;#39;exceptions.Exception&amp;#39;&amp;gt;:
Invalid hostname resolution: lab01 -&amp;gt; 127.0.0.1 [Wed Jul 20 16:30:40 CEST 2016]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Lors de l’installation automatique de l’ISO Oracle VM, le hostname lab01 a été ajouté par défaut dans le fichier &lt;strong&gt;/etc/hosts&lt;/strong&gt;. Or, ceci pose problème.&lt;/p&gt;
&lt;p&gt;Connectez vous en SSH sur le serveur et retirez le hostname (ici lab01) du fichier &lt;strong&gt;/etc/hosts&lt;/strong&gt; :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi /etc/hosts
127.0.0.1 lab01 localhost localhost.localdomain localhost4 localhost4.localdomain4
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="création-de-pools-de-stockage"&gt;Création de pools de stockage
&lt;/h2&gt;&lt;p&gt;La seconde opération consiste à ajouter du stockage au cluster.&lt;/p&gt;
&lt;p&gt;Avec Oracle VM, on peut utiliser du stockage local via des disques inutilisés. La procédure est détaillée à &lt;a class="link" href="https://docs.oracle.com/cd/E26996_01/E18549/html/CHDIGACB.html" target="_blank" rel="noopener"
&gt;l’adresse suivante&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On peut également découvrir des cibles iSCSI ou éventuellement utiliser l’espace disponible sur le filesystem local. Pour ce dernier choix, l’espace ne sera cependant bien entendu uniquement visible depuis le serveur local uniquement.&lt;/p&gt;
&lt;p&gt;Pour l’exemple, j’ai créé un disque de test de 200 Go sur un NAS Windows.&lt;/p&gt;
&lt;p&gt;La procédure est la suivante. On commence par ouvrir l’onglet « Storage ». Dans SAN Servers, il n’y a encore aucun serveur déclaré. Au même titre que pour le serveur de virtualisation, il y a un bouton « Discover SAN Server ».&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm5.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm6.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm7.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On peut déclarer un ou plusieurs hôtes, avec ou non de l’authentification. J’ai rarement vu des contextes où l’authentification CHAP (côté client ou serveur) était activée, mais je trouve ça bien en production. Pour autant, dans le cas du PoC je n’en ai pas mis.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm8.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Editer les access groups&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm12.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm11.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et enfin, on ajoute les serveurs qui peuvent avoir accès aux périphériques de stockage. Ici lab01.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm9.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Cliquer sur Finish pour valider.&lt;/p&gt;
&lt;p&gt;Dans mon cas, juste avec la configuration de cet article, je suis tombé sur l’erreur suivante. A l’écran d’avant j’avais loupé la modification des access groups et en particulier l’onglet storage initiators. Si vous avez une erreur, c’est surement le même problème.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm10.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Le stockage nouvellement intégré apparait maintenant avec les volumes disponibles&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm13.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm15.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm14.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="créer-des-repositories-pour-stocker-des-images"&gt;Créer des repositories pour stocker des images
&lt;/h2&gt;&lt;p&gt;Une fois les périphériques de stockage déclarés auprès de vos serveurs de virtualisation, on peut maintenant créer des pools appelés repositories.&lt;/p&gt;
&lt;p&gt;L’ensemble des opérations qui suivent sont a effectuer dans l’onglet Repositories. Ces pools logiques de stockage vous permettent de stocker vos fichiers ISO, mais aussi vos templates et vos disques durs virtuels pour vos machines virtuelles. Sur VMware on parlerait de &lt;strong&gt;Datastores&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="avec-le-disque-local"&gt;Avec le disque local
&lt;/h3&gt;&lt;p&gt;Comme indiqué précédemment, ce type de stockage aura l’inconvénient de n’être accessible que d’une seule machine. Cependant c’est le plus simple à utiliser.&lt;/p&gt;
&lt;p&gt;Cliquer sur le logo « + » pour créer un nouveau repository.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm24.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On doit d’abord renseigner quelques informations descriptives et d’appartenance.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm26.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Enfin, on sélectionne le disque (Physical Disk) sur lequel placer le repository.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm25.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;La dernière étape consiste à ajouter les serveurs qui verront ce stockage. Dans ce cas précis, seul lab01 pourra le voir.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm27.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Après validation, le nouveau repository apparait dans la liste des repositories.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm28.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h3 id="avec-le-disque-san"&gt;Avec le disque SAN
&lt;/h3&gt;&lt;p&gt;Le principe est le même pour les disques SAN, à ceci près que celui ci pourra bien être partagé entre plusieurs serveurs d’un même cluster (pour peu que les serveurs concernés aient bien été autorisés à voir ce stockage lors de l’étape précédente).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm29.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm30.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="gestion-du-réseau"&gt;Gestion du réseau
&lt;/h2&gt;&lt;p&gt;Vous l’aurez deviné, pour la gestion du réseau, tout se passe dans l’onglet « Network » de la console OVMM.&lt;/p&gt;
&lt;p&gt;Petite subtilité, par défaut, le réseau de management ne peut pas être utilisé par les VMs. Vous ne pourrez donc pas affecter de réseaux virtuels aux machines virtuelles en l’état actuel des choses.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm16.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Dans mon cas (PoC), je ne souhaite pas créer un nouveau réseau pour me simplifier la vie, et j’ai donc ajouté « Virtual Machine » au réseau de &lt;em&gt;management&lt;/em&gt; créé par défaut lors de l’installation du serveur OracleVM.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm17.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm18.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Dans un contexte de production, on préfèrera en ajouter un nouveau et lui affecter des interfaces réseaux et des VLANs (comme on le ferait sur VMware ou RHEV).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm19.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="créer-une-nouvelle-vm"&gt;Créer une nouvelle VM
&lt;/h2&gt;&lt;p&gt;Maintenant que les aspects stockage et réseau ont été réglés, on peut enfin créer une machine virtuelle. La documentation officielle donne &lt;a class="link" href="https://docs.oracle.com/cd/E27300_01/E27309/html/vmusg-vm-create.html" target="_blank" rel="noopener"
&gt;quelques informations utiles sur le sujet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le début de la création de machine virtuelle est similaire à n’importe quel outil de virtualisation.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm31.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm32.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm33.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h3 id="hvm-hvm--pv-pvm"&gt;HVM, HVM + PV, PVM
&lt;/h3&gt;&lt;p&gt;Cependant, par rapport aux autres hyperviseurs (full virtualisation vs paravirtualisation, &lt;a class="link" href="https://blog.zwindler.fr/2016/08/25/when-should-we-have-containers/" &gt;différences que j’aborde dans cet article&lt;/a&gt;), Xen et donc OracleVM apporte une subtilité dans la méthode de virtualiser : la paravirtualisation (PVM). On a le choix entre HVM, HVM + PV et PVM.&lt;/p&gt;
&lt;p&gt;En réalité il s’agit de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Xen HVM:&lt;/strong&gt; Hardware virtualization, or fully virtualized&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Xen HVM, PV Drivers:&lt;/strong&gt; Identical to Xen HVM, but with additional paravirtualized drivers for improved performance&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Xen PVM:&lt;/strong&gt; Paravirtualized&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En théorie, vous aurez donc de meilleures performances lorsque vous disposerez d’un OS capable d’être paravirtualisé (mode Xen PVM) que lorsque vous aurez une HVM.&lt;/p&gt;
&lt;p&gt;Ça c’est la théorie. En fait en pratique, certains OS, même Linux, seront plus performants en HVM + PV selon Oracle. Pour plus d’informations, voir la page de &lt;a class="link" href="https://support.oracle.com/epmos/faces/DocumentDisplay?id=757719.1#aref18" target="_blank" rel="noopener"
&gt;documentation officielle qui traite du sujet&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;La liste des OS supporté pour chaque mode est disponible dans &lt;a class="link" href="http://www.oracle.com/technetwork/documentation/vm-096300.html" target="_blank" rel="noopener"
&gt;les release notes&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="créer-des-interfaces-virtuelles"&gt;Créer des interfaces virtuelles
&lt;/h3&gt;&lt;p&gt;La seconde étape du wizard permet de configurer les interfaces virtuelles et les réseaux qui y sont associés.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm34.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h3 id="ajouter-des-disques-virtuels"&gt;Ajouter des disques virtuels
&lt;/h3&gt;&lt;p&gt;L’étape d’après permet de configurer les différents périphériques qui sont associés à la VM. Dans le cas du disque dur virtuel, il faut le créer ou en réutiliser un existant.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm35.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Lorsqu’on clique sur le « + », on peut créer un nouveau disque virtuel qui sera stocké sur le repository choisi.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm36.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Enfin, on peut affecter ou non les différents périphériques éligibles à la séquence de boot et les ordonner.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm37.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Une fois la VM créée, on peut la démarrer et ouvrir sa console.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm38.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="boot"&gt;Boot
&lt;/h2&gt;&lt;p&gt;Dans l’état actuel des choses, la VM démarre mais n’a aucun disque bootable (CD ou HDD). En effet, il faut monter un ISO sur la VM, mais pour ça on doit l’uploader dans un premier temps sur un des repositories précédemment créés.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm39.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm40.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;A priori, dans le menu d’import du repository, on ne peut uploader &lt;strong&gt;que&lt;/strong&gt; des ISO &lt;strong&gt;depuis un partage web HTTP&lt;/strong&gt;. Une solution alternative probable est que l’on peut simplement aller déposer le fichier en SSH mais je trouve que clairement il manque une fonctionnalité à la console d’upload en directe depuis un navigateur !&lt;/p&gt;
&lt;p&gt;Une fois qu’on dispose d’un ISO pour booter notre VM, on peut éditer la machine virtuelle et y ajouter l’ISO.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm41.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm42.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm43.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On redémarre la machine virtuelle qui boote sur l’ISO comme souhaité.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/oraclevm44-2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="sources"&gt;Sources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://docs.oracle.com/cd/E64076_01/" target="_blank" rel="noopener"
&gt;docs.oracle.com/cd/E64076_01/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www.oracle.com/technetwork/server-storage/vm/downloads/index.html" target="_blank" rel="noopener"
&gt;www.oracle.com/technetwork/server-storage/vm/downloads/index.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://docs.oracle.com/cd/E64076_01/E64078/html/index.html" target="_blank" rel="noopener"
&gt;docs.oracle.com/cd/E64076_01/E64078/html/index.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://docs.oracle.com/cd/E64076_01/E64078/html/vmiug-server-installation.html" target="_blank" rel="noopener"
&gt;docs.oracle.com/cd/E64076_01/E64078/html/vmiug-server-installation.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Tutoriel] Installation d’Oracle VM for x86 – partie 1</title><link>https://blog.zwindler.fr/2016/10/11/tutoriel-installation-doracle-vm-for-x86-part-1/</link><pubDate>Tue, 11 Oct 2016 12:00:23 +0000</pubDate><guid>https://blog.zwindler.fr/2016/10/11/tutoriel-installation-doracle-vm-for-x86-part-1/</guid><description>&lt;img src="https://blog.zwindler.fr/2016/10/oracle-vm.webp" alt="Featured image of post [Tutoriel] Installation d’Oracle VM for x86 – partie 1" /&gt;&lt;h2 id="présentation-doracle-vm"&gt;Présentation d’Oracle VM
&lt;/h2&gt;&lt;p&gt;Dans le cadre d’un très sérieux &lt;strong&gt;&lt;em&gt;Dossier de Choix de Solution d’Infrastructure&lt;/em&gt;&lt;/strong&gt;, j’ai été amené à étudier la plateforme de virtualisation proposée par Oracle : &lt;strong&gt;Oracle VM&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Dans la lignée d’&lt;strong&gt;Oracle Unbreakable Linux&lt;/strong&gt; qui est une copie de RHEL modifiée (les sources étant disponibles sur Internet car open source), Oracle tente depuis plusieurs années de pénétrer le marché de la virtualisation de serveur, sans jamais vraiment parvenir à percer. La faute à une concurrence trop forte de VMware et Hyper-V, trop loin en tête en adoption dans les entreprises et un retard fonctionnel conséquent, surtout dans les suites logicielles périphériques (internes ou tierces) de SDS, SDN, sauvegarde, VDI, cloud, etc etc.&lt;/p&gt;
&lt;p&gt;Pourtant sur le papier, Oracle VM a de bons arguments pour séduire les administrateurs : un noyau robuste (RHEL + Xen), sans coût de licence et avec un coût de support (souscription comme chez Redhat) en 24×7 à 500$ / serveur / an en prix public, très en deçà de la concurrence moyenne !&lt;/p&gt;
&lt;p&gt;Cerise sur le gâteau, &lt;strong&gt;contrairement à l’ensemble des autres solutions de virtualisation x86&lt;/strong&gt;, Oracle permet de ne licencier que les vCPU réellement affectées aux VMs Oracle VM sur lesquelles sont installés des produits Oracle. Et c’est probablement là que le bat blesse. Dans bon nombre d’entreprises, Oracle est devenu synonyme d’audit et de changement de règles de licencing au petit bonheur la chance&amp;hellip;&lt;/p&gt;
&lt;p&gt;Ce sont quand même de sérieux atouts et je ne voyais pas passer outre un PoC pour me faire une idée du produit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Info :&lt;/strong&gt; Pour plus de lisibilité j’ai scindé l’article en 2 parties. Celle ci concerne les prérequis pour l’ensemble des composants et l’installation de la console (non trivial) et la seconde se concentrera sur la configuration de notre premier serveur (réseau, stockage, vms).&lt;/p&gt;
&lt;h2 id="prérequis"&gt;Prérequis
&lt;/h2&gt;&lt;h3 id="oracle-vm-virtualisation"&gt;Oracle VM (virtualisation)
&lt;/h3&gt;&lt;p&gt;Pour la partie virtualisation, Oracle VM se base sur RHEL et Xen. Et ces deux composants sont peu gourmands et assez flexibles en terme de compatibilité matérielle. Vous n’aurez aucun mal à trouver un vieux serveur pour faire un PoC comme je l’ai fais.&lt;/p&gt;
&lt;p&gt;On trouve assez facilement sur le site d’Oracle les valeurs minimum pour Oracle VM 3.4. A noter quand même que les liens qui remontent dans Google pointent parfois sur des versions antérieures. Attention donc.&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
Items
&lt;/td&gt;
&lt;td&gt;
Minimum Value
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Memory
&lt;/td&gt;
&lt;td&gt;
1.0 GB
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Processor Type
&lt;/td&gt;
&lt;td&gt;
64 bit i686 P4
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Processor Speed
&lt;/td&gt;
&lt;td&gt;
1.3 GHz x 2
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Available Hard Disk Space
&lt;/td&gt;
&lt;td&gt;
6 GB
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;h3 id="oracle-vm-manager"&gt;Oracle VM Manager
&lt;/h3&gt;&lt;p&gt;Pour ce qui est de la console de management Oracle VM Manager, les prérequis sont par contre plus élevés, mais c’est malheureusement une habitude avec les consoles d’administration de plateforme de virtualisation (les premiers vCenter / appliances Linux plantaient dès qu’on passait sous les 8 Go de RAM).&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
Items
&lt;/td&gt;
&lt;td&gt;
Minimum Value
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Memory
&lt;/td&gt;
&lt;td&gt;
8.0 GB
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Processor Type
&lt;/td&gt;
&lt;td&gt;
64 bit
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Processor Speed
&lt;/td&gt;
&lt;td&gt;
1.83 GHz x 2
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Swap Space
&lt;/td&gt;
&lt;td&gt;
2.1 GB
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
Hard Disk Space
&lt;/td&gt;
&lt;td&gt;
5.5 GB in /u01
3 GB in /tmp
400 MB in /var
300 MB in /usr
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Vous trouverez la liste des OS compatible sur le site d’Oracle au même endroit que l’ISO pour Oracle VM Manager :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Oracle Linux 5 Update 5 64-bit&lt;/li&gt;
&lt;li&gt;Oracle Linux 6 64-bit&lt;/li&gt;
&lt;li&gt;Oracle Linux 7 64-bit&lt;/li&gt;
&lt;li&gt;Red Hat Enterprise Linux 5 Update 5 64-bit&lt;/li&gt;
&lt;li&gt;Red Hat Enterprise Linux 6 64-bit&lt;/li&gt;
&lt;li&gt;Red Hat Enterprise Linux 7 64-bit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A noter, sans surprise, il peut s’agir soit d’une machine virtuelle soit d’un serveur physique.&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation
&lt;/h2&gt;&lt;h3 id="configuration-doracle-vm-manager"&gt;Configuration d’Oracle VM Manager
&lt;/h3&gt;&lt;p&gt;Dans mon cas, j’ai installé OVMM sur un RHEL 7.&lt;/p&gt;
&lt;p&gt;Il est nécessaire d’avoir (au moins localement) une résolution du nom de la machine qui héberge l’oracle VM Manager. Idéalement, il est préférable d’avoir une résolution de nom par DNS donc, mais à minima, vous devez avoir une entrée similaire au retour de la commande hostname dans votre fichier /etc/hosts :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# hostname
ovmm01.example.org
# vi /etc/hosts
[…]
192.168.100.10 ovmm01.example.org ovmm01
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;La documentation d’Oracle vous indique que selon votre contexte, vous pouvez soit désactiver complètement votre firewall soit ajouter les règles correspondantes. L’exemple donné dans la documentation (iptables) ne fonctionne pas avec firewalld installé par défaut sur RHEL 7. Voici les bonnes commandes :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;firewall-cmd --get-active-zones
public
interfaces: eno16780032
firewall-cmd --permanent --zone=public --add-port=7002/tcpfirewall-cmd --permanent --zone=public --add-port=10000/tcp
firewall-cmd --permanent --zone=public --add-port=123/udp
firewall-cmd --reload
firewall-cmd --zone=public --list-ports
123/udp 10000/tcp 7002/tcp
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ou si vous n’avez peur de rien (et que c’est un serveur de test)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;systemctl stop firewalld
systemctl disabled firewalld
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour une bonne introduction avec les commandes firewalld je vous conseille &lt;a class="link" href="https://www.certdepot.net/rhel7-get-started-firewalld/" target="_blank" rel="noopener"
&gt;le post suivant&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="prérequis-complémentaires"&gt;Prérequis complémentaires
&lt;/h3&gt;&lt;p&gt;Monter le fichier ISO sur le serveur sur lequel sera installé Oracle VM Manager. Oracle a mis au point un script qui permet de paramétrer les prérequis (utilisateur oracle, limites, /u01, …).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mount /dev/cdrom /mnt
cd /mnt
./createOracle.sh
Missing required package, Oracle VM Manager requires &amp;#39;iptables-services&amp;#39; to be installed, you can use &amp;#39;yum install iptables-services&amp;#39; to install it.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;La encore, petit oubli d’Oracle ! Le script createOracle.sh utilise iptables et pas firewalld. Il ne fonctionne donc pas sur RHEL7 alors que cet OS est censé être supporté ! On ne peut pas utiliser ce script, il faut faire les modifications à la main (heureusement simples) !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir /u01
chmod 755 /u01
groupadd dba
groupadd -g 54321 oinstall
useradd -u 54321 -g dba -G oinstall -d /home/oracle oracle
/bin/chown oracle:dba /home/oracle
vi /etc/security/limits.conf
oracle hard nofile 8192
oracle soft nofile 8192
oracle soft nproc 4096
oracle hard nproc 4096
oracle soft core unlimited
oracle hard core unlimited
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Une fois les modifications réalisées, on peut lancer l’installeur à proprement parler.&lt;/p&gt;
&lt;h3 id="installation-du-vm-manager"&gt;Installation du VM Manager
&lt;/h3&gt;&lt;p&gt;Lancer l’installeur présent sur l’ISO.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[root@ovmm01 mnt]# ./runInstaller.sh
Oracle VM Manager Release 3.4.1 Installer
Oracle VM Manager Installer log file:
/var/log/ovmm/ovm-manager-3-install-2016-07-20-150727.log
Please select an installation type:
1: Install
2: Upgrade
3: Uninstall
4: Help
Select Number (1-4): 1
Verifying installation prerequisites ...
Conflicts when MySQL install. Oracle VM Manager requires &amp;#39;mariadb-libs&amp;#39; to be uninstalled, you can use &amp;#39;yum remove mariadb-libs&amp;#39; to uninstall it.
Configuration verification failed ...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dans mon cas la première installation n’a pas fonctionné. Pour une raison que j’ignore, mon installation contenait déjà mariadb-libs dans une version entrant en conflit avec le MySQL embarqué par OVMM. Etrangement ils préfèrent qu’on utilise MySQL plutôt que MariaDB ;-). Je l’ai donc désinstallée comme demandé, mais attention aux dépendances qui sont désinstallées dans la foulée !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;yum remove mariadb-libs
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et on recommence&amp;hellip;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Verifying installation prerequisites ...
Starting production with local database installation ...
One password is used for all users created and used during the installation.
Enter a password for all logins used during the installation:
Invalid password.
Passwords need to be between 8 and 16 characters in length.
Passwords must contain at least 1 lower case and 1 upper case letter.
Passwords must contain at least 1 numeric value.
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;Tu pouvais pas me le dire avant ? ;-)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Enter a password for all logins used during the installation:
Enter a password for all logins used during the installation (confirm):
********
Please enter your fully qualified domain name, e.g. ovs123.us.oracle.com, (or IP address) of your management server for SSL certification generation, more than one IP address are detected: 192.168.20.94 192.168.122.1 [ovmm01.example.org]: ovmm01.example.org
Verifying configuration ...
Start installing Oracle VM Manager:
1: Continue
2: Abort
Select Number (1-2): 1
Step 1 of 7 : Database Software ...
Installing Database Software...
[...]
Oracle VM Manager UI:
https://ovmm01.example.org:7002/ovm/console
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Vous pouvez maintenant vous connecter à l’URL donnée en fin d’installation.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2016/10/Oracle-VM-manager_login.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="sources"&gt;Sources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://docs.oracle.com/cd/E64076_01/" target="_blank" rel="noopener"
&gt;docs.oracle.com/cd/E64076_01/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www.oracle.com/technetwork/server-storage/vm/downloads/index.html" target="_blank" rel="noopener"
&gt;www.oracle.com/technetwork/server-storage/vm/downloads/index.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://docs.oracle.com/cd/E64076_01/E64078/html/index.html" target="_blank" rel="noopener"
&gt;docs.oracle.com/cd/E64076_01/E64078/html/index.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://docs.oracle.com/cd/E64076_01/E64078/html/vmiug-server-installation.html" target="_blank" rel="noopener"
&gt;docs.oracle.com/cd/E64076_01/E64078/html/vmiug-server-installation.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[En bref] Modifier des interfaces réseaux en ligne de commande avec nmcli sous RHEL 7</title><link>https://blog.zwindler.fr/2016/04/16/reminder-modifier-interfaces-reseaux-ligne-de-commande-nmcli-rhel-7/</link><pubDate>Sat, 16 Apr 2016 10:00:03 +0000</pubDate><guid>https://blog.zwindler.fr/2016/04/16/reminder-modifier-interfaces-reseaux-ligne-de-commande-nmcli-rhel-7/</guid><description>&lt;img src="https://blog.zwindler.fr/2016/03/Network_Configuration-NM-Teaming-Complete.webp" alt="Featured image of post [En bref] Modifier des interfaces réseaux en ligne de commande avec nmcli sous RHEL 7" /&gt;&lt;h2 id="les-changements-de-rhel-7-avec-networkmanager-et-nmcli"&gt;Les changements de RHEL 7  avec NetworkManager (et nmcli)
&lt;/h2&gt;&lt;p&gt;Le moins qu’on puisse dire de RedHat c’est qu’ils ont quand même changé pas mal de choses avec la version 7 !&lt;/p&gt;
&lt;p&gt;Entre XFS en FS par défaut (juste après avoir introduit ext4), la gestion du firewall avec &lt;strong&gt;firewalld&lt;/strong&gt;, l’abandon de SysV pour &lt;strong&gt;systemd&lt;/strong&gt;, les améliorations de SELinux, &amp;hellip; Il y a de quoi s’y perdre ! Alors, quand j’ai monté ma première VM et que j’ai galéré à changer le hostname et le FQDN proprement, je me suis dis « trop c’est trop! » ;-).&lt;/p&gt;
&lt;p&gt;Voici un petit récap’ de quelques commandes pour vous permettre de gagner du temps plutôt que passer par l’interface NetworkManager, pas toujours extraordinaire&amp;hellip; (surtout &lt;strong&gt;nmcli&lt;/strong&gt;, la version CLI de l’utilitaire de NetworkManager et dont les commandlets ont été enrichis depuis la RHEL 6!)&lt;/p&gt;
&lt;h2 id="via-hostnamectl"&gt;Via hostnamectl
&lt;/h2&gt;&lt;p&gt;Afficher le hostname du serveur dans ces différentes formes : static (nom court), pretty (avec des caractères spéciaux) et « transcient » (???)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;hostnamectl status
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Commande pour effectuer des modifications sur le hostname (avec les options --pretty, --static, --transient)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;hostnamectl set-hostname monhostname
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="via-nmcli"&gt;Via nmcli
&lt;/h2&gt;&lt;p&gt;Comme je le disais en introduction, &lt;strong&gt;nmcli&lt;/strong&gt; est l’utilitaire en ligne de commandes qui permet de modifier les paramètres réseau sur les serveurs qui utilisent Network Manager.&lt;/p&gt;
&lt;p&gt;Pour expliquer un peu pourquoi des fois en arguments je met &lt;strong&gt;con&lt;/strong&gt; ou &lt;strong&gt;connection&lt;/strong&gt;, c’est parce que toutes les commandes peuvent être abréviées autant que vous le souhaitez tant que la sous-commande appelée n’est pas ambiguë. Du coup, pour s’économiser 5 caractères parce qu’on est particulièrement fainéant, on peut mettre « &lt;strong&gt;g&lt;/strong&gt; » au lieu de « &lt;strong&gt;global&lt;/strong&gt;« . Mais rien ne vous y oblige.&lt;/p&gt;
&lt;p&gt;Afficher le hostname&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# nmcli g hostname
server.example.org
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Modifier le FQDN (change le hostname et ajoute &lt;em&gt;domain&lt;/em&gt; dans &lt;strong&gt;/etc/resolv.conf&lt;/strong&gt;)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# nmcli g hostname desktop.example.org
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Afficher le status des cartes réseau&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# nmcli dev status
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On dispose de deux types d’objets : les périphériques (sous-commande &lt;strong&gt;device&lt;/strong&gt;) et les connexions (sous-commande &lt;strong&gt;connection&lt;/strong&gt;) qui leur sont associées. Elles peuvent ne pas avoir le même nom mais et ne représentent pas tout à fait la même chose. C’est pourquoi il y a bien deux commandes distinctes :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# nmcli con show net-eth0
# nmcli dev show eth0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Désactiver la connexion automatique pour une connexion donnée&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# nmcli con mod net-eth0 connection.autoconnect no
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour modifier des paramètres de connexion&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# nmcli con mod net-eth0 ipv4.addresses 192.168.2.10/24
# nmcli con mod net-eth0 ipv4.gateway 192.168.2.1
# nmcli con mod net-eth0 ipv4.method manual
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour activer une connexion&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# nmcli con up net-eth0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Procédure pour ajouter un serveur DNS avec persistance au reboot (mais nécessite une déconnexion/reconnexion de l’interface via GUI ou &lt;em&gt;systemctl restart network&lt;/em&gt; ou &lt;em&gt;ifdown+ifup&lt;/em&gt;)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# nmcli con mod net-eth0 +ipv4.dns 8.8.8.8
# nmcli con up net-eth0
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le fichier &lt;em&gt;resolv.conf&lt;/em&gt; a été mis à jour&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# more /etc/resolv.conf
# Generated by NetworkManager
nameserver 8.8.8.8
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On ajout un serveur DNS avec +ipv4.dns, et on le retire avec -ipv4.dns&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="source"&gt;Source
&lt;/h2&gt;&lt;p&gt;J’ai gagné beaucoup de temps grâce à &lt;strong&gt;certdepot.net&lt;/strong&gt; qui donne la plupart des commandes expliquées ici&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="http://www.certdepot.net/rhel7-get-started-nmcli/" target="_blank" rel="noopener"
&gt;www.certdepot.net/rhel7-get-started-nmcli/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www.certdepot.net/rhel7-configure-ipv4-addresses/" target="_blank" rel="noopener"
&gt;www.certdepot.net/rhel7-configure-ipv4-addresses/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>