CDuv Blog

Le blog sans prétentions de Claude DUVERGIER

Pattern de tâches *Ansible* pour vérifier la version d'une application à installer

Lorsqu’on développe des rôles Ansible on peut être amené à installer un logiciel sans gestionnaire de packages (PKG, APT, YUM) mais en récupérant directement l’application (ou sa source) auprès de l’éditeur.

L’idempotence de nos rôles Ansible impose de ne pas re-récupérer (inutilement) un logiciel déjà installé : il va donc falloir préalablement tester si le logiciel est installé, si oui, dans quelle version et ensuite comparer à la version demandée par le rôle.

Je vous partage un petit modèle de tâches qui permet ceci.

Tester que toutes les tâches Ansible shell sont bien en "failed == false"

Il arrive que l’on veuille exécuter des commandes shell via Ansible (ou d’autres tâches), poursuivre temporairement l’exécution malgré les éventuelles erreurs /échecs mais, à la fin détecter/informer de toute erreur survenue.

Le paramètre ignore_errors permet de définir le comportement en cas d’erreur et un petit assert sur le résultat de la tâche permet de contrôler le tout.

Sauvegarder votre serveur OVH avec Borgmatic

Dans le précédent article de la série, j’explique comment utiliser borgmatic pour faire ses sauvegardes. Dans cet article je vais expliquer comment faire les sauvegardes de son serveur dédié OVH en utilisant l’espace de sauvegarde (Backup Storage) de celui-ci. Cet espace est un espace disque (généralement 500Go) qu’OVH mets à disposition de ses clients pour qu’ils puissent y faire leur sauvegardes. Nous allons dire à borgmatic d’y mettre les archives Borg.

Utiliser Borg avec Borgmatic pour faire ses sauvegardes facilement

borgmatic est un script de sauvegarde qui “pilote” le logiciel de sauvegarde Borg/BorgBackup. Il rends facile la mise en place d’une sauvegarde fonctionnelle via BorgBackup car ce script s configure tout simplement via un unique fichier YAML. Borg / BorgBackupBorgBackup est un logiciel de sauvegarde de fichier qui permet (entre autre) : La déduplication des fichiers : un même fichier présent plusieurs fois dans vos données ne sera copié qu’une fois (il ne prendra pas x fois sa taille dans votre archive) Compression des archives : les données dans l’archive finale sont compressées pour économiser encore plus de place Chiffrement des archives : Evite qu’un tiers (hébergeur, pirate, état) ne lise vos données.

Astuces sur l'écriture de commandes shell dans les RUN de Dockerfile

Les fichiers Dockerfile de Docker permettent la création d’images Docker, qui deviendront par la suite des conteneurs.

Dans ces fichiers il est possible d’indiquer des commandes CLI à exécuter lors de la phase de construction (build) de l’image via l’instruction RUN.

Je vais partager quelques petites astuces concernant l’écriture de commandes pour RUN.

Cela ne les rendra pas plus performantes, mais plus lisibles, y compris dans les historiques git.

Consul du pauvre via /etc/hosts pour infrastructure multi-machines sous Terraform

Si vous montez une infrastructure de plusieurs machines communiquant en réseau (micro-services, cluster de base de données, frontend et backend, etc.) il faut que chacune connaisse l’adresse IP de ses “collègues”.

Globalement, dans la vie de tous les jours, l’adresse IP a été “remplacée” par des FQDN (noms de domaine). Et même dans une infrastructure non publique et entièrement sous contrôle, l’adresse IP devient rapidement problématique pour différentes raisons :

  • Elle n’est pas toujours parlante : On peut faire une erreur à la saisie et ne pas le remarquer (“server-sql.myapp.net” est mieux que 10.3.45.9… Oups, c’était 10.3.85.9 en réalité)
  • Elle est relativement figée : Si une nouvelle machine vient à remplacer une précédente (ou si un composant change de machine), généralement la nouvelle ne peut pas récupérer l’adresse IP de l’ancienne et donc les composants de l’infrastructure qui utilisant l’ancienne adresse doivent être modifiés pour leur donner la nouvelle adresse IP.

A mon avis, toute infrastructure de plus de 3 composants devrait dépendre de FQDN.

Une solution simple est le fichier texte /etc/hosts (C:\Windows\System32\drivers\etc\hosts sous Windows) qui permet d’associer une adresse IP à un FQDN.

L’autre solution est d’utiliser un serveur DNS, qu’il soit public (celui de votre registraire/registrar ) ou interne (BIND, Dnsmasq, …) que les composants requêterons. Il existe des logiciels de Service Discovery tel que Apache ZooKeeper, Consul et etcd qui font exactement ça (mais en plus pratique).

Quand on débute un petit projet, on a pas forcément envie de faire appel à ce genre d’outil aussi pertinents soient-ils (pour des raisons de temps, de coût, de simplicité, etc.).

Si vous utilisez Terraform pour monter cette infrastructure, je vais vous montrer une petite astuce pour remplir le fichier /etc/hosts de tout vos composants de manière automatique.

Enlever les annotations SVN "@version $Id$" de son code source

Avant vous utilisiez SVN et marquiez chaque version de vos fichiers d’un pratique @version $Id$ ? Mais voilà, ça fait un moment que vous avez délaissé SVN pour mieux autre chose (par exemple Git sur GitLab) et ces annotations n’ont plus lieu d’être ? Vous les apercevez du coin de l’œil mais n’y faites plus trop attention parce que elles font partie du paysage mais surtout parce que ça vous prendrait trop de temps de toutes les retirer.

Blend Web Mix 2015 à Lyon : Demandez^W Téléchargez le programme (ICS) !

Le Blend Web Mix 2015 c’est bientôt : les mercredi et jeudi 28 et 29 octobre 2015 et le programme des conférences a enfin été dévoilé au complet.

Mais si je vous en parle ça n’est pas pour souligner cette nouvelle édition de ce salon du web (lyonnais) mais plutôt pour parler technique. En fait, autant la page du programme est lisible et permet de filtrer par catégorie de sujet, de niveaux autant la fonction d’export ICS est pauvre (même si elle a le mérite d’exister) :

  • Elle n’exporte qu’une seule conférence, il faut donc exporter chaque conférence individuellement
  • L’(unique) événement du fichier ICS ne donne ni le lieu ni le détails de la conférence

Cela souffre, par exemple, de la comparaison avec l’outil de planification du PHP Tour de l’AFUP qui permet de faire son propre planning (en choisissant les conférences qui nous intéresse) et de l’imprimer.

Bref, je voulais avoir un fichier ICS complet pour pouvoir consulter de manière simple le planning, et aussi l’avoir sur mon smartphone : j’ai donc créer un script pour ça…

Shellshock : Faille de sécurité CVE-2014-6271 dans Bash

Ces derniers jours une faille de sécurité a été découverte dans l’interpréteur de commande shell Bash. Identifiée CVE-2014-6271 et surnommée Shellshock.

Assez grave, et même considérée plus importante que Heartbleed (datant de début 2014) par certains, ce bug peut déjà être exploité pour accéder à un shell sur vos serveurs à distance (en passant par votre serveur Web par exemple).

Créer ses propres images de base pour Docker

Si vous utilisez Docker, il y a de fortes de chances que les images de bases présentes sur le Hub Docker vous convienne (debian, ubuntu, centos, etc.). Mais il se peut également que vous ne trouviez pas l’image avec l’OS dont vous avez besoin (Mandrake, . Ou alors que les normes de sécurité de votre activité vous impose de construire vous même vos images afin d’être sûr du contenu.

Je vais vous montrer comment créer sa propre image Docker à partir de rien (sans FROM)

Notification par SMS chez Free Mobile via API avec un client Shell

Hier, l’opérateur Free Mobile a annoncé un nouveau service gratuit pour ses abonnés : le service d’envoi de SMS via une API.

Pratique et réclamé depuis un moment (même payant) ce service permet d’envoyer des SMS à son propre numéro d’abonné Free Mobile (et uniquement à celui-ci) depuis des appareils connectés tels que les lapin Karotz, un NAS, un serveur (de domotique par exemple).

Lightning 2.6 sur SeaMonkey 2.21 : erreur d'accès aux calendriers CalDAV

Suite à la récente mise à jour de SeaMonkey en version 2.21, mon gestionnaire de calendrier (l’extensions Lightning) s’est également mise à jour en version 2.6. Sauf que depuis cet instant mes calendriers CalDAV ne sont plus accessibles car j’obtiens l’erreur suivante dès le lancement de SeaMonkey Mail :

(NS_ERROR_XPC_CI_RETURNED_FAILURE) [nsIJSCID.createInstance]" nsresult: “0x80570015 (NS_ERROR_XPC_CI_RETURNED_FAILURE)” location: “JS frame :: resource://calendar/modules/calUtils.jsm -> file:///…./SeaMonkey/extensions/%7Be2fda1a4-762b-4020-b5ad-a41df1933103%7D/calendar-js/calCalendarManager.js :: cmgr_createCalendar :: line 474” data: no]

logrotate : Erreur "gzip: stdin: file size changed while zipping"

Après avoir installé et configuré logrotate sur son serveur il peut arriver de recevoir des courriels de cron contenant le message (visiblement d’erreur) suivant :

/etc/cron.daily/logrotate: gzip: stdin: file size changed while zipping N’arrivant pas à chaque fois et sans vraiment plus d’informations que ça : on recevra ce message encore quelques fois avant de se décider à faire quelque chose…

Plusieurs serveurs virtuels Apache par nom (host-based) en SSL

Les serveurs virtuels Apache permettent d’héberger, sur une même machine (et sur une même installation d’Apache) plusieurs sites Internet différents (ayant chacun leur propre FQDN). Il existe deux variantes de ce système bien pratique pour économiser sur les serveurs web :

  • Par IP (IP-based) : Apache recherche le <VirtualHost> ayant le couple adresse IP et port (généralement 80) du client (le navigateur)
  • Par nom (host-based, name-based) : Le serveur regarde l’entête Host (eg. Host: domaine.tld) reçue du client et recherche le <VirtualHost> où figure ce FQDN (soit dans ServerName, soit dans ServerAlias). Cette technique peut être combiné avec un choix par IP, mais généralement on utilise le wildcard * (eg. <VirtualHost *:80>) pour fonctionner avec n’importe quelle adresse IP)

Voir la documentation Apache pour plus d’informations ce sujet, notamment la manière dont Apache décide quel serveur virtuel va traiter la demande. C’est souvent la variante par nom qui est utilisée car plus simple (pas besoin d’ajouter des interfaces réseau au serveur pour avoir de nouvelles adresses IP : l’aiguillage se passe au niveau DNS), plus souple (il est assez facile de configurer/modifier une zone DNS) et moins onéreux (l’achat d’adresses IP est plus cher qu’un nom de domaine -qu’on devra de toutes façon acquérir-, d’autant plus si c’est des IPv4).

En revanche, le host-based pose problème lors de l’hébergement de sites en https:// car l’entête Host n’est pas envoyé au serveur avant d’avoir établi une connexion sécurisée, or la négociation SSL préalable à cette connexion requiert un certificat, un certificat qui dépend du FQDN du site (il faut qu’il corresponde au CN du certificat) : c’est un peu l’histoire de la poule et de l’œuf où l’on a besoin de l’un pour avoir et l’autre de l’autre pour avoir l’un…

Je vais vous montrer comment faire, sous Apache 2.2.12 et avec OpenSSL 0.9.8f (minimums requis pour gérer le Server Name Indication (SNI) qui pallie l’absence d’entête Host) pour avoir plusieurs VHost par nom (name-based) en HTTPS, sur une seule adresse IP et sans avoir l’avertissement “_default_ VirtualHost overlap on port 443, the first has precedence