<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fh="http://purl.org/syndication/history/1.0"><channel><title>Vincent FRICOU | Blog</title><description/><link>https://blog.fricouv.eu/</link><language>en</language><fh:complete/><atom:link rel="self" href="https://blog.fricouv.eu/blog/rss.xml"/><item><title>Partage IP entre services avec Cilium Load Balancer</title><link>https://blog.fricouv.eu/blog/cilium-lb-partage-ip/</link><guid isPermaLink="true">https://blog.fricouv.eu/blog/cilium-lb-partage-ip/</guid><description>Partage IP entre services avec Cilium Load Balancer</description><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;h1 id=&quot;le-contexte-du-pourquoi-&quot;&gt;Le Contexte du pourquoi ?&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;J’avais un besoin relativement simple, je voulais pouvoir exposer un service Kubernetes sur une VIP en mode LoadBalancer.&lt;br&gt;
VIP gérée par Cilium bien sûr. J’ai une CNI suffisamment outillé pour ne pas avoir à ajouter d’autres choses. Non mais !&lt;/p&gt;
&lt;p&gt;Cette opération peut être quand même super pratique pour plein de raisons :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un serveur DNS hébergé dans Kubernetes (et pourquoi pas après tout ?)&lt;/li&gt;
&lt;li&gt;Un collecteur de logs type rsyslog&lt;/li&gt;
&lt;li&gt;Un service Web qui serait à même de gérer du protocole QUIC (HTTP/3) et HTTP(s)&lt;/li&gt;
&lt;li&gt;Tout ce qui peut nécessiter une double stack protocolaire…&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;objectif-et-le-but&quot;&gt;Objectif et le but&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Pour poser un exemple concret, et surtout un cadre facile à déployer pour faire mes tests, je ne suis pas allé chercher
très loin. CoreDNS comme serveur DNS répond largement au besoin de ce test.&lt;/p&gt;
&lt;p&gt;Donc l’idée est simple : je veux pouvoir depuis l’ensemble de mes assets hors de mon cluster Kubernetes, faire des
requêtes DNS vers le CoreDNS que je déploie pour mes tests. (Oui, je laisse le CoreDNS interne de Kubernetes tranquille.)&lt;/p&gt;
&lt;p&gt;Pour rappel, le DNS est assez classiquement utilisé en mode UDP, mais il est aussi possible de le faire en mode TCP,
et surtout, c’est nécessaire dans certains contextes comme le cas où il y a beaucoup d’enregistrements à retourner et que
ça ne rentre pas dans un paquet UDP.&lt;/p&gt;
&lt;p&gt;Donc voilà, je veux exposer mon service DNS sur une IP externe à mon cluster, et que celle-ci soit aussi bien accessible
en UDP qu’en TCP.&lt;/p&gt;
&lt;p&gt;Et c’est là que ça se complique.&lt;/p&gt;
&lt;p&gt;Par défaut, et sauf si j’ai raté quelque chose, il n’est pas possible de positionner un service Kubernetes de type
LoadBalancer en écoute sur le même port (dans mon cas le 53) et mode UDP ET TCP.&lt;/p&gt;
&lt;div&gt;&lt;h1 id=&quot;comment-ça-se-passe-alors-&quot;&gt;Comment ça se passe alors ?&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Je ne vais pas vous détailler l’installation de CoreDNS à coup de chart Helm, ce n’est pas le but. On considère donc
que tout ce qu’il nous faut en termes de déploiement et de pod est déjà en place et que tout le monde vas bien.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;la-vip-pour-coredns&quot;&gt;La VIP pour CoreDNS&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Tout d’abord, il faut créer une VIP pour pouvoir adresser le service de CoreDNS en mode LoadBalancer.&lt;/p&gt;
&lt;p&gt;Pour faire ça, on va chercher dans les classiques &lt;code dir=&quot;auto&quot;&gt;CiliumLoadBalancerIPPool&lt;/code&gt; pour la configuration de la VIP et
&lt;code dir=&quot;auto&quot;&gt;CiliumL2AnnouncementPolicy&lt;/code&gt; pour traiter l’annonce ARP afin qu’elle soit vu sur le réseau :&lt;/p&gt;
&lt;starlight-tabs&gt;&lt;div&gt;&lt;ul role=&quot;tablist&quot;&gt;&lt;li role=&quot;presentation&quot;&gt;&lt;a role=&quot;tab&quot; href=&quot;#tab-panel-8&quot; id=&quot;tab-8&quot; aria-selected=&quot;true&quot; tabindex=&quot;0&quot;&gt;cdns-vip.CiliumLoadBalancerIPPool.yaml&lt;/a&gt;&lt;/li&gt;&lt;li role=&quot;presentation&quot;&gt;&lt;a role=&quot;tab&quot; href=&quot;#tab-panel-9&quot; id=&quot;tab-9&quot; aria-selected=&quot;false&quot; tabindex=&quot;-1&quot;&gt;cdns-vip.CiliumL2AnnouncementPolicy.yaml&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div id=&quot;tab-panel-8&quot; aria-labelledby=&quot;tab-8&quot; role=&quot;tabpanel&quot;&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;cilium.io/v2&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;CiliumLoadBalancerIPPool&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;cdns-vip&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;namespace&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;coredns-external&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;blocks&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;cidr&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;192.168.0.153/32&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;serviceSelector&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;matchLabels&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;io.kubernetes.service.namespace&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;coredns-external&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;cilium.lbpool/name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;coredns-external&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id=&quot;tab-panel-9&quot; aria-labelledby=&quot;tab-9&quot; role=&quot;tabpanel&quot; hidden&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;cilium.io/v2alpha1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;CiliumL2AnnouncementPolicy&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;cdns-vip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;namespace&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;coredns-external&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;serviceSelector&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;matchLabels&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;io.kubernetes.service.namespace&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;coredns-external&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;cilium.lbpool/name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;coredns-external&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;externalIPs&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;loadBalancerIPs&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/starlight-tabs&gt;
&lt;p&gt;Bon, jusqu’ici, ça reste du classique au niveau de la configuration de la VIP avec Cilium.&lt;br&gt;
On indique quelle IP on veut, et quels sont les labels permettant de l’attacher au bon service.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;et-le-partage-du-coup-&quot;&gt;Et le partage du coup ?&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Eh bien, c’est là que ça se corse un peu (mais vraiment pas beaucoup).&lt;/p&gt;
&lt;p&gt;En faisant mes recherches, je suis en premier lieu tombé sur la façon de faire avec MetalLB pour permettre du
&lt;a href=&quot;https://metallb.universe.tf/usage/#ip-address-sharing&quot;&gt;partage d’adresse IP&lt;/a&gt; via une annotation sur les services :
&lt;code dir=&quot;auto&quot;&gt;metallb.io/allow-shared-ip&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Et là, je me suis dit « attends… MetalLB sait le gérer, à quel moment Cilium n’en serait pas capable ? ».&lt;/p&gt;
&lt;p&gt;Du coup, c’est parti, je fouille la doc… Et là… C’est la révélation, et c’est affligeant de simplicité.&lt;/p&gt;
&lt;p&gt;Je vous mets le lien vers la doc de Cilium qui traite du sujet &lt;a href=&quot;https://docs.cilium.io/en/latest/network/lb-ipam/#sharing-keys&quot;&gt;ici&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En fait, de façon triviale, Cilium traite la chose exactement de la même façon que ce que fait MetalLB. Soit via une
simple annotation sur le service (&lt;code dir=&quot;auto&quot;&gt;lbipam.cilium.io/sharing-key&lt;/code&gt;) !&lt;/p&gt;
&lt;p&gt;Alors quand même, il faut en parler un minimum. Parce qu’il y a plusieurs choses à prendre en comptes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Par défaut, une même adresse ne peut pas être partagée entre plusieurs namespaces&lt;/li&gt;
&lt;li&gt;Il est &lt;strong&gt;impératif&lt;/strong&gt; que la valeur fournie dans l’annotation soit commune à l’ensemble des services qui partageront la même VIP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bref, j’ai trouvé mon bonheur, c’est le moment de tester ça.&lt;/p&gt;
&lt;p&gt;Je crée donc deux services pour pouvoir exposer mon fameux port 53 sur une seule et même adresse IP :&lt;/p&gt;
&lt;starlight-tabs&gt;&lt;div&gt;&lt;ul role=&quot;tablist&quot;&gt;&lt;li role=&quot;presentation&quot;&gt;&lt;a role=&quot;tab&quot; href=&quot;#tab-panel-10&quot; id=&quot;tab-10&quot; aria-selected=&quot;true&quot; tabindex=&quot;0&quot;&gt;cdns-udp.Service.yaml&lt;/a&gt;&lt;/li&gt;&lt;li role=&quot;presentation&quot;&gt;&lt;a role=&quot;tab&quot; href=&quot;#tab-panel-11&quot; id=&quot;tab-11&quot; aria-selected=&quot;false&quot; tabindex=&quot;-1&quot;&gt;cdns-tcp.Service.yaml&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div id=&quot;tab-panel-10&quot; aria-labelledby=&quot;tab-10&quot; role=&quot;tabpanel&quot;&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;v1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Service&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;annotations&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;lbipam.cilium.io/sharing-key&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;cdnsext1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;labels&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;app.kubernetes.io/instance&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;coredns&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;coredns&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;cilium.lbpool/name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;coredns-external&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;cdns-lb-udp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;namespace&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;coredns-external&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;LoadBalancer&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;udp-53&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;port&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;53&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;protocol&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;UDP&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;targetPort&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;53&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;selector&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;app.kubernetes.io/instance&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;coredns&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;coredns&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id=&quot;tab-panel-11&quot; aria-labelledby=&quot;tab-11&quot; role=&quot;tabpanel&quot; hidden&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;apiVersion&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;v1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;kind&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Service&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;annotations&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;lbipam.cilium.io/sharing-key&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;cdnsext1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;labels&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;app.kubernetes.io/instance&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;coredns&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;coredns&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;cilium.lbpool/name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;coredns-external&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;cdns-lb-tcp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;namespace&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;coredns-external&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;spec&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;LoadBalancer&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ports&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;tcp-53&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;port&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;53&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;protocol&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;TCP&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;targetPort&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;53&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;selector&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;app.kubernetes.io/instance&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;coredns&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;app.kubernetes.io/name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;coredns&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/starlight-tabs&gt;
&lt;p&gt;Et une fois appliqué ça donne ça :&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;NAME&lt;/span&gt;&lt;span&gt;           &lt;/span&gt;&lt;span&gt;TYPE&lt;/span&gt;&lt;span&gt;           &lt;/span&gt;&lt;span&gt;CLUSTER-IP&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;EXTERNAL-IP&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;PORT&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span&gt;)         &lt;/span&gt;&lt;span&gt;AGE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;mark&gt;&lt;span&gt;cdns-lb-tcp&lt;/span&gt;&lt;/mark&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;LoadBalancer&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;10.101.9.103&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;mark&gt;&lt;span&gt;192.168.0.153&lt;/span&gt;&lt;/mark&gt;&lt;span&gt;   &lt;/span&gt;&lt;mark&gt;&lt;span&gt;53&lt;/span&gt;&lt;/mark&gt;&lt;span&gt;:31251/TCP&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;7h37m&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;mark&gt;&lt;span&gt;cdns-lb-udp&lt;/span&gt;&lt;/mark&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;LoadBalancer&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;10.104.45.49&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;mark&gt;&lt;span&gt;192.168.0.153&lt;/span&gt;&lt;/mark&gt;&lt;span&gt;   &lt;/span&gt;&lt;mark&gt;&lt;span&gt;53&lt;/span&gt;&lt;/mark&gt;&lt;span&gt;:31716/UDP&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;7h37m&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;On voit bien qu’on a nos deux services qui écoutent sur la même External IP.&lt;/p&gt;
&lt;p&gt;Bon, ce n’est pas tout ça, mais si on s’assurait que ça fonctionne bien quand même ?&lt;/p&gt;
&lt;p&gt;On teste en mode TCP :&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;dig&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-t&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;mark&gt;&lt;span&gt;+tcp&lt;/span&gt;&lt;/mark&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;blog.fricouv.eu&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;mark&gt;&lt;span&gt;@192.168.0.153&lt;/span&gt;&lt;/mark&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Et on obtient la réponse suivante :&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;; &amp;#x3C;&amp;#x3C;&gt;&gt; DiG 9.20.18-1~deb13u1-Debian &amp;#x3C;&amp;#x3C;&gt;&gt; -t A +tcp blog.fricouv.eu @192.168.0.153&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; global options: +cmd&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; Got answer:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; -&gt;&gt;HEADER&amp;#x3C;&amp;#x3C;- opcode: QUERY, status: NOERROR, id: 51368&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; OPT PSEUDOSECTION:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;; EDNS: version: 0, flags:; udp: 1232&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;; COOKIE: 083e5e3c94d7ae61 (echoed)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; QUESTION SECTION:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;blog.fricouv.eu.    IN  A&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; ANSWER SECTION:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;blog.fricouv.eu.  30  IN  CNAME  obelix.fricouv.eu.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;obelix.fricouv.eu.  30  IN  A  38.242.215.124&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; Query time: 52 msec&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; SERVER: 192.168.0.153#53(192.168.0.153) (TCP)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; WHEN: Wed Apr 01 16:56:20 UTC 2026&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; MSG SIZE  rcvd: 135&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;En mode TCP, c’est OK !&lt;/p&gt;
&lt;p&gt;En UDP maintenant :&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;dig&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-t&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;mark&gt;&lt;span&gt;+udp&lt;/span&gt;&lt;/mark&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;blog.fricouv.eu&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;mark&gt;&lt;span&gt;@192.168.0.153&lt;/span&gt;&lt;/mark&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Et on obtient la réponse suivante :&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;; &amp;#x3C;&amp;#x3C;&gt;&gt; DiG 9.20.18-1~deb13u1-Debian &amp;#x3C;&amp;#x3C;&gt;&gt; -t A +udp blog.fricouv.eu @192.168.0.153&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; global options: +cmd&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; Got answer:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; -&gt;&gt;HEADER&amp;#x3C;&amp;#x3C;- opcode: QUERY, status: NOERROR, id: 27637&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; OPT PSEUDOSECTION:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;; EDNS: version: 0, flags:; udp: 1232&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;; COOKIE: d3884161ae8965e8 (echoed)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; QUESTION SECTION:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;blog.fricouv.eu.    IN  A&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; ANSWER SECTION:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;blog.fricouv.eu.  30  IN  CNAME  obelix.fricouv.eu.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;obelix.fricouv.eu.  30  IN  A  38.242.215.124&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; Query time: 0 msec&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; SERVER: 192.168.0.153#53(192.168.0.153) (UDP)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; WHEN: Wed Apr 01 17:00:26 UTC 2026&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;;; MSG SIZE  rcvd: 135&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Et voilà le travail ! J’ai enfin trouvé comment exposer mes services sur une même IP externe et sur le même
port, quel que soit le protocole que j’utilise.&lt;/p&gt;</content:encoded><category>Kubernetes</category><category>Cilium</category><category>LoadBalancer</category></item><item><title>AI Manifesto</title><link>https://blog.fricouv.eu/blog/ai-manifesto/</link><guid isPermaLink="true">https://blog.fricouv.eu/blog/ai-manifesto/</guid><description>AI Manifesto</description><pubDate>Thu, 09 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;h1 id=&quot;utilisation-pour-le-contenu&quot;&gt;Utilisation pour le contenu&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;L’ensemble du contenu textuel, les configurations ou les commandes, que ce soit du blog ou de la documentation
&lt;strong&gt;n’a pas&lt;/strong&gt; été généré grâce à de l’intelligence artificielle.&lt;/p&gt;
&lt;p&gt;L’usage que j’ai aujourd’hui de l’IA est relativement restreint, et je ne juge pas pertinent de produire du contenu
à destination d’Humains si ce contenu est lui-même tiré d’une IA que ces mêmes personnes pourraient utiliser.&lt;/p&gt;
&lt;p&gt;Pour ce qui est des images qui peuvent ou pourraient être présentes, il reste possible que j’intègre certaines
générations faites par intelligence artificielle.&lt;br&gt;
Le cas échéant, une note sera mise en place pour le signifier.&lt;/p&gt;
&lt;div&gt;&lt;h1 id=&quot;sourcing&quot;&gt;Sourcing&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;J’essaye au maximum de citer les sources qui m’ont fortement servies pour l’écriture du contenu.&lt;br&gt;
En mettant en référence les liens des outils, ou des documentations sur lesquelles je me suis appuyé pour écrire,
si ces dernières sont le fruit de travail d’autres personnes.&lt;/p&gt;
&lt;div&gt;&lt;h1 id=&quot;mon-avis-sur-les-ia&quot;&gt;Mon avis sur les IA&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Au moment où j’écris ces lignes, nous sommes en octobre 2025.&lt;br&gt;
Je n’ai pas de position tranchée sur l’IA.&lt;/p&gt;
&lt;p&gt;Je ne considère pas ça comme étant « le mal » comme certains peuvent le penser, je considère que c’est un outil,
qui s’avère déjà dans certains cas, puissant.
Mais en même temps, j’estime qu’il ne sera pas possible, au moins à courte échéance remplacer la nécessité de pensées
humaines dans le travail.&lt;/p&gt;
&lt;p&gt;Au delà de ce point, et c’est une vision très personnelle de mes différentes expériences, j’estime que les IA ne sont
à date toujours pas capable de fournir « de bonnes réponses » à un problème.&lt;br&gt;
De part le fait qu’il y a une volonté de satisfaire l’utilisateur, les IA ont un biais fonctionnel qui les forcent
à fournir une réponse coûte que coûte, même si celle-ci n’est pas réalisable.&lt;br&gt;
Comme dans une relation avec un humain, je préfère entendre ou lire un « Je ne sais pas répondre à ta question / à ton
besoin » plutôt qu’on me fasse miroiter une réponse qui finira par me frustrer.&lt;/p&gt;
&lt;div&gt;&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Je continue donc à travailler majoritairement sans IA, pour le moment, elles ne me font pas suffisamment gagner de temps
pour pousser l’usage.&lt;/p&gt;
&lt;p&gt;Je changerais peut-être d’avis dans le futur, mais je reste dans l’idée qu’elles sont des outils, et qu’il faut les
utiliser et les considérer comme tels.&lt;/p&gt;</content:encoded><category>AI</category></item><item><title>Ansible pull</title><link>https://blog.fricouv.eu/blog/ansible-pull/</link><guid isPermaLink="true">https://blog.fricouv.eu/blog/ansible-pull/</guid><description>Ansible pull</description><pubDate>Tue, 02 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;h1 id=&quot;pull-&quot;&gt;Pull ?&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Ansible est un outil de configuration en mode « push », et donc par définition se connecte aux machines pour effectuer
des actions.&lt;/p&gt;
&lt;p&gt;Il n’a pas vocation initiale à être joué de façon régulières pour effectuer ce que l’on va qualifier de gestion de
conformité.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.ansible.com/ansible/latest/cli/ansible-pull.html&quot;&gt;Ansible Pull&lt;/a&gt; permet de mettre en place ce fonctionnement
tout en restant dans un environnement connu et maitrisé.&lt;br&gt;
À contrario d’Ansible, il est orienté exécution locale. Bien sur celà reste possible d’aller plus loin, mais dans le cas
présent, on va discuter conformité sur la machine locale.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;rappel-sur-les-notions-de-conformité&quot;&gt;Rappel sur les notions de conformité&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;La gestion de la conformité de configuration est un mode de gestion où l’on vérifie à intervales réguliers que ce qui a
été défini est bien appliqué.&lt;/p&gt;
&lt;p&gt;Celà permet d’éviter des glissements (drifts) de configuration entre l’état initial et l’état courant.&lt;/p&gt;
&lt;div&gt;&lt;h1 id=&quot;fonctionnement&quot;&gt;Fonctionnement&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Le modèle Ansible Pull est basé sur la récupération de matériel Ansible depuis un dépot Git, et le rejeu du playbook
définit lors de l’exécution de la commande.&lt;/p&gt;
&lt;p&gt;Concrètement, il va aller interroger à intervales réguliers un dépot Git qui contient les configurations que vous souhaitez
garder sous contrôle de conformité, et exécuter Ansible sur la machine locale pour valider ou réappliquer les configurations
si nécessaire.&lt;/p&gt;
&lt;div&gt;&lt;h1 id=&quot;préparation-des-machines&quot;&gt;Préparation des machines&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Les machines qui devront exécuter &lt;code dir=&quot;auto&quot;&gt;ansible-pull&lt;/code&gt; doivent avoir le paquet &lt;code dir=&quot;auto&quot;&gt;ansible-core&lt;/code&gt; d’installé sur le système.&lt;/p&gt;
&lt;p&gt;Autant dans le cas d’un contrôleur Ansible, il est conseillé d’installer Ansible dans un virtualenv Python pour pouvoir
récupérer les dernières versions, mais dans le cas d’Ansible Pull, je vous conseille d’utiliser les paquets système afin
de ne pas avoir à gérer la création du virtualenv.&lt;/p&gt;
&lt;div&gt;&lt;h1 id=&quot;dépot-git&quot;&gt;Dépot Git&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Le dépot Git qui contiendra votre configuration utilisable par Ansible Pull à un modèle assez classique :&lt;/p&gt;
&lt;starlight-file-tree data-pagefind-ignore=&quot;true&quot;&gt;&lt;ul&gt;&lt;li&gt;&lt;details open&gt;&lt;summary&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M22.073 4.900L22.073 4.900L12.148 4.900L12.148 3.950Q12.148 3.125 11.585 2.563Q11.023 2 10.198 2L10.198 2L0.048 2L0.048 22L23.948 22L23.948 6.850Q23.998 6.025 23.448 5.462Q22.898 4.900 22.073 4.900Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;inventories/
&lt;/span&gt;&lt;/span&gt;&lt;/summary&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M13.615 15.116L13.415 16.076Q13.095 16.076 12.575 16.156L12.575 16.156Q12.215 16.196 12.055 16.196L12.055 16.196L9.815 16.196Q10.055 13.516 10.495 8.196Q10.935 2.876 11.175 0.196L11.175 0.196L12.655 0.196Q14.375 0.116 15.175 0.196L15.175 0.196Q15.455 0.196 15.735 0.556Q16.015 0.916 15.935 1.196L15.935 1.196Q15.655 3.196 14.935 7.236L14.935 7.236L14.415 9.956Q14.215 11.636 13.615 15.116L13.615 15.116ZM13.935 21.076L13.935 21.076Q14.015 22.116 13.255 22.936Q12.495 23.756 11.295 23.836Q10.095 23.916 9.115 23.256Q8.135 22.596 8.055 21.596L8.055 21.596Q7.975 20.436 8.735 19.676Q9.495 18.916 10.815 18.836Q12.135 18.756 12.995 19.356Q13.855 19.956 13.935 21.076Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;inventory.yaml&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/details&gt;&lt;/li&gt;&lt;li&gt;&lt;details open&gt;&lt;summary&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M22.073 4.900L22.073 4.900L12.148 4.900L12.148 3.950Q12.148 3.125 11.585 2.563Q11.023 2 10.198 2L10.198 2L0.048 2L0.048 22L23.948 22L23.948 6.850Q23.998 6.025 23.448 5.462Q22.898 4.900 22.073 4.900Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;playbooks/
&lt;/span&gt;&lt;/span&gt;&lt;/summary&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M13.615 15.116L13.415 16.076Q13.095 16.076 12.575 16.156L12.575 16.156Q12.215 16.196 12.055 16.196L12.055 16.196L9.815 16.196Q10.055 13.516 10.495 8.196Q10.935 2.876 11.175 0.196L11.175 0.196L12.655 0.196Q14.375 0.116 15.175 0.196L15.175 0.196Q15.455 0.196 15.735 0.556Q16.015 0.916 15.935 1.196L15.935 1.196Q15.655 3.196 14.935 7.236L14.935 7.236L14.415 9.956Q14.215 11.636 13.615 15.116L13.615 15.116ZM13.935 21.076L13.935 21.076Q14.015 22.116 13.255 22.936Q12.495 23.756 11.295 23.836Q10.095 23.916 9.115 23.256Q8.135 22.596 8.055 21.596L8.055 21.596Q7.975 20.436 8.735 19.676Q9.495 18.916 10.815 18.836Q12.135 18.756 12.995 19.356Q13.855 19.956 13.935 21.076Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;playbook.yaml&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M13.615 15.116L13.415 16.076Q13.095 16.076 12.575 16.156L12.575 16.156Q12.215 16.196 12.055 16.196L12.055 16.196L9.815 16.196Q10.055 13.516 10.495 8.196Q10.935 2.876 11.175 0.196L11.175 0.196L12.655 0.196Q14.375 0.116 15.175 0.196L15.175 0.196Q15.455 0.196 15.735 0.556Q16.015 0.916 15.935 1.196L15.935 1.196Q15.655 3.196 14.935 7.236L14.935 7.236L14.415 9.956Q14.215 11.636 13.615 15.116L13.615 15.116ZM13.935 21.076L13.935 21.076Q14.015 22.116 13.255 22.936Q12.495 23.756 11.295 23.836Q10.095 23.916 9.115 23.256Q8.135 22.596 8.055 21.596L8.055 21.596Q7.975 20.436 8.735 19.676Q9.495 18.916 10.815 18.836Q12.135 18.756 12.995 19.356Q13.855 19.956 13.935 21.076Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;requirements.yaml&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/details&gt;&lt;/li&gt;&lt;li&gt;&lt;details&gt;&lt;summary&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M22.073 4.900L22.073 4.900L12.148 4.900L12.148 3.950Q12.148 3.125 11.585 2.563Q11.023 2 10.198 2L10.198 2L0.048 2L0.048 22L23.948 22L23.948 6.850Q23.998 6.025 23.448 5.462Q22.898 4.900 22.073 4.900Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;roles/&lt;/span&gt;&lt;/span&gt;&lt;/summary&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;…&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/details&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; aria-hidden=&quot;true&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path d=&quot;M23.165 13.645L23.165 13.645Q22.829 13.561 22.199 13.309L22.199 13.309L21.695 13.099Q21.695 12.637 21.632 11.797Q21.569 10.957 21.569 10.495L21.569 10.495Q21.569 10.411 21.632 10.348Q21.695 10.285 21.695 10.201L21.695 10.201L23.165 9.571Q23.543 9.361 23.669 9.004Q23.795 8.647 23.669 8.269L23.669 8.269L22.493 5.623Q22.283 5.203 21.926 5.056Q21.569 4.909 21.191 5.119L21.191 5.119L19.721 5.749Q19.469 5.749 19.469 5.623L19.469 5.623Q19.301 5.371 18.839 4.951L18.839 4.951L18.545 4.699Q18.419 4.573 18.104 4.300Q17.789 4.027 17.621 3.901L17.621 3.901Q17.789 3.649 17.978 3.124Q18.167 2.599 18.293 2.347L18.293 2.347Q18.503 1.843 18.314 1.465Q18.125 1.087 17.621 0.919L17.621 0.919Q17.075 0.793 15.815 0.373L15.815 0.373L15.143 0.121Q14.639-0.089 14.261 0.100Q13.883 0.289 13.715 0.751L13.715 0.751Q13.631 1.087 13.379 1.717L13.379 1.717L13.169 2.221Q12.707 2.221 11.867 2.284Q11.027 2.347 10.565 2.347L10.565 2.347Q10.481 2.347 10.418 2.284Q10.355 2.221 10.271 2.221L10.271 2.221L9.641 0.751Q9.431 0.373 9.074 0.247Q8.717 0.121 8.339 0.247L8.339 0.247L5.693 1.423Q5.273 1.633 5.126 1.990Q4.979 2.347 5.189 2.725L5.189 2.725L5.819 4.195Q5.819 4.447 5.693 4.447L5.693 4.447L5.399 4.699Q5.105 4.909 5.021 5.077L5.021 5.077Q4.853 5.287 4.517 5.686Q4.181 6.085 3.971 6.295L3.971 6.295Q3.677 6.211 3.047 5.959L3.047 5.959L2.543 5.749Q2.039 5.539 1.661 5.728Q1.283 5.917 1.115 6.421L1.115 6.421L0.905 6.925Q0.401 8.185 0.191 8.773Q-0.019 9.361 0.128 9.697Q0.275 10.033 0.821 10.201L0.821 10.201Q1.157 10.285 1.787 10.537L1.787 10.537L2.291 10.747Q2.291 11.209 2.354 12.049Q2.417 12.889 2.417 13.351L2.417 13.351Q2.417 13.435 2.354 13.498Q2.291 13.561 2.291 13.645L2.291 13.645L0.821 14.275Q0.443 14.485 0.317 14.842Q0.191 15.199 0.317 15.577L0.317 15.577L1.493 18.223Q1.703 18.643 2.060 18.790Q2.417 18.937 2.795 18.727L2.795 18.727L4.265 18.097Q4.517 18.097 4.517 18.223L4.517 18.223Q4.685 18.475 5.147 18.895L5.147 18.895L5.441 19.147Q5.567 19.273 5.882 19.525Q6.197 19.777 6.365 19.945L6.365 19.945Q6.239 20.197 6.029 20.722Q5.819 21.247 5.693 21.499L5.693 21.499Q5.483 22.003 5.672 22.381Q5.861 22.759 6.365 22.969L6.365 22.969Q6.659 23.053 7.331 23.305L7.331 23.305Q8.297 23.725 8.864 23.893Q9.431 24.061 9.767 23.935Q10.103 23.809 10.271 23.221L10.271 23.221Q10.355 22.885 10.607 22.255L10.607 22.255L10.817 21.751Q11.279 21.751 12.119 21.688Q12.959 21.625 13.421 21.625L13.421 21.625Q13.505 21.625 13.568 21.688Q13.631 21.751 13.715 21.751L13.715 21.751L14.345 23.221Q14.555 23.599 14.912 23.725Q15.269 23.851 15.647 23.725L15.647 23.725L18.293 22.549Q18.713 22.339 18.860 21.982Q19.007 21.625 18.797 21.247L18.797 21.247L18.167 19.819Q18.167 19.525 18.293 19.525L18.293 19.525Q18.545 19.357 18.965 18.895L18.965 18.895L19.217 18.601Q19.343 18.475 19.595 18.160Q19.847 17.845 20.015 17.719L20.015 17.719Q20.309 17.761 20.939 18.055L20.939 18.055L21.443 18.223Q21.947 18.433 22.325 18.244Q22.703 18.055 22.871 17.551L22.871 17.551Q22.997 17.257 23.249 16.585L23.249 16.585Q23.669 15.619 23.795 15.073L23.795 15.073Q24.257 13.981 23.165 13.645ZM13.967 16.375L13.967 16.375Q12.077 17.173 10.250 16.459Q8.423 15.745 7.541 13.897L7.541 13.897Q6.743 12.007 7.457 10.180Q8.171 8.353 10.019 7.471L10.019 7.471Q11.909 6.673 13.736 7.387Q15.563 8.101 16.445 9.949L16.445 9.949Q17.243 11.839 16.529 13.666Q15.815 15.493 13.967 16.375Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;ansible.cfg&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/starlight-file-tree&gt;
&lt;p&gt;On va retrouver les dossiers :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;inventories&lt;/code&gt; : Dossier qui contiendra votre/vos inventaires Ansible&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;playbooks&lt;/code&gt; : Dossier qui contiendra votre/vos playbooks Ansible&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;roles&lt;/code&gt; : Dossier qui contiendra vos roles Ansible qui seront utilisé hors collections&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;ansible.cfg&lt;/code&gt; : Fichier de configuration Ansible&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;contenu-des-différents-fichiers&quot;&gt;Contenu des différents fichiers&lt;/h2&gt;&lt;/div&gt;
&lt;starlight-tabs&gt;&lt;div&gt;&lt;ul role=&quot;tablist&quot;&gt;&lt;li role=&quot;presentation&quot;&gt;&lt;a role=&quot;tab&quot; href=&quot;#tab-panel-12&quot; id=&quot;tab-12&quot; aria-selected=&quot;true&quot; tabindex=&quot;0&quot;&gt;inventory.yaml&lt;/a&gt;&lt;/li&gt;&lt;li role=&quot;presentation&quot;&gt;&lt;a role=&quot;tab&quot; href=&quot;#tab-panel-13&quot; id=&quot;tab-13&quot; aria-selected=&quot;false&quot; tabindex=&quot;-1&quot;&gt;playbook.yaml&lt;/a&gt;&lt;/li&gt;&lt;li role=&quot;presentation&quot;&gt;&lt;a role=&quot;tab&quot; href=&quot;#tab-panel-14&quot; id=&quot;tab-14&quot; aria-selected=&quot;false&quot; tabindex=&quot;-1&quot;&gt;requirements.yaml&lt;/a&gt;&lt;/li&gt;&lt;li role=&quot;presentation&quot;&gt;&lt;a role=&quot;tab&quot; href=&quot;#tab-panel-15&quot; id=&quot;tab-15&quot; aria-selected=&quot;false&quot; tabindex=&quot;-1&quot;&gt;ansible.cfg&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div id=&quot;tab-panel-12&quot; aria-labelledby=&quot;tab-12&quot; role=&quot;tabpanel&quot;&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;Inventaire Ansible&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;all&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;hosts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;localhost&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;ansible_connection&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;local&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id=&quot;tab-panel-13&quot; aria-labelledby=&quot;tab-13&quot; role=&quot;tabpanel&quot; hidden&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;Playbook de base&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Perform&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;hosts&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;localhost&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;vars&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;timer_sync_interval&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;*:0/10:00&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;# Every 10 minutes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;handlers&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Enable ansible-pull.timer&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;become&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;ansible.builtin.systemd&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;ansible-pull.timer&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;enabled&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;daemon_reload&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;restarted&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;pre_tasks&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Deploy Ansible pull systemd unit&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;become&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;ansible.builtin.copy&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;dest&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;/etc/systemd/system/ansible-pull.service&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;content&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[Unit]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Description=Runs ansible-pull to get common server configuration&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Wants=ansible-pull.timer&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[Service]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Type=oneshot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;ExecStart=/usr/bin/ansible-pull --accept-host-key -U https://&amp;#x3C;votre_forge&gt;/&amp;#x3C;path_of&gt;/&amp;#x3C;ansible_repository&gt;.git playbooks/playbook.yaml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[Install]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;WantedBy=multi-user.target&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;owner: &apos;root&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;group: &apos;root&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;seuser: system_u&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;serole: object_r&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;setype: systemd_unit_file_t&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;selevel: s0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Configure systemd timer for Ansible pull&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;become&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;notify&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Enable ansible-pull.timer&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;ansible.builtin.copy&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;dest&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;/etc/systemd/system/ansible-pull.timer&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;content&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[Unit]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Description=starts ansible-pull to get common server configuration&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Requires=ansible-pull.service&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[Timer]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;Unit=ansible-pull.service&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;OnCalendar={{ timer_sync_interval }}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;[Install]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;WantedBy=timers.target&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;owner: &apos;root&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;group: &apos;root&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;seuser: system_u&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;serole: object_r&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;setype: systemd_unit_file_t&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;selevel: s0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Install galaxy collection community.general&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;become&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;changed_when&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;ansible.builtin.command&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;cmd&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;/usr/bin/ansible-galaxy collection install community.general&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Install galaxy&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;become&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;community.general.ansible_galaxy_install&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;collection&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;requirements_file&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;requirements.yaml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;present&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;force&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Ensure required packages are installed&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;become&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;ansible.builtin.package&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;present&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;python3-pip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id=&quot;tab-panel-14&quot; aria-labelledby=&quot;tab-14&quot; role=&quot;tabpanel&quot; hidden&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;Fichier de requirement galaxy&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;---&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;collections&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;vfricou.apps&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;source&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;https://github.com/vfricou/vfricou.apps.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;master&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;vfricou.system&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;source&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;https://github.com/vfricou/vfricou.system.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;master&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id=&quot;tab-panel-15&quot; aria-labelledby=&quot;tab-15&quot; role=&quot;tabpanel&quot; hidden&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;Configuration Ansible&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;[defaults]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;roles_path&lt;/span&gt;&lt;span&gt; = ./roles&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;playbook_dir&lt;/span&gt;&lt;span&gt; = ./playbooks&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;inventory&lt;/span&gt;&lt;span&gt; = ./inventories/inventory.yaml&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/starlight-tabs&gt;
&lt;p&gt;Je m’attarde un peu sur le fichier &lt;code dir=&quot;auto&quot;&gt;playbook.yaml&lt;/code&gt;, parce qu’il y a plusieurs choses à dire dessus.&lt;/p&gt;
&lt;p&gt;Tout d’abord, la déclaration de la variable de trigger pour le timer systemd à intervales de 10 minutes.&lt;/p&gt;
&lt;p&gt;Ensuite les tâches effectuées :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Création du l’unit « timer » systemd &lt;code dir=&quot;auto&quot;&gt;ansible-pull.timer&lt;/code&gt; qui servira au déclenchement régulier d’Ansible Pull&lt;/li&gt;
&lt;li&gt;Création de l’unit « service » systemd &lt;code dir=&quot;auto&quot;&gt;ansible-pull.service&lt;/code&gt; qui est la commande qui sera exécutée pour Ansible Pull&lt;/li&gt;
&lt;li&gt;Installation de la collection &lt;code dir=&quot;auto&quot;&gt;community.general&lt;/code&gt; pour pouvoir effectuer l’installation de ce qui est spécifié dans le fichier &lt;code dir=&quot;auto&quot;&gt;requirements.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Installation des requirements galaxy&lt;/li&gt;
&lt;li&gt;Installation du package python3-pip s’il n’est pas présent sur le système&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce que l’on souhaite faire avec ces &lt;code dir=&quot;auto&quot;&gt;pre_tasks&lt;/code&gt; c’est d’avoir tout ce qui sera nécessaire pour l’application des rôles ou
des tâches qui seront contenues dans le playbook par la suite.&lt;br&gt;
Il faut les voir comme des « pré-requis » à l’exécution du playbook.&lt;/p&gt;
&lt;div&gt;&lt;h1 id=&quot;première-exécution&quot;&gt;Première exécution&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Vu que c’est Ansible Pull lui-même qui a pour charge de gérer la configuration du timer et de l’unit systemd, vous avez
deux solutions :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Soit, vous déposez vous-même vos fichiers de timer / units, mais ce n’est pas fou&lt;/li&gt;
&lt;li&gt;Soit, vous exécutez vous-même la commande &lt;code dir=&quot;auto&quot;&gt;ansible-pull&lt;/code&gt; qui sera exécuté par l’unit systemd.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Personnellement, j’ai une très forte tendance à préférer la deuxième solution.&lt;br&gt;
Tout d’abord parce que ça ne vous fait faire qu’une seule action sur la machine, mais ensuite parce que ça vous permet
de valider que l’exécution de votre timer systemd va bien se faire sans erreurs.&lt;/p&gt;
&lt;div&gt;&lt;h1 id=&quot;et-après-&quot;&gt;Et après ?&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Et bien après, vous pouvez ajouter des rôles ou des tâches au playbook pour configurer et valider les points que
vous souhaitez faire gérer à Ansible Pull.&lt;/p&gt;
&lt;p&gt;Vous poussez vos configurations dans le dépot qui sert de référence à Ansible Pull, et le tour est joué, à intervales
réguliers, vous pourrez voir les exécutions de votre playbook sur les machines avec un simple &lt;code dir=&quot;auto&quot;&gt;journalctl -u ansible-pull.service&lt;/code&gt;.&lt;/p&gt;</content:encoded><category>Ansible</category><category>Conformité</category><category>Outils</category><category>Configuration</category></item><item><title>Naissance du site</title><link>https://blog.fricouv.eu/blog/naissance-du-site/</link><guid isPermaLink="true">https://blog.fricouv.eu/blog/naissance-du-site/</guid><description>Naissance du site</description><pubDate>Sat, 21 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;h1 id=&quot;mais-je-suis-qui-moi-&quot;&gt;Mais… Je suis qui moi ?&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Avant tout, il convient de me présenter, c’est la moindre des choses.&lt;/p&gt;
&lt;p&gt;Je m’appelle Vincent. Mon âge ? Est-ce que par hasard ça ne serait pas inutile ? (Et en plus, il faut le mettre à jour,
j’ai autre chose à penser !)&lt;br&gt;
Je suis actuellement Consultant SRE, j’ai fait pas mal d’années en tant qu’Administrateur Système avant de commencer
à fortement m’intéresser à travailler de façon plus reproductible, automatisée, et actuelle.&lt;/p&gt;
&lt;p&gt;Je me dois de clarifier une chose… Je suis un peu perplexe sur la différence entre ce que l’on appelle traditionnellement
« Administrateurs Système » et des SRE (Site Reliability Engineer) aujourd’hui.&lt;br&gt;
Pourquoi ? Parce que pour moi, dans le fond ça reste le même métier, un écart que je n’explique pas s’est créé, ce qui a
amené à ces deux termes.&lt;br&gt;
Ce qui se cache derrière et qui crée cette différenciation de terminologie, c’est le côté « Reliability » (résilience /
fiabilité). J’estime qu’un Administrateur Système doit être en capacité d’assurer la fiabilité et surtout la
fiabilisation des systèmes qu’il opère.&lt;br&gt;
C’est peut-être un biais de ma part, vous avez totalement le droit, chacun est totalement libre de ce qu’il pense et je
n’en tiendrai rigueur à personne.&lt;/p&gt;
&lt;p&gt;Donc, je suis Consultant SRE disais-je. En gros, mon boulot, c’est de conseiller, architecturer et déployer des
infrastructures résilientes, en fonction des demandes qui me sont faites.&lt;/p&gt;
&lt;p&gt;De part mon métier, mais également parce que je suis quelqu’un de curieux, je suis amené à toucher à pas mal de technologies.
Mes compétences actuelles ayant été majoritairement acquise par de l’auto-formation, et surtout, des erreurs…
Beaucoup d’erreurs.&lt;/p&gt;
&lt;div&gt;&lt;h1 id=&quot;la-théorie-de-lessai-erreur&quot;&gt;La théorie de l’essai erreur&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;J’adore la théorie de l’essai erreur. Celui qui ne fait pas ne commet jamais d’erreurs. Celui qui n’essaie pas non plus.
Celà induit qu’il ne progresse pas. (Mis à part certains cas de personnes extrêmement et particulièrement douées, parce
que ça existe.)&lt;/p&gt;
&lt;p&gt;Le conseil qui m’avait été donné il y a maintenant plusieurs longues années était le suivant : « Essaye, si tu n’y
arrives pas réessaye, mais surtout, surtout, ne désespère jamais. Si tu commences à désespérer, tu vas rentrer en régression ».&lt;br&gt;
J’avoue que ça m’a beaucoup marqué. Pour plein de raisons, mais notamment parce que j’étais à l’époque quelqu’un qui avait
une tendance à abandonner très vite. Si ce qui devait fonctionner ne fonctionnait pas, je ne me butais pas dessus.&lt;/p&gt;
&lt;p&gt;Aujourd’hui, je me bute, mais avec raison gardée, j’essaie, plusieurs fois. Je me trompe, plusieurs fois. Mais je
n’abandonne plus aussi facilement.&lt;/p&gt;
&lt;p&gt;Si je peux vous donner un conseil supplémentaire, il serait celui-là : « Si tu n’y arrives pas aujourd’hui, réessaye plus
tard, et ainsi dessuite. »&lt;br&gt;
La raison en est très simple, et elle est tout aussi justifié que les écarts de ce qu’est capable de produire une personne
sur une journée : L’état d’esprit.&lt;/p&gt;
&lt;p&gt;L’état d’esprit est quelque chose de fondamental à prendre en comptes. Certains jours, nous ne sommes pas dans les bonnes
dispositions mentales pour traiter et/ou résoudre un problème. C’est normal, ça arrive, et c’est humain.&lt;br&gt;
C’est dans ce genre de jour qu’il ne faut pas se buter sur quelque chose. Si on sent qu’on n’est pas dans les bonnes
dispositions pour traiter le problème sur lequel on travaille, on le met de côté et on y revient plus tard.&lt;/p&gt;
&lt;p&gt;Attention toute fois, je ne vous dis pas d’abandonner la tâche pendant des jours ou des semaines. Il est impératif d’avoir
évalué la criticité de cette tâche. Si ça doit être fait le jour même, il faut s’y forcer.&lt;/p&gt;
&lt;div&gt;&lt;h1 id=&quot;pourquoi-ce-site-&quot;&gt;Pourquoi ce site ?&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Bref, tout ça pour arriver à « Mais pourquoi tu fais ce site ? ».&lt;/p&gt;
&lt;p&gt;Comme je le laissais transparaitre un peu avant, j’ai vu, fait, testé, utilisé, résolu, … pas mal de choses au fil des
années.&lt;br&gt;
J’en suis arrivé aujourd’hui à me dire une chose simple : « Pourquoi ne pas partager ce que tu as dans la tête ? Tu sais
faire beaucoup de choses aujourd’hui, moins que d’autre bien sûr, mais ce qui tu sais vaut quand même le coup, alors,
partage-le, tu vas potentiellement et certainement toucher un public qui sera intéressé pour apprendre, comprendre, progresser,
ou pourquoi pas pour les plus jeunes (ou les plus fous ?) les aider à trouver leur vocation.&lt;/p&gt;
&lt;p&gt;J’ai eu la chance d’être dans une posture d’enseignant vacataire au sein de l’IUT qui m’a formé. Aujourd’hui ce n’est
plus le cas par incompatibilité avec mon planning travail, et parce qu’également je n’arrivais pas à retrouver en tant
qu’enseignant ce qui me faisait vibrer dans la transmission de savoir. (Le cadre institutionnel ou ma façon de transmettre
à des étudiants peut-être ?)&lt;br&gt;
J’ai toujours apprécié de vulgariser mon travail pour le faire comprendre à des plus néophites, et ce site, au travers
du blog ou des documentations que j’y ajouterais au fil de l’eau (et de mon temps perso) est le moyen pour moi de retrouver
ce partage-là. En amenant de nouveaux concepts à des personnes qui souhaitent apprendre, ou en complétant des connaissances
déjà acquises par d’autres. Ou tout simplement en fournissant des explications « simplifiés » à des personnes qui n’ont pas
cette facilité de vulgarisation que je pourrais avoir.&lt;/p&gt;
&lt;div&gt;&lt;h1 id=&quot;rester-les-pieds-sur-terre&quot;&gt;Rester les pieds sur terre&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Je n’ai aucune volonté de devenir une personne influente dans la tech, j’aime bien la discrétion de mon bureau, et je
suis également quelqu’un de plutôt discrêt au quotidien (même si je dis ce que j’ai à dire).&lt;/p&gt;
&lt;p&gt;Comme je l’ai dit précédemment, je ne prétends nullement que l’ensemble de ce que je pourrais écrire ici est la meilleure
façon de faire, ou même serait la meilleure explication à donner.&lt;br&gt;
Ce sont mes avis, mes process, et ma vision des choses. Elle n’est pas parfaite, elle sera très souvent incomplète, mais
elle aura le mérite d’exister.&lt;br&gt;
Et comme je le précise régulièrement « La seule source de vérité, c’est la documentation officielle, pas un blog écrit
par on-ne-sait pas qui sur internet, et encore moins les réseaux sociaux ».&lt;/p&gt;
&lt;p&gt;Les blogs ou articles techniques que l’on peut trouver sur le web (y compris celui-ci) ne sont pas mauvais, mais ils sont
l’expression des personnes qui les écrivent.&lt;br&gt;
Avec les biais, avec les erreurs, avec les oublis, avec le manque de précision que chaque humain peut avoir.&lt;/p&gt;</content:encoded><category>Origines</category><category>Site</category><category>Blog</category></item></channel></rss>