<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cloud du Coeur - Documentation – Blog technique</title><link>https://doc.aucoeurdu.cloud/blog/</link><description>Recent content in Blog technique on Cloud du Coeur - Documentation</description><generator>Hugo -- gohugo.io</generator><language>fr-fr</language><atom:link href="https://doc.aucoeurdu.cloud/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Renommer ses interfaces réseau pour isoler les usages</title><link>https://doc.aucoeurdu.cloud/blog/renommage-persistant-udev-linux/</link><pubDate>Tue, 27 May 2025 00:00:00 +0000</pubDate><guid>https://doc.aucoeurdu.cloud/blog/renommage-persistant-udev-linux/</guid><description>
&lt;img src="https://doc.aucoeurdu.cloud/img/cdc-illustration-renommage-persistant-udev.png" alt="Serveurs physiques" style="width: 35%;">
&lt;p>La gestion des interfaces réseau sur Linux, notamment dans des environnements virtualisés ou à haute disponibilité, nécessite une identification claire et persistante des interfaces physiques. Cet article explique pourquoi et comment automatiser le renommage des interfaces réseau à l’aide d’&lt;strong>Ansible&lt;/strong> et de règles &lt;code>udev&lt;/code>, afin de garantir une administration simplifiée et fiable.&lt;/p>
&lt;h2>Pourquoi renommer les interfaces réseau ?&lt;span class="hx:absolute hx:-mt-20" id="pourquoi-renommer-les-interfaces-réseau-">&lt;/span>
&lt;a href="#pourquoi-renommer-les-interfaces-r%c3%a9seau-" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>Pour faciliter l&amp;rsquo;administration de nos machines, nous avons pris la décision de renommer les interfaces dites &amp;ldquo;&lt;a href="https://blog.devarieux.net/2015/08/comprendre-la-prediction-de-noms-des-interfaces-reseau-de-systemd.html" target="_blank" rel="noopener">prédictibles&lt;/a>&amp;rdquo; des distributions Linux modernes. Pourquoi et comment ? Me direz-vous&amp;hellip;&lt;/p>
&lt;h3>Le contexte&lt;span class="hx:absolute hx:-mt-20" id="le-contexte">&lt;/span>
&lt;a href="#le-contexte" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>En effet, à la place de &lt;code>enoX&lt;/code> ou &lt;code>enpXsX&lt;/code>, nous préférons utiliser des noms liés à l&amp;rsquo;usage de ces interfaces.&lt;/p>
&lt;p>Sur nos serveurs qui fondent l&amp;rsquo;infrastructure du Cloud du Coeur (exemple : hyperviseurs OpenStack, noeuds réseau, etc), nous avons 4 interfaces physiques connectées pour la redondance.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Interface physique&lt;/th>
&lt;th>Vitesse&lt;/th>
&lt;th>Usage&lt;/th>
&lt;th>Nom souhaité&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>2x RJ45 on-board&lt;/td>
&lt;td>1 Gbps&lt;/td>
&lt;td>Management&lt;/td>
&lt;td>mgt0, mgt1&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>2x QSFP (cartes dédiées)&lt;/td>
&lt;td>100 Gbps&lt;/td>
&lt;td>Production&lt;/td>
&lt;td>prd0, prd1&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Pour schématiser les interfaces d&amp;rsquo;un point de vue physique :&lt;/p>
&lt;img src="https://doc.aucoeurdu.cloud/img/renommage-persistant-udev-physical-server.png" alt="Serveurs physiques" style="width: 85%;">
&lt;p>Pour schématiser les interfaces d&amp;rsquo;un point de vue virtuel :&lt;/p>
&lt;img src="https://doc.aucoeurdu.cloud/img/renommage-persistant-udev-linux-bonds.png" alt="Linux bonds" style="width: 85%;">
&lt;h3>Quels sont les avantages ?&lt;span class="hx:absolute hx:-mt-20" id="quels-sont-les-avantages-">&lt;/span>
&lt;a href="#quels-sont-les-avantages-" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>&lt;strong>Clarté et maintenance facilitée&lt;/strong> : Les noms &lt;code>mgtX&lt;/code> et &lt;code>prdX&lt;/code> permettent d’identifier immédiatement à quel usage correspond chaque interface physique.&lt;/li>
&lt;li>&lt;strong>Gestion simplifiée des bonds&lt;/strong> : En regroupant les interfaces selon leur rôle, on peut facilement configurer et monitorer les bonds réseau dédiés à la gestion ou à la production.&lt;/li>
&lt;li>&lt;strong>Simplification en cas de remplacement d&amp;rsquo;une carte&lt;/strong> : Il suffira de remplacer l&amp;rsquo;adresse MAC côté &lt;code>udev&lt;/code> et la nouvelle interface récupèrera le même nom que l&amp;rsquo;ancienne et réintégrera automatiquement le bon agrégat.&lt;/li>
&lt;/ul>
&lt;h2>Passons à la technique&lt;span class="hx:absolute hx:-mt-20" id="passons-à-la-technique">&lt;/span>
&lt;a href="#passons-%c3%a0-la-technique" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;h3>Prérequis&lt;span class="hx:absolute hx:-mt-20" id="prérequis">&lt;/span>
&lt;a href="#pr%c3%a9requis" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;ul>
&lt;li>Accès root sur les machines cibles&lt;/li>
&lt;li>&lt;strong>Ansible&lt;/strong> installé sur la machine de contrôle&lt;/li>
&lt;li>Facts Ansible collectés (&lt;code>gather_facts: yes&lt;/code>)&lt;/li>
&lt;/ul>
&lt;h3>Comment appliquer (de manière automatisée) ?&lt;span class="hx:absolute hx:-mt-20" id="comment-appliquer-de-manière-automatisée-">&lt;/span>
&lt;a href="#comment-appliquer-de-mani%c3%a8re-automatis%c3%a9e-" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Voici un bout de code &lt;code>ansible&lt;/code>, outil utilisé chez nous pour le déploiement de configuration sur nos machines.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Rename network interfaces persistently using udev rules&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">hosts&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">all&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">become&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">vars&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">udev_rules_file&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">/etc/udev/rules.d/10-network-interfaces.rules&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">reboot_after&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">disable_predictable_naming&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">tasks&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Filter physical interfaces (exclude loopback, docker, veth, bridge, bond, virbr)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">set_fact&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">physical_ifaces&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">&amp;gt;-&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> {{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> ansible_interfaces
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> | reject(&amp;#39;match&amp;#39;, &amp;#39;^lo$&amp;#39;)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> | reject(&amp;#39;match&amp;#39;, &amp;#39;^docker.*&amp;#39;)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> | reject(&amp;#39;match&amp;#39;, &amp;#39;^veth.*&amp;#39;)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> | reject(&amp;#39;match&amp;#39;, &amp;#39;^br.*&amp;#39;)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> | reject(&amp;#39;match&amp;#39;, &amp;#39;^bond.*&amp;#39;)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> | reject(&amp;#39;match&amp;#39;, &amp;#39;^virbr.*&amp;#39;)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> | list
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Collect MAC and speed data for each physical interface&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">set_fact&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">iface_data&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">&amp;gt;-&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> {{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> iface_data | default([]) + [{
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> &amp;#34;name&amp;#34;: item,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> &amp;#34;mac&amp;#34;: hostvars[inventory_hostname][&amp;#39;ansible_&amp;#39; + item][&amp;#39;macaddress&amp;#39;] | default(&amp;#39;&amp;#39;),
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> &amp;#34;speed&amp;#34;: hostvars[inventory_hostname][&amp;#39;ansible_&amp;#39; + item][&amp;#39;speed&amp;#39;] | default(0)
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> }]
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">loop&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ physical_ifaces }}&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">when&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">hostvars[inventory_hostname][&amp;#39;ansible_&amp;#39; + item] is defined and&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">hostvars[inventory_hostname][&amp;#39;ansible_&amp;#39; + item][&amp;#39;macaddress&amp;#39;] is defined&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Separate 1G (MGT) and 10G+ (PRD) interfaces&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">set_fact&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">mgt_ifaces&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ iface_data | selectattr(&amp;#39;speed&amp;#39;, &amp;#39;==&amp;#39;, 1000) | list }}&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">prd_ifaces&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ iface_data | selectattr(&amp;#39;speed&amp;#39;, &amp;#39;&amp;gt;=&amp;#39;, 100000) | list }}&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Debug classified physical interfaces&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">debug&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">msg&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;MGT interfaces (1G): {{ mgt_ifaces }}&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;PRD interfaces (100G+): {{ prd_ifaces }}&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Generate udev rules content&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">set_fact&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">udev_rules&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">|&lt;/span>&lt;span class="sd">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> {% for iface in mgt_ifaces %}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> SUBSYSTEM==&amp;#34;net&amp;#34;, ACTION==&amp;#34;add&amp;#34;, ATTR{address}==&amp;#34;{{ iface.mac }}&amp;#34;, NAME=&amp;#34;mgt{{ loop.index0 }}&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> {% endfor %}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> {% for iface in prd_ifaces %}
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> SUBSYSTEM==&amp;#34;net&amp;#34;, ACTION==&amp;#34;add&amp;#34;, ATTR{address}==&amp;#34;{{ iface.mac }}&amp;#34;, NAME=&amp;#34;prd{{ loop.index0 }}&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="sd"> {% endfor %}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Show generated udev rules&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">debug&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">var&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">udev_rules&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Write udev rules to file&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">copy&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">dest&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ udev_rules_file }}&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">content&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;{{ udev_rules }}&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">owner&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">root&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">group&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">root&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">mode&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;0644&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Disable predictable interface names (optional)&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">file&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">path&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">/etc/udev/rules.d/80-net-setup-link.rules&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">state&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">link&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">src&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">/dev/null&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">when&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">disable_predictable_naming&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Reboot system if required&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">reboot&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">msg&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Reboot required after applying udev rules&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">reboot_timeout&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">300&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">when&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">reboot_after and udev_rules | length &amp;gt; 0&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;div class="hx:overflow-x-auto hx:mt-6 hx:flex hx:rounded-lg hx:border hx:py-2 hx:ltr:pr-4 hx:rtl:pl-4 hx:contrast-more:border-current hx:contrast-more:dark:border-current hx:border-gray-200 hx:bg-gray-100 hx:text-gray-900 hx:dark:border-gray-200/30 hx:dark:bg-gray-900/30 hx:dark:text-gray-200">
&lt;div class="hx:ltr:pl-3 hx:ltr:pr-2 hx:rtl:pr-3 hx:rtl:pl-2">&lt;div class="hx:select-none hx:text-xl" style="font-family: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';">👉🏼&lt;/div>&lt;/div>
&lt;div class="hx:w-full hx:min-w-0 hx:leading-7">
&lt;div class="hx:mt-6 hx:leading-7 hx:first:mt-0">Stockez le contenu dans un fichier &lt;em>yaml&lt;/em> qui pourrait se nommer &lt;code>rename-interfaces.yml&lt;/code> par exemple.&lt;/div>
&lt;/div>
&lt;/div>
&lt;h3>Application&lt;span class="hx:absolute hx:-mt-20" id="application">&lt;/span>
&lt;a href="#application" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Pour appliquer le playbook :&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">ansible-playbook -i hosts rename-interfaces.yml&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h3>Vérification&lt;span class="hx:absolute hx:-mt-20" id="vérification">&lt;/span>
&lt;a href="#v%c3%a9rification" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Après redémarrage, vérifiez que les interfaces portent bien les nouveaux noms :&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">ip link show
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ou&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">ls /sys/class/net&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;p>Vous devriez voir apparaître les interfaces &lt;code>mgt0&lt;/code>, &lt;code>mgt1&lt;/code>, &lt;code>prd0&lt;/code>, &lt;code>prd1&lt;/code>.&lt;/p>
&lt;h3>Rollback&lt;span class="hx:absolute hx:-mt-20" id="rollback">&lt;/span>
&lt;a href="#rollback" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>Pour revenir en arrière, il suffit de supprimer le fichier de règles udev :&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">rm /etc/udev/rules.d/10-network-interfaces.rules
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">reboot&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copy code"
>
&lt;div class="copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>Liens complémentaires&lt;span class="hx:absolute hx:-mt-20" id="liens-complémentaires">&lt;/span>
&lt;a href="#liens-compl%c3%a9mentaires" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;ul>
&lt;li>&lt;a href="https://docs.ansible.com/" target="_blank" rel="noopener">Documentation officielle Ansible&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://www.freedesktop.org/software/systemd/man/udev.html" target="_blank" rel="noopener">Documentation officielle udev&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.devarieux.net/2015/08/comprendre-la-prediction-de-noms-des-interfaces-reseau-de-systemd.html" target="_blank" rel="noopener">Comprendre la prédiction de noms des interfaces réseau de systemd&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>Grâce à cette méthode, la gestion des interfaces réseau devient plus claire, plus fiable et plus facilement automatisable, même lors de changements matériels. Bien sûr cette méthode est très utile dans notre contexte où toutes les machines qui constituent le &amp;ldquo;Cloud du Coeur&amp;rdquo; (dans l&amp;rsquo;underlay) sont identiques.&lt;/p></description></item><item><title>Lancement du blog technique</title><link>https://doc.aucoeurdu.cloud/blog/lancement-du-blog-technique/</link><pubDate>Thu, 22 May 2025 00:00:00 +0000</pubDate><guid>https://doc.aucoeurdu.cloud/blog/lancement-du-blog-technique/</guid><description>
&lt;img src="https://doc.aucoeurdu.cloud/img/cdc-illustration-lancement.png" alt="Lancement du blog" style="width: 35%;">
&lt;p>Nous sommes fiers d’annoncer le lancement de notre blog technique dédié au projet du &lt;strong>Cloud du Coeur&lt;/strong> !&lt;/p>
&lt;p>À travers ce &lt;em>blog&lt;/em>, nous souhaitons partager avec la communauté technique francophone &lt;strong>nos retours d’expérience&lt;/strong>, &lt;strong>nos avancées&lt;/strong> et &lt;strong>nos réflexions&lt;/strong> autour de l’infrastructure, d’OpenStack, de Kubernetes, du réseau, de l’automatisation et de tous les sujets qui font vivre notre plateforme.&lt;/p>
&lt;p>Notre objectif : &lt;em>rendre nos choix techniques transparents&lt;/em>, valoriser le travail collaboratif, et permettre à d’autres associations ou collectifs de s’inspirer de notre démarche pour bâtir des infrastructures ouvertes, résilientes et responsables.&lt;/p>
&lt;p>Nous publierons régulièrement des articles courts ou longs, des tutoriels, des retours d’incidents (post-mortems), et des astuces issues de notre quotidien.&lt;/p>
&lt;p>Merci à toutes celles et ceux qui nous suivent, et bienvenue sur ce nouvel espace d’échange et de partage !&lt;/p>
&lt;p>&lt;em>L&amp;rsquo;équipe du Cloud du Coeur.&lt;/em>&lt;/p></description></item></channel></rss>