
    
    
        
        
                
    
        
        
            
    
        
        
                
    
        
        
            
    
        
        
            
    
        
        
                
    
        
        
            
    
        
        
            
    
        
        
                
    
        
        
        
{"version":"https:\/\/jsonfeed.org\/version\/1","title":"Le flux RSS qui va bien.","home_page_url":"https:\/\/nicolaslang.fr\/articles","feed_url":"https:\/\/nicolaslang.fr\/articles.json","description":null,"author":{"name":"Nicolas Lang"},"items":[{"title":"Un agent HAProxy sous Windows","date_published":"2025-06-13T15:06:00+02:00","id":"https:\/\/nicolaslang.fr\/articles\/un-agent-haproxy-sous-windows","url":"https:\/\/nicolaslang.fr\/articles\/un-agent-haproxy-sous-windows","content_html":"<h1>HAProxy est un outil formidable.<\/h1>\n<p>Je l'ai d&eacute;couvert il y'a de &ccedil;a quelques ann&eacute;es dans un groupe dans lequel je travaillais, et qui faisait une large place &agrave; l'open-source et &agrave; Linux de mani&egrave;re g&eacute;n&eacute;rale au sein de leur syst&egrave;me informatique, mais sans avoir l'occasion de le pratiquer vraiment de mani&egrave;re intensive,<\/p>\n<p>C'&eacute;tait juste une d&eacute;monstration de l'outil, de ses capacit&eacute;s pour de r&eacute;partition de charge pour des connexions web en mode round-robin.<\/p>\n<p>Les capacit&eacute;s de l'outil vont au del&agrave; du simple &eacute;quilibrage de charge sur du web : Reverse proxy http\/s, failover et j'en passe, l'outil est vraiment complet dans sa version communautaire et permet d&eacute;j&agrave; de faire &eacute;norm&eacute;ment de choses.<\/p>\n<h2>Comment &ccedil;a marche HAProxy ?<\/h2>\n<p>HAProxy cr&eacute;&eacute; des frontend (des ports sur lesquels les clients vont pouvoir se connecter) et les rediriger vers un backend (un ou plusieurs serveurs qui fournissent un m&ecirc;me service).\nDans sa configuration, il est possible de proc&eacute;der &agrave; des v&eacute;rifications qui permettront de savoir pour chaque serveur d'un backend si le port qui est cens&eacute; r&eacute;pondre r&eacute;pond, afin de pouvoir valider que celui-ci est en mesure de recevoir des connexions et de ne pas rediriger une connexion dessus si son &eacute;tat de sant&eacute; n'est pas bon.<\/p>\n<p>Dans un backend, le poids de chaque serveur permet de d&eacute;finir la mani&egrave;re dont seront &eacute;quilibr&eacute;es les connexions. Ce poids prend la mesure d'un nombre et fonctionne en prenant en compte l'ensemble des poids des machines d'un backend.<\/p>\n<p>Par exemple, si mon backend est constitu&eacute; de 2 machines qui ont toutes deux un poids de 100, HAProxy enverra une connexion sur le premier, la suivante sur le second, la troisi&egrave;me sur le premier, la quatri&egrave;me sur le second, etc.<\/p>\n<p>Le calcul est fait de la mani&egrave;re suivante : <\/p>\n<blockquote>\n<p>Poids de la machine \/ Somme des poids du backend * 100<\/p>\n<\/blockquote>\n<p>Dans notre exemple cela donne 100\/200 * 100 = 50. <\/p>\n<p>La machine 1 prendra 50% des connexions, la machine 2 50%.<\/p>\n<p>Si notre backend comportait 4 machines au lieu de 2, le poids serait de :<\/p>\n<p>100\/400 * 100 = 25%<\/p>\n<p>Chaque machine prendrait donc 1 connexion sur 4.<\/p>\n<p>Dans la configuration d'HAProxy, un backend ressemble &agrave; &ccedil;a : <\/p>\n<pre><code>backend Back_web\n   mode http\n   balance roundrobin\n   server serverapp1 192.168.251.99:80 check weight 100 \n   server serverapp2 192.168.251.112:80 check weight 100\n   server serverapp3 192.168.251.113:80 check weight 100\n   server serverapp4 192.168.251.114:80 check weight 100\n<\/code><\/pre>\n<p>Et dans un monde parfait, la charge est parfaitement &eacute;quilibr&eacute;e et aucun serveur ne se retrouve en surcharge par rapport &agrave; un autre.<\/p>\n<h2>Ce monde n'est pas parfait<\/h2>\n<p>Notre monde est rempli d'in&eacute;galit&eacute;s. <\/p>\n<p>Vous &eacute;quilibrez vos connexions dans votre backend, mais sur un des serveurs, une requ&ecirc;te SQL lanc&eacute;e par Martin, de la compta (c'est toujours la compta qui pose probl&egrave;me), est en train de mettre une de vos machines sur les genoux. <\/p>\n<p>Votre CPU grimpe, la RAM &eacute;galement, votre machine souffre pendant que le restant du backend vit sa vie tranquillement.<\/p>\n<p>Et dans ce monde imparfait, votre v&eacute;rification d'&eacute;tat de sant&eacute; venant d'HAProxy vers ce serveur mis...<\/p>","date_modified":"2025-06-13T15:08:23+02:00","tags":["haproxy","loadbalancing"],"image":"\/user\/pages\/03.articles\/un-agent-haproxy-sous-windows\/2025-06-13 15_02_23-Param\u00e8tres.jpg"},{"title":"Retour aux sources et \u00e0 l&#039;apprentissage","date_published":"2024-09-21T19:30:54+02:00","id":"https:\/\/nicolaslang.fr\/articles\/premiers-pas-sur-ansible","url":"https:\/\/nicolaslang.fr\/articles\/premiers-pas-sur-ansible","content_html":"<h1>Oui mais quelles sources ?<\/h1>\n<p>Et bien... J'ai toujours aim&eacute; l'automatisation.\nAussi bien dans le principe de fonctionnement que dans l'apport que cela offre, automatiser a toujours &eacute;t&eacute; pour moi la mani&egrave;re de se simplifier la vie, ou plut&ocirc;t une mani&egrave;re de perdre du temps afin d'en gagner.<\/p>\n<p>Le principal int&eacute;r&ecirc;t que j'ai pu porter (et que je porte toujours mais dans une moindre mesure) &agrave; Powershell en est l'exemple, ou encore dans les quelques scripts python que j'ai pu faire.\nMais, mon travail changeant, je n'ai plus vraiment autant d'opportunit&eacute; de cr&eacute;er des scripts pour d&eacute;rouler des process et actions, de perdre &agrave; nouveau du temps pour en gagner. Mais comme je ne supporte pas de stagner, et comme la routine m'ennuie, il me fallait un nouveau d&eacute;fi, quelque chose qui me donne un challenge, un apprentissage qui me permettrait de retourner aussi &agrave; des sources qui s'&eacute;loignent de mon quotidien.<\/p>\n<p>Et c'est ainsi que je me suis tourn&eacute; vers l'apprentissage d'Ansible. <\/p>\n<p>Ansible c'est quoi ? C'est un outil de gestion centralis&eacute;e, d'automatisation et de d&eacute;ploiement, que ce soit de configurations ou de logiciels. On l'utilise g&eacute;n&eacute;ralement avec SSH pour se connecter aux machines Linux via une cl&eacute; de s&eacute;curit&eacute;, et via WinRM pour discuter avec les machines windows.\nSon principal atout (qui peut aussi &ecirc;tre un inconv&eacute;nient), c'est qu'aucun agent n'est &agrave; installer. Seule la machine qui envoie les demandes d'action (nomm&eacute;e Control Node) a besoin d'Ansible. C'est un atout car il n'y a pas de configuration suppl&eacute;mentaire &agrave; faire sur les machines, mais c'est un inconv&eacute;nient car cela veut dire aussi que l'ensemble des ex&eacute;cutions se font &agrave; la demande du Control Node.\nMais cette technologie m'int&eacute;resse, parce que les possibilit&eacute;s sont juste dingues. <\/p>\n<p>Alors... <\/p>\n<h1>&Agrave; quoi servira cet article ?<\/h1>\n<p>Cet article (ou plut&ocirc;t CES articles) servira de journal de bord de mon apprentissage. Je suis parti de z&eacute;ro, la techno m'&eacute;tant inconnue et <a href=\"https:\/\/www.youtube.com\/@xavki\">seules les excellentes vid&eacute;os de Xavki<\/a> seront mon point de d&eacute;part pour la d&eacute;couverte de cet outil. <\/p>\n<p>Je compte y mettre mes diff&eacute;rents projets, mes diff&eacute;rents essais, mes r&eacute;ussites et mes &eacute;checs, afin de pouvoir &agrave; la fois conserver une trace de ma progression (qui, je l'esp&egrave;re, ne sera pas la m&ecirc;me qu'avec K3S que j'ai abandonn&eacute; par manque de mat&eacute;riel pour m'auto-former).<\/p>\n<p>Mais vous vous en doutez, si j'&eacute;cris cette page, c'est aussi parce que j'ai commenc&eacute; &agrave; gratter le sujet et parce que j'arrive &agrave; trouver des ressources et un int&eacute;r&ecirc;t suffisant pour me dire que je veux creuser encore le sujet et arriver &agrave; faire des choses sympa.\nAlors nous verrons o&ugrave; je vais, ce que j'arrive &agrave; faire. Je sais que ce genre de parcours demande un investissement en temps et en &eacute;nergie qui est assez compliqu&eacute;... les journ&eacute;es sont longues et d&eacute;j&agrave; suffisamment charg&eacute;es, mais les temps morts ne sont pas pour autant inexistants, alors quoi de mieux qu'en profiter pour apprendre afin de ne pas rester avachi et ne rien faire durant ces moments l&agrave; ?...<\/p>","date_modified":"2024-09-21T19:30:54+02:00","tags":["ansible","formation"]},{"title":"Synchroniser une configuration NGINX en cluster Keepalived","date_published":"2023-12-17T20:21:58+01:00","id":"https:\/\/nicolaslang.fr\/articles\/synchroniser-une-configuration-nginx-en-cluster-keepalived","url":"https:\/\/nicolaslang.fr\/articles\/synchroniser-une-configuration-nginx-en-cluster-keepalived","content_html":"<h2>Pourquoi ?<\/h2>\n<p>Suite &agrave; l'article pr&eacute;c&eacute;dent sur la mise en place d'un cluster Keepalived, un probl&egrave;me se pr&eacute;sentait &agrave; moi. Si j'ai bien un cluster fonctionnel de serveurs Nginx, je n'ai cependant pas de configuration redondante. Si je met &agrave; jour un site ou que j'ajoute un certificat, je dois penser &agrave; changer la configuration de l'autre c&ocirc;t&eacute;, avec ce que cela inclut comme oubli ou risque d'erreur de frappe.\nAlors, il fallait que je r&eacute;fl&eacute;chisse comment faire pour que tout cela s'automatise.<\/p>\n<h2>Comment fait-on ?<\/h2>\n<p>Mes deux reverse proxy sont uniquement des reverse proxy, ils n'h&eacute;bergent aucun site. Ils portent des certificats, des d&eacute;finitions de sites web, et c'est tout.<\/p>\n<p>Mais il est important aussi pour moi d'avoir des informations de supervision. Je vais donc cr&eacute;er un micro-site qui donnera le nom de l'h&ocirc;te sur l'adresse IP du routeur VRPP Keepalived.<\/p>\n<p>Il va me falloir donc synchroniser les fichiers pr&eacute;sents dans \/etc\/nginx (pour les configurations du serveur web et des sites), ceux dans \/etc\/letsencrypt (pour les certificats et les informations de renouvellement) et ceux de \/var\/www (pour le fameux micro-site pr&eacute;cis&eacute; juste au dessus).  <\/p>\n<p>Mais il me fallait aussi r&eacute;fl&eacute;chir &agrave; la mani&egrave;re dont les configurations allaient se synchroniser : id&eacute;alement, il faudrait que les informations marchent toujours dans le m&ecirc;me sens, que je n'ai qu'&agrave; toucher un seul et m&ecirc;me serveur pour m'assurer que la synchro se fasse bien. J'ai donc d&eacute;cid&eacute; que la configuration serait tir&eacute;e par le backup depuis le master, en t&acirc;che de fond, et pour ce faire il fallait tout d'abord pouvoir effectuer de <a href=\"https:\/\/www.redhat.com\/sysadmin\/passwordless-ssh\">la connexion SSH sans mot de passe via cl&eacute;.<\/a><\/p>\n<p>L'outil pour synchroniser le tout m'apparaissait clair : rsync. Rapide, fiable, scriptable, on peut lui pr&eacute;senter des cl&eacute;s de connexion, c'&eacute;tait l'outil id&eacute;al.<\/p>\n<p>Mais pour arriver &agrave; savoir qui est backup et qui est master, il me fallait plus d'informations. Lorsque je regardais la premi&egrave;re configuration de Keepalived, j'avais remarqu&eacute; des options pour pr&eacute;senter des informations depuis le SNMP. C'est par ce biais que l'on conna&icirc;tra qui tient le r&ocirc;le.<\/p>\n<h2>Lan&ccedil;ons nous !<\/h2>\n<p>Tout d'abord, il nous faut quelques pr&eacute;requis. <\/p>\n<h3>Le micro-site (facultatif)<\/h3>\n<p>C'est purement pour la supervision. Installez php ainsi que php-fpm et cr&eacute;er un fichier index.php dans \/var\/www\/dossier_de_votre_choix\/<\/p>\n<p>Ajoutez-y ce contenu<\/p>\n<pre><code>&lt;?php\n$host = gethostname();\n$array = Array ( \"host\" =&gt; $host);\necho json_encode($array);\n?&gt;<\/code><\/pre>\n<p>Cr&eacute;ez ensuite un fichier de site (ici keepalived.conf) dans \/etc\/nginx\/sites-available\/<\/p>\n<p>Pensez bien &agrave; mettre un nom dans server_name qui vous va, et &eacute;galement de cr&eacute;er cette entr&eacute;e dans votre DNS.<\/p>\n<pre><code>server {\n    listen 80 default;\n    listen [::]:80 default;\n    server_name reverse-ha.local;\n    add_header  Content-Type    application\/json;\n    default_type application\/json;\n         location \/ {\n            add_header  Content-Type    application\/json;\n            try_files $uri \/index.php$is_args$args;\n         }\n\n         location ~ \\.php$ {\n            fastcgi_split_path_info ^(.+\\.php)(\/.+)$;\n            fastcgi_pass unix:\/var\/run\/php\/php-fpm.sock;\n            fastcgi_index index.php;\n            include fastcgi.conf;\n        }\nroot \/var\/www\/keepalived;\n\n    error_log \/var\/log\/nginx\/keepalived.err;\n}\n<\/code><\/pre>\n<p>Cr&eacute;ez le lien symbolique :<\/p>\n<pre><code>sudo ln -s \/etc\/nginx\/sites-available\/keepalived.conf \/etc\/nginx\/sites-enabled<\/code><\/pre>\n<p>V&eacute;rifiez votre configuration : <\/p>\n<pre><code>sudo nginx -t<\/code><\/pre>\n<p>Rechargez la conf si tout est ok :<\/p>\n<pre><code>sudo systemctl reload nginx<\/code><\/pre>\n<h3>La configuration SNMP pour Keepalived<\/h3>\n<p>Modifiez le fichier \/etc\/default\/keepalived, pour ajouter dans...<\/p>","date_modified":"2023-12-17T20:21:58+01:00","tags":["keepalived","nginx","zabbix","rsync"],"image":"\/user\/pages\/03.articles\/synchroniser-une-configuration-nginx-en-cluster-keepalived\/Screenshot_20231203_163329.jpg"},{"title":"R\u00e9cuperer les informations de compression Nutanix depuis Powershell","date_published":"2023-12-17T20:11:10+01:00","id":"https:\/\/nicolaslang.fr\/articles\/recuperer-les-informations-de-compression-nutanix-depuis-powershell","url":"https:\/\/nicolaslang.fr\/articles\/recuperer-les-informations-de-compression-nutanix-depuis-powershell","content_html":"<p>Nutanix est un formidable outil capable de bien des choses pour la virtualisation, avec des fonctions de redondance propres \u00e0 l'hyperconvergence, mais aussi de gains de performances et d'optimisation du hardware avec de nombreuses technologies, dont la compression fait partie.<\/p>\n<p>Cependant, tout outil n'est pas \u00e0 l'abri de pannes, qu'elles soient logicielles, mat\u00e9rielles, ou humaines. <\/p>\n<p>R\u00e9cemment, nous avons fait face \u00e0 une explosion incompr\u00e9hensible de la volum\u00e9trie sur certains containers. Apr\u00e8s avoir analys\u00e9 et corrig\u00e9 la source du probl\u00e8me, nous avions besoin de remonter les informations de compression (compression qui fonctionnait tr\u00e8s mal \u00e0 cause d'un probl\u00e8me hardware mettant un des h\u00f4tes en carafe) afin de nous assurer que les taux redescendaient \u00e0 un niveau acceptable. Cependant, nous avions besoin d'avoir une vue trac\u00e9e sur X jours, collect\u00e9e toutes les heures, ce qui excluait une supervision manuelle en se connectant \u00e0 Prism.<\/p>\n<p>Heureusement, Nutanix a trouv\u00e9 bon de fournir un snappin permettant l'administration \u00e0 distance, et laissant libre court \u00e0 ma fi\u00e8vre codeuse :)<\/p>\n<p>La compression est faite au niveau d'un container, il vous faudra donc conna\u00eetre l'identifiant de chaque container (disponible depuis la CLI ou depuis Prism), ainsi que les noms des m\u00e9triques additionnelles que vous souhaitez ajouter.\nLe script va se connecter \u00e0 un Cluster Nutanix (avec des identifiants chiffr\u00e9s au pr\u00e9alable, voir ici si vous voulez savoir comment faire)<\/p>\n<p>Vous pouvez t\u00e9l\u00e9charger le script <a href=\"https:\/\/git.nicolaslang.fr\/nlang\/Blog\/src\/branch\/main\/Nutanix\/compression_info.ps1\" target=\"_blank\"> sur mon espace git personnel.<\/a><\/p>\n<pre><code>#ajout du snappin\nAdd-PSSnapin NutanixCMDletsPSSnapin\n\n#l'ip du cluster que nous allons interroger\n$clusterip = \"10.0.0.100\"\n\n#un identifiant ayant possibilit\u00e9 de se connecter\n$username = 'user@domain.fr'\n\n#le mot de passe li\u00e9 \u00e0 cet utilisateur\n$password = (Get-Content C:\\users\\moi\\motdepassechiffr\u00e9.txt | ConvertTo-SecureString)\n\n#cr\u00e9ation d'une connexion\n\n$connection = Connect-NTNXCluster -Server $ip -UserName $username -Password $password -ForcedConnection -AcceptInvalidSSLCerts\nif ($connection.isconnected -eq $false)\n{\n    exit 20\n}\n\n#id du container recherch\u00e9\n\n$id = \"00042dc6-1b11-a279-6b43-246e960c61c2::44330611\"\n\n#on essaie d'obtenir les informations de compression, on exit avec un code d'erreur 30 si une erreur se produit. Vous pouvez ajouter dans la partie catch{} toute action suppl\u00e9mentaire qui vous permettrait d'avoir du debug.\n\ntry\n{\n    $stats = Get-NTNXContainerStat -Id $id -Metrics data_reduction.overall.saving_ratio_ppm,data_reduction.compression.saving_ratio_ppm -ErrorAction Stop\n}\ncatch\n{\n    exit 30\n}\n#on prend la date et heure actuelle\n$now = Get-Date\n\n#on exporte nos informations en ajout d'un fichier CSV qui sera dans C:\\Temp et qui aura pour nom la date du jour.\ntry{\n    [pscustomobject]@{\n    \"date\" = $now.ToShortDateString()\n    \"heure\" = $now.ToShortTimeString()\n    \"m\u00e9trique 1\" = $stats[0].metric\n    \"valeur 1\" = $stats[0].values[0] \/ 1000000\n    \"m\u00e9trique 2\" = $stats[1].metric\n    \"valeur 2\" = $stats[1].values[0] \/ 1000000\n    } | Export-Csv -Delimiter \";\" -NoTypeInformation -Append -Encoding UTF8 -Path \"C:\\Temp\\compression_$($now.ToShortDateString().Replace(\"\/\",\"_\")).csv\" -ErrorAction Stop\n}\ncatch\n{\n    exit 40\n}<\/code><\/pre>\n<p>De l\u00e0, vous pourrez avoir une vue et un suivi sur la compression Nutanix par le biais de fichiers CSV.<\/p>","date_modified":"2023-12-17T20:11:10+01:00","tags":["powershell","nutanix"]},{"title":"Changer des backups Veeam via Powershell","date_published":"2023-12-17T20:04:57+01:00","id":"https:\/\/nicolaslang.fr\/articles\/changer-des-backups-veeam-via-powershell","url":"https:\/\/nicolaslang.fr\/articles\/changer-des-backups-veeam-via-powershell","content_html":"<p>Veeam est un excellent outil pour effectuer des sauvegardes. Sa facilit&eacute; de gestion, les possibilit&eacute;s nombreuses, les fonctionnalit&eacute;s et les performances sont la raison premi&egrave;re de son impl&eacute;mentation dans bon nombre d'entreprises.\nDans une de mes exp&eacute;riences professionnelles, j'ai eu &agrave; g&eacute;rer une belle infrastructure Veeam : Un serveur Veeam avec une BDD s&eacute;par&eacute;e, 6 serveurs de repository, une vingtaine de serveurs proxy et une volum&eacute;trie de plus de 400 To.\nEt vous vous doutez bien que pour une telle infrastructure, il y a un bon nombre de sauvegardes qui sont pr&eacute;sentes. Plus d'une centaine, exactement.<\/p>\n<p>Et qu'est ce qui se passe lorsque l'on doit changer la politique sur les backups?<\/p>\n<ol>\n<li>On se fait tout &agrave; la main, sauvegarde par sauvegarde, en pleurant tout du long.<\/li>\n<li>On appelle ses comp&eacute;tences de scripting pour le faire (ou alors on se retrouve sur cet article pour profiter de ce qui vous est humblement offert) et c'est boucl&eacute; en quelques secondes<\/li>\n<\/ol>\n<p>Bien sur, on fait appel &agrave; la solution 2, et on trouve en suite de cet article le script tant demand&eacute;, comment&eacute;, expliqu&eacute;!\nDans cet exemple, vous verrez comment : <\/p>\n<ul>\n<li>changer le nombre de jour de r&eacute;tention et de le passer &agrave; la valeur que vous souhaitez (dans ce script : 14 jours)<\/li>\n<li>modifier les jours de Synthetic Full (dans ce script : Lundi et Vendredi)<\/li>\n<\/ul>\n<p>N'h&eacute;sitez pas &agrave; laisser un petit commentaire si ce script vous a &eacute;t&eacute; utile!<\/p>\n<p>Vous pouvez le t&eacute;l&eacute;charger <a href=\"https:\/\/git.nicolaslang.fr\/nlang\/Blog\/src\/branch\/main\/Veeam\/backup_modification.ps1\" target=\"_blank\"> sur mon espace git personnel.<\/a><\/p>\n<pre><code>#On commence par importer le module Veeam pour Powershell. Ce module est disponible sur le serveur ayant Veeam Backup &amp; Restore d'install&eacute;\nImport-Module Veeam.Backup.PowerShell\n\n# Nous enregistrons l'ensemble des jobs que nous voulons modifier. Ici, nous filtrons sur les jobs ayant \"Premium\" dans leur nom\n$tochangejobs = Get-VBRJob -Name \"premium\"\n\n# Cet index est juste l&agrave; pour afficher la progression, rien de plus\n$i = 1\n\n#Pour chaque job dans les jobs s&eacute;lectionn&eacute;s\nforeach ($changeme in $tochangejobs)\n\n{\n      #On affiche la progression via Write-Progress\n      Write-Progress -Activity \"Modification des jobs\" -Status $($changeme).name -PercentComplete $($i \/ $($tochangejobs.count) \\* 100)\n\n      #Pour les jobs de Synthetic Full, on peut utiliser Set-VBRJobAdvancedBackupOptions, qui permet de modifier certains param&egrave;tres que l'on trouve dans les arguments de la commande.\n      #Ici, TransformToSyntethicDays accepte une liste s&eacute;par&eacute;e par des virgules d'une &eacute;num&eacute;ration de jours.\n      Set-VBRJobAdvancedBackupOptions -Job $changeme -TransformToSyntethicDays Friday,Monday\n\n      #Par contre, Set-VBRJobAdvancedBackupOptions n'est pas en mesure de changer la dur&eacute;e de r&eacute;tention. \n      #Pour &ccedil;a, nous allons directement changer une propri&eacute;t&eacute; d'un objet repr&eacute;sentant les options du job.\n      try\n\n      {\n          #Nous enregistrons les options du job s&eacute;lectionn&eacute; dans un objet\n          $joboptions = Get-VBRJobOptions -Job $changeme -ErrorAction Stop\n\n          #Puis nous modifions les propri&eacute;t&eacute;s de cet objet &agrave; notre guise. Ici, le nombre de points du job.\n          $joboptions.BackupStorageOptions.RetainCycles = 14\n\n          #Et enfin, nous appliquons &agrave; nouveau l'objet d'options de job &agrave; notre job, ce qui aura pour effet de le modifier.\n          Set-VBRJobOptions -Job $changeme -Options $joboptions -ErrorAction Stop\n\n      }\n\n      catch \n\n      {\n          #Un peu de Try \/ Catch au cas ou un probl&egrave;me arrive\n          Write-Error \"Erreur...<\/code><\/pre>","date_modified":"2023-12-17T20:04:57+01:00","tags":["powershell","script","veeam"]},{"title":"A l&#039;assaut de keepalived","date_published":"2023-11-29T13:30:52+01:00","id":"https:\/\/nicolaslang.fr\/articles\/a-lassaut-de-keepalived","url":"https:\/\/nicolaslang.fr\/articles\/a-lassaut-de-keepalived","content_html":"<p>Dans cet article, nous allons parler de la mise en place dans un environnement de test d'une s&eacute;curit&eacute; avec keepalived.<\/p>\n<h2>Pourquoi ?<\/h2>\n<p>Comme je me suis lanc&eacute; de mani&egrave;re un peu plus s&eacute;rieuse dans l'auto-h&eacute;bergement (merci <a href=\"https:\/\/nicolaslang.fr\/articles\/ma-decouverte-de-proxmox\">Proxmox<\/a>), j'ai &eacute;galement besoin d'avoir une certaine forme de redondance sur des &eacute;l&eacute;ments un peu critiques, comme mon reverse proxy, qui tient et g&egrave;re l'int&eacute;gralit&eacute; des certificats et sert de point d'entr&eacute;e aux diff&eacute;rents sites accessibles depuis le web (comme ce blog, que vous lisez).<\/p>\n<p>Lorsque je dois faire une maintenance longue dessus, qui signifie une coupure compl&egrave;te de l'ensemble des sites et services li&eacute;s, je souhaite avoir un second reverse proxy qui servira de point d'entr&eacute;e le temps n&eacute;cessaire, ou si un crash arrive sur un &eacute;l&eacute;ment cl&eacute; (par exemple nginx qui s'arr&ecirc;te). <\/p>\n<p>Dans une configuration keepalived, une VIP (Virtual IP) est cr&eacute;e. Cette adresse est bascul&eacute;e d'un n&oelig;ud &agrave; l'autre lorsque l'un ne r&eacute;ponds pas, en utilisant un syst&egrave;me de priorit&eacute; et de poids (le poids le plus lourd l'emporte et prend la VIP pour lui). C'est vers cette VIP que les requ&ecirc;tes web devront &ecirc;tre redirig&eacute;es au niveau du firewall, via le PAT.<\/p>\n<p>Je connaissais de par mes pr&eacute;c&eacute;dents emplois keepalived, j'avais d&eacute;j&agrave; rapidement jet&eacute; un &oelig;il dessus, mais jamais je n'avais eu l'occasion d'en mettre en place un. Et bien &ccedil;a tombe bien, puisqu'on va le faire maintenant.<\/p>\n<h2>Pr&eacute;paration de l'environnement de test<\/h2>\n<p>J'ai cr&eacute;&eacute; 2 conteneurs d&eacute;di&eacute;s &agrave; du nginx, nomm&eacute;s respectivement <strong>nginx-ha-1<\/strong> et <strong>nginx-ha-2<\/strong>.<\/p>\n<p>Sur chaque serveur, j'ai install&eacute; un serveur web (j'ai choisi nginx, vous ne vous en doutiez pas, hein ?)<\/p>\n<p>Sur <strong>nginx-ha-1<\/strong> j'ai cr&eacute;&eacute; un site qui affiche : <\/p>\n<pre><code>NGINX1 coucou et bienvenue sur nginx1 <\/code><\/pre>\n<p>Et sur <strong>nginx-ha-2 <\/strong> j'ai cr&eacute;&eacute; un site tout pareil qui affiche : <\/p>\n<pre><code>NGINX2 coucou et bienvenue sur nginx2 <\/code><\/pre>\n<p>Chacun est accessible sur son adresse IP. Tout est pr&ecirc;t, il n'y a plus qu'&agrave; !<\/p>\n<h2>Installation et configuration de keepalived<\/h2>\n<p>C'est d'une simplicit&eacute; classique (sur la partie Debian du moins) :<\/p>\n<p>apt update\napt install keepalived<\/p>\n<p>Le tout est install&eacute; dans \/etc\/keepalived et un fichier de configuration d'exemple est fourni (nous ne l'utiliserons pas).<\/p>\n<p>Voici comment est configur&eacute; mon keepalived (fichier \/etc\/keepalived\/keepalived.conf) et les commentaires li&eacute;s : <\/p>\n<h3>Sur nginx-ha-1<\/h3>\n<pre><code>global_defs {\n  router_id nginx-ha-1-MASTER\n}<\/code><\/pre>\n<p>router_id correspond au nom du noeud au sein de l'instance keepalived. L'information est facultative (le hostname est pris) mais je voulais la pr&eacute;senter<\/p>\n<pre><code>vrrp_script chk_nginx {\n   script \"\/usr\/bin\/pgrep nginx\"\n   interval 2\n   weight 20\n}<\/code><\/pre>\n<p>Il s'agit d'un script de v&eacute;rification de nginx. Je lance un pgrep (recherche de process) de nginx, &agrave; une intervalle de 2 secondes. Si le code de retour est 0 (succ&egrave;s) alors j'ajoute 20 au poids actuel de cette instance de keepalived.<\/p>\n<pre><code>vrrp_instance VI_1 {\n  state MASTER\n  interface eth0\n  virtual_router_id 51\n  priority 100\n  advert_int 1\n  authentication {\n    auth_type PASS\n    auth_pass 1357\n  }\n  virtual_ipaddress {\n    192.168.0.254\/24\n  }\n  unicast_src_ip 192.168.0.116\n  unicast_peer {\n    192.168.0.145\n  }<\/code><\/pre>\n<p>La d&eacute;finition de notre instance, nomm&eacute;e VI_1<\/p>\n<p><strong>state<\/strong> : MASTER ou BACKUP. Master signifie qu'il est d&eacute;fini &agrave; son...<\/p>","date_modified":"2023-11-29T13:30:52+01:00","tags":["keepalived","nginx","cluster"],"image":"\/user\/pages\/03.articles\/a-lassaut-de-keepalived\/Screenshot_20231129_130031.png"},{"title":"Ajouter un domaine de messagerie dans Postfix","date_published":"2023-10-05T11:59:00+02:00","id":"https:\/\/nicolaslang.fr\/articles\/ajouter-un-domaine-dans-postfix","url":"https:\/\/nicolaslang.fr\/articles\/ajouter-un-domaine-dans-postfix","content_html":"<p>Il y'a de &ccedil;a quelques temps, j'ai d&eacute;cid&eacute; de monter sur mon VPS un serveur de mail en utilisant Postfix, Dovecot et Spamassassin. Comme je n'avais pas pour autant l'envie de me casser trop les pieds avec des configurations que je ne connaissais pas, j'ai utilis&eacute; <a href=\"https:\/\/github.com\/LukeSmithxyz\/emailwiz\/blob\/master\/emailwiz.sh\">l'excellent script de Luke Smith<\/a> qui permet de g&eacute;nerer automatique toute la configuration permettant &agrave; cet ensemble logiciel (qui inclut &eacute;galement la g&eacute;n&eacute;ration des cl&eacute;s DKIM).<\/p>\n<p>J'&eacute;tais bien content avec mon domaine, qui &eacute;tait utilis&eacute; pour mes diff&eacute;rents services, et puis m'est venue l'id&eacute;e de transf&eacute;rer ce blog (auparavant chez Google) pour une solution auto-heberg&eacute;e plus respectueuse de la vie priv&eacute;e et me permettant de g&eacute;rer ma configuration comme je le d&eacute;sirais. Et c'est avec ce blog qu'est n&eacute; le domaine nicolaslang.fr et forc&eacute;ment l'id&eacute;e d'avoir mon nom de domaine pour la messagerie m'apparut comme une &eacute;vidence.<\/p>\n<p>Seulement voil&agrave;, j'ai utilis&eacute; un script pour monter mon mail server, mais sans infos de comment faire pour ajouter un second domaine... Alors apr&egrave;s un peu d'observation de ce que fait le script, quelques recherches sur les configurations possibles et nous voila partis pour nos modifications.<\/p>\n<h3>Comment faire?<\/h3>\n<p>Nous allons d&eacute;j&agrave; supposer que vous avez d&eacute;j&agrave; cr&eacute;&eacute; les entr&eacute;es DNS pour votre nouveau mail domain.<\/p>\n<h4>Cr&eacute;ation d'un nouveau certificat<\/h4>\n<p>Tout d'abord, puisque vous ajoutez un domaine, vous devez avoir &eacute;galement un certificat pour ce domaine. Or Postfix et Dovecot ne prennent en compte qu'un seul certificat, qui ne couvrira qu'un domaine sur les deux. Il faut donc leur ajouter un certificat ayant plusieurs common name qui couvrira l'ensemble de vos domaines (ici nomm&eacute;s mail.domaine1.fr et mail.domaine2.fr, &agrave; remplacer bien entendu par le nom DNS de votre serveur de messagerie).<\/p>\n<pre><code>sudo certbot certonly -d mail.domaine1.fr -d mail.domaine2.fr<\/code><\/pre>\n<h4>Modification de la configuration PostFix<\/h4>\n<p>Votre nouveau certificat g&eacute;n&eacute;r&eacute;, allez &eacute;diter \/etc\/postfix\/main.cf et modifier les lignes suivantes pour :<\/p>\n<ol>\n<li>Informer Postfix de prendre votre nouveau certificat<\/li>\n<li>Pr&eacute;ciser un domaine virtuel qui vous permettra d'accepter les mails arrivant en @domaine2.fr<\/li>\n<li>Pr&eacute;ciser le fichier de mappage des utilisateurs (comment savoir qui sera en @domaine1.fr ou en @domaine2.fr)<\/li>\n<\/ol>\n<p>Ces lignes ci pour le nouveau cert :<\/p>\n<pre><code>smtpd_tls_cert_file = \/etc\/letsencrypt\/live\/mail.domaine1.fr-0001\/fullchain.pem\nsmtpd_tls_key_file = \/etc\/letsencrypt\/live\/mail.domaine1.fr-0001\/privkey.pem<\/code><\/pre>\n<p>Ajouter ces lignes ci en fin de fichier conf pour le vdomain et le mappage des utilisateurs : <\/p>\n<pre><code># Domaine virtuel\nvirtual_alias_domains = domaine2.fr\nvirtual_alias_maps = hash:\/etc\/postfix\/virtual<\/code><\/pre>\n<p>Une fois ces points ci fait, nous allons cr&eacute;er le fichier \/etc\/postfix\/virtual et y renseigner les diff&eacute;rents utilisateurs qui seront dans le domaine2 sous ce format<\/p>\n<pre><code>newuser@domaine2.fr newuser<\/code><\/pre>\n<p>Comme le script utilise les utilisateurs UNIX pour l'authentification, vous devrez avoir un utilisateur nomm&eacute; \"newuser\" existant.<\/p>\n<h4>Modification de la configuration Dovecot<\/h4>\n<p>Dovecot n'aura besoin comme modification uniquement que du nouveau certificat<\/p>\n<pre><code>ssl_cert = &lt;\/etc\/letsencrypt\/live\/mail.domaine1.fr-0001\/fullchain.pem\nssl_key = &lt;\/etc\/letsencrypt\/live\/mail.domaine1.fr-0001\/privkey.pem<\/code><\/pre>\n<h4>Modification de DKIM<\/h4>\n<p>Pour fonctionner, les informations de cl&eacute; DKIM doivent &ecirc;tre fournies pour le nouveau domaine. Vous n'avez pas besoin d'en reg&eacute;n&eacute;rer une, juste de dire que vous voulez utiliser la m&ecirc;me cl&eacute; DKIM que pour domaine1.fr.<\/p>\n<p>Une analyse de \/etc\/opendkim.conf nous montre que les informations de tables...<\/p>","date_modified":"2023-12-16T11:59:58+01:00","tags":["linux","postfix","dovecot","certbot","opendkim","mail"]},{"title":"Cr\u00e9er des hashtables case sensitive sur Powershell","date_published":"2023-08-07T10:52:00+02:00","id":"https:\/\/nicolaslang.fr\/articles\/creer-des-hashtables-case-sensitive-sur-powershell","url":"https:\/\/nicolaslang.fr\/articles\/creer-des-hashtables-case-sensitive-sur-powershell","content_html":"<p>Petit memo et info puisque j'ai \u00e9t\u00e9 confront\u00e9 \u00e0 la situation :\nJ'avais besoin de cr\u00e9er une table contenant l'ensemble des caract\u00e8res accentu\u00e9s avec leur \u00e9quivalent ASCII pour pouvoir r\u00e9 encoder des fichiers provenant d'un site ne g\u00e9rant pas l'UTF8.<\/p>\n<p>Et c'est l\u00e0 que les soucis ont commenc\u00e9, puisque visiblement les hashtables sont insensibles \u00e0 la casse et ne peuvent avoir que des cl\u00e9s uniques. Ainsi, ceci ne marche pas : <\/p>\n<pre><code>&gt; $characterchange = @{\n\"\u00e2\"='\u00c3\u00a2'\n\"\u00c2\"='\u00c3\u0082'\n}\nParserError: \nLine |\n   3 |  \"\u00c2\"='\u00c3'\n     |  ~~~\n'\\x0a} Duplicate keys '\u00c2' are not allowed in hash literals.\n<\/code><\/pre>\n<p>En effet, il ne prend pas le \u00e2 et le \u00c2 comme deux caract\u00e8res diff\u00e9rents !<\/p>\n<p>Apr\u00e8s quelques recherches, il s'av\u00e8re qu'il faut utiliser l'objet Hashtable en lieu et place du @{} usuel.<\/p>\n<pre><code>&gt;$characterchange = New-Object hashtable\n&gt;$characterchange.Add(\"\u00e2\",'\u00c3\u00a2')\n&gt;$characterchange.Add(\"\u00c2\",'\u00c3\u0082')\n&gt;$characterchange\n\nName                           Value\n----                           -----\n\u00e2                              \u00c3\u00a2\n\u00c2                              \u00c3\n<\/code><\/pre>","date_modified":"2023-12-13T16:48:55+01:00","tags":["powershell","hashtable"]},{"title":"Ma d\u00e9couverte de Proxmox (ou les joies de donner une seconde vie au mat\u00e9riel)","date_published":"2023-07-11T13:47:00+02:00","id":"https:\/\/nicolaslang.fr\/articles\/ma-decouverte-de-proxmox","url":"https:\/\/nicolaslang.fr\/articles\/ma-decouverte-de-proxmox","content_html":"<h2>Meurt un autre jour<\/h2>\n<p>Dans le cadre du remplacement d'un serveur chez un client, j'ai r&eacute;cup&eacute;r&eacute; un vieux serveur, un honorable ProLiant ML310e Gen8 de pas loin de 8 ans d'&acirc;ge afin de le d&eacute;barasser.\nUn serveur modeste, avec le contr&ocirc;leur raid int&eacute;gr&eacute; qui rend l'&acirc;me et un processeur un peu fam&eacute;lique pour du Windows.<\/p>\n<p>L'id&eacute;e de le mettre &agrave; la benne m'apparaissait comme une h&eacute;r&eacute;sie, son processeur &eacute;tait tout de m&ecirc;me encore potable pour un grand pan d'utilisations diverses et vari&eacute;es, 20 Go de RAM &eacute;taient suffisants pour pas mal de choses et je n'aime pas jeter ce qui marche encore.\nLe contenu du serveur initial ayant &eacute;t&eacute; transform&eacute; en machine virtuelle, j'avais tout &agrave; loisir d'en faire quelque chose &agrave; ma guise, juste en faisant attention &agrave; ne pas trop me reposer sur le contr&ocirc;leur raid int&eacute;gr&eacute;. En effet, tout ce qui sortait du connecteur principal pour la grappe de disque me renvoyait des erreurs al&eacute;atoires, mais par contre, aucun probl&egrave;me avec le contr&ocirc;leur SATA pr&eacute;sent sur la carte m&egrave;re !<\/p>\n<p>Alors un SSD de branch&eacute; plus tard, j'avais de nouveau un serveur avec un stockage modeste mais des performances pas trop sales pour une petite infra maison.\nJ'avais envie d'un syst&egrave;me de virtualisation, mais les version d'ESX possibles sur ce serveur n'allaient pas tr&egrave;s haut, et j'ai du donc chercher une alternative &agrave; ce syst&egrave;me de virtualisation (non pas Hyper-V), une alternative gratuite.\nEt quelques recherches plus tard, le nom de <strong>Proxmox VE<\/strong> m'apparaissait (VE pour Virtual Environment).<\/p>\n<h2>Les probl&egrave;mes commencent d&egrave;s l'installation mais ne durent pas.<\/h2>\n<p>Proxmox fournit un ISO d'installation permettant de pr&eacute;-configurer l'environnement sur lequel il tournera. C'est une image d'install comme vous installeriez une distribution Linux. Vous gravez un DVD ou cr&eacute;&eacute;z une cl&eacute; bootable (via un outil comme Rufus ou la commande dd), vous branchez, d&eacute;marrez votre machine, s&eacute;lectionnez le p&eacute;riph&eacute;rique de d&eacute;marrage et renseignez les informations demand&eacute;es.<\/p>\n<p>Tout est ok, on red&eacute;marre pour finaliser l'installation, et ... rien.\nEnfin si, un kernel panic, rien qui ne d&eacute;marre correctement.  Pendant un moment, je pensais que le port SATA avait aussi un probl&egrave;me, mais non. Quelques recherches sur les Internets et nous voil&agrave; plut&ocirc;t &agrave; installer une d&eacute;bian 11 sur le serveur.\nPourquoi une debian ? Et bien parce que Proxmox fournit tout le n&eacute;cessaire sur leur site pour transformer sa debian en un serveur Proxmox flambant neuf comme s'il sortait d'une install via leur ISO. <\/p>\n<p>Effectivement, &agrave; mon plus grand plaisir, le setup pour arriver &agrave; ce r&eacute;sultat est plut&ocirc;t simple :<\/p>\n<ol>\n<li>On ajoute le repository de Proxmox VE dans les sources d'APT<\/li>\n<li>On ajoute les cl&eacute;s de s&eacute;curit&eacute; du repository<\/li>\n<li>On installe le kernel de Proxmox<\/li>\n<li>On reboot<\/li>\n<li>On install les packages de Proxmox VE<\/li>\n<li>On retire les Kernel initiaux de Debian<\/li>\n<li>Reboot<\/li>\n<li>???<\/li>\n<li>Profit<\/li>\n<\/ol>\n<h2>A l'attaque !<\/h2>\n<p>Une fois le serveur red&eacute;marr&eacute;, on peut se connecter via son navigateur web favori (c'est &agrave; dire rien qui ne se base sur Chromium) en pointant vers l'ip de notre serveur en utilisant...<\/p>","date_modified":"2023-12-13T16:48:27+01:00","tags":["virtualisation","linux","proxmox","conteneur"],"image":"\/user\/pages\/03.articles\/ma-decouverte-de-proxmox\/Capture d\u2019\u00e9cran du 2022-12-17 14-44-26.jpg"},{"title":"subsystem request failed on channel 0 lors d&#039;un transfert via SCP","date_published":"2023-04-20T12:00:00+02:00","id":"https:\/\/nicolaslang.fr\/articles\/subsystem-request-failed-on-channel-0-lors-dun-transfert-scp","url":"https:\/\/nicolaslang.fr\/articles\/subsystem-request-failed-on-channel-0-lors-dun-transfert-scp","content_html":"<p>J'ai r\u00e9cup\u00e9r\u00e9 un boitier de s\u00e9curit\u00e9 Stormshield dans ma soci\u00e9t\u00e9, histoire de m'amuser un peu avec et d\u00e9couvrir plus en d\u00e9tail ce que je pouvais en tirer.<\/p>\n<p>Apr\u00e8s un reset d'usine, je tombe sur un message d'erreur de licence inexistante lors de la connexion sur l'interface wou\u00e9b.<\/p>\n<p>Apr\u00e8s r\u00e9cup\u00e9ration du fichier de licence du produit, je vais donc activer le SSH depuis le mode console pour pouvoir faire le transfert. Je me connecte correctement en ssh, mais lors d'un scp, juste apr\u00e8s le password, PAF : <\/p>\n<p><code> subsystem request failed on channel 0 scp: Connection closed <\/code> <\/p>\n<p>Visiblement, certains \u00e9quipements demandent un mode \"legacy\" pour pouvoir faire des transferts de fichiers. Et comment faire, alors? et bien c'est simple, on passe de :<\/p>\n<p><code> scp \/home\/moi\/LICENCE.licence admin@10.0.0.254:\/data\/Licence\/ <\/code> <\/p>\n<p>\u00c0 ceci :<\/p>\n<p><code> scp -O \/home\/moi\/LICENCE.licence admin@10.0.0.254:\/data\/Licence\/ <\/code> <\/p>\n<p>Le man de la commande scp nous indique \u00e0 quoi \u00e7a correspond : <\/p>\n<p>`\n-O        Use the original SCP protocol for file transfers instead of the\nSFTP protocol.  Forcing the use of the SCP protocol may be neces\u2010\nsary for servers that do not implement SFTP, for backwards-com\u2010\npatibility for particular filename wildcard patterns and for ex\u2010\npanding paths with a \u2018~\u2019 prefix for older SFTP servers.<\/p>\n<p>` <\/p>\n<p>Et de l\u00e0, la licence se transfere sans probl\u00e8me!<\/p>\n<p>Voil\u00e0 :)<\/p>","date_modified":"2023-12-16T12:01:03+01:00","tags":["ssh","scp","stormshield"]}]}
