CérénIT

Automatisation / DevOps

  • L’inversion du modèle de connexion d’Ansible avec Ansible-pull : killer feature ? - l’article revient sur une fonctionnalité méconnue d’Ansible de pouvoir fonctionner en mode pull (la machine cible récupère le playbook à exécuter) plutôt qu’en mode push (la machine sur laquelle est installée Ansible se connecte à la machine cible pour exécuter le contenu du playbook). Au-delà des limitations, cela peut avoir son intérêt dans quelques cas précis, mais pas la peine d’envisager de basculer complètement en mode pull. Si c’est ce que vous recherchez, alors changez d’outil.
  • ARA Project : Il s’agit d’une surcouche à Ansible qui permet de stocker dans une base le résultat de l’exécution des playbooks et avoir ainsi une visualisation plus agréable et aussi disposer d’un historique d’exécution. A tester… Ne prenez pas peur si vous voyez que le projet est dans l’organisation Gtihub d’Openstack, il n’y a aucune dépendance à Openstack.

Container

  • Introducing Docker Engine 18.09 : Docker 18.09 est (enfin) sorti. Pour rappel, le rythme des releases est maintenant de 2 versions / an en Mars et Septembre (au lieu de 4 / an). Les améliorations semblent surtout être sous le capot avec la poursuite des intégrations de containerd et surtout buildkit. Il faudra aller du coté des release notes pour avoir plus de détail. Si vous vous connectez à distance à votre démon docker, vous pouvez maintenant le faire au travers d’une connexion ssh.
  • dive : c’est un outil qui permet d’explorer les images docker, les layers dans le but de découvrir des moyens d’optimiser la taille de ses images. Un score d’efficacité est d’ailleurs indiqué.

Cloud

  • HDFS vs. Cloud Storage: Pros, cons and migration tips : un article assez équilibré par les équipes de GCP (Cloud Google) sur les cas d’usages ou il vaut mieux utiliser un stockage cloud ou HDFS (la solution de stockage d’un cluster Hadoop).
  • Mark Shuttleworth reveals Ubuntu 18.04 will get a 10-year support lifespan : à l’occasion de l’Openstack Summit, Mark Shuttleworth (le CEO de Canoncial) a annoncé que la version LTS Ubuntu 18.04 serait supportée pendant 10 ans (au lieu de 5 ans) pour tenir compte des besoins de ses clients cloud et IoT. Il viste aussi clairement les clients de Red Hat, habitués à ce cycle de support.
  • Traefik — Spoiler Season — Episode 1 : Traefik avait annoncé une phase de refonte de son code suite à la sortie de la version 1.7. Le billet présente les changements à venir avec une réorganisation des composants internes et de leur ordre d’exécution.
  • nginxconfig.io : un petit générateur de configuration pour nginx. Il est basique mais il fait le job.

Dataviz

  • Grafana v5.3 Stable released! : Support de la datasource Google Stackdriver, Mode TV amélioré, des rappels sur les alertes (si une alerte est levée, une notification de rappel toutes les X minutes), un éditeur de requêtes pour Postgres, et plein d’autres améliorations.

Langages

  • Java.Next : un billet de synthèse sur les évolutins du langage Java en terme de versionning, d’apports de ces différentes versions et de la nouvelle politique de support d’Oracle (et les alternatives qui vont bien)
  • Python in RHEL 8 : Python3 par défaut dans RHEL8 - Intéressant, ils font l’impasse sur la PEP 394 qui dit que python == python2 pour le motif de ne pas se tirer une balle dans le pied et qu’il y a alternatives --set python /usr/bin/python3 pour ça.

NoSQL

  • Elastic Stack 6.5.0 Released : la version 6.5 de la stack Elastic vient de sortir - des points intéressants : le module APM gère maintenanat les applications Java & Go, Elasticsearch supporte (en alpha) les drivers ODBC permettant ainsi de requêter ES depuis Excel (!!), Kibana se dote d’une notion d’Espaces (Spaces) pour segmenter les usages et les dashboard avec une notion de permissions, Logstash a un runner (experimental) en java plutôt qu’en ruby, Beats se dote de capacités autour du serverless et de l’auto-enregistrement auprès d’ES/Kibana.

Sécurité

  • Une faille 0day dans VirtualBox : Comment vous protéger ? : une faille au niveau de la pile réseau permet de remonter à la machine hôte via la VM. Pas besoin de désinstaller VirtualBox dans l’heure si vous faites des choses normales avec vos VMs. Si vous êtes chercheur en sécurité, là par contre, vaut mieux prendre des précautions supplémentaires pour que votre malware reste dans la VM (si infectée).
  • URLs are hard, let’s kill them : réflexion autour des urls et de leur disparition partielle dans les navigateurs mobiles notamment et de ce que cela peut avoir comme implications.
  • A new security header: Feature Policy : à l’image des Content Security Policy (CSP), la directive Feature-Policy indique au navigateur les fonctionnalités nécessaires pour le bon fonctionnement du site et désactiver les autres.
  • RFC 8484: DNS Queries over HTTPS (DoH) : cette RFC décrit comment requêter des DNS via le protocole HTTPS plutôt qu’en UDP ou TCP simple sur le port 53. DNS Over HTTPS (DoH) un objectif de lutter contre la censure, au filtrage DNS mais aussi de permettre aux applications web en javascript et tournant dans le navigateur, et ce en respectant CORS. Attention toutefois en utilisant DoH, dans la mesure où c’est sur HTTP(s), il y a quand même plus d’informations qui circulent (user agent, etc) - il faut donc bien choisir son client.

Time series databases

  • TimescaleDB 1.0 is Production Ready : la version 1.0 de TimescaleDB est sortie avec notamment une intégration de Grafana et de Prometheus et pas mal d’amélioration de la base de code.

Web

  • HTTP/3 : HTTP/3 est la prochaine version de HTTP qui utilise le protocole QUIC pour le transport. Quic a pour objectif de remplacer TCP sur de l’UDP. Commitstrip a publié un billet à ce sujet.
  • Some notes about HTTP/3 : ce billet permet d’approfondir HTTP/3, QUIC et la couche de transport sous-jacente, les limites actuelles et les réponses que QUIC apporte.

Container et Orchrestration

  • Au revoir : Solomon Hykes, un des fondateurs de Docker tire sa révérance dans une note qui se veut positive. Un autre article nuance un peu cette réalité. Crise de croissance ? Rachat en perspective ? Let’s see…
  • Releasing HypriotOS 1.8.0: Raspberry Pi 3 B+, Stretch and more : l’équipe Hypriot a mis à jour sa distribution Hypriot OS en version 1.8. Elle est basée sur Raspbian Stretch (et non plus Jessie), supporte le dernier modèle de Raspberry Pi et fourni les dernières versions de docker, docker-compose et docker-machine. Une version 1.8.1 est déjà en cours de préparation, suivez de près la page de release du projet
  • Docker Registry API to be standardized in OCI : après la standardisation des images et du runtime des conteneurs, c’est au tour de la distribution de faire son effort de standardisation. La registry docker, standard de fait, devrait donc devenir une norme.
  • A House of Cards: An Exploration of Security When Building Docker Containers : une revue des éventuelles failles de sécurité qui pourraient être exploitées lors de la construction d’un conteneur. Mais bon, vous relisez vos Dockerfile bien sûr !

NoSQL

  • Cockroach 2.0 (What’s New in v2.0.0 - CockroachDB 2.0 Has Arrived!) : la base de données Cockroach, implémentation open source de la base de données Spanner de Google, passe (déjà) en version 2.0. Au programme des améliorations mises en avant : support du format JSON (reprise du format de Postgres), amélioration des débits et de la scalabilité, amélioration de l’outillage pour la gestion d’un cluster géo-distribué.

De retour du Breizh Camp

Quelques liens récupérés des différentes conférences auxquelles j’ai pu assister.

  • Gazr : Outil créé par Dailymotion, cela leur permet d’uniformiser les tâches quelque soit la technologie sous-jacente (ou l’environnement d’exécution)
  • Nom de Zeus, j’ai typé mon code vanillia js : TS-check, disponible depuis TypeSCcipt 2.3, permet de commencer à typer (progressivement) du js vanilla même si on n’est pas encore prêt à passer à TypeScript ou autre) ; démo.
  • JVM & Orchestration Docker (slides - démo) : Java, dans un container, ne voit les ressources qui lui sont allouées via cgroups et s’appuie sur les ressources disponibles au niveau de la machine hôte. Java 8 Update 131+ et Java 9 ont des flags expérimentaux et Java 10 devient un bon citoyen de l’écosystème Docker. Lire aussi sur le sujet : Java inside docker: What you must know to not FAIL.
  • Tests d’intégration avec Docker et Elasticsearch : D. Pilato montre ainsi qu’il est possible de lancer des tests d’intégration d’Elasticsearch depuis Maven ou via JUnit et qu’en fonction, cela peut lancer un container docker, s’appuyer sur une instance elasticsearch local ou distante. Pour cela, il s’appuie sur les outils de Fabric8 et/ou l’initiative testcontainers. Tout est documenté dans le dépot et il faut suivre les branches pour les différentes itérations.

Et pour finir, mes propres slides sur la plateforme TICK & Grafana pour collecter et exploiter vos données temporelles. J’ai également eu l’opportunité de refaire cette conférence chez Les Furets (où je suis en mission actuellement). Je vais aussi la faire le 3 Mai prochain au NantesJUG.

Bonus : la vidéo est disponible

Astuce(s) du mois

Docker, lorsqu’il exécute un container, injecte normalement les serveurs DNS de la machine hôte. Sauf que quand il voit que c’est une IP locale (127.0.0.*), alors il met les DNS de Google (8.8.8.8 et 8.8.4.4) comme DNS. Typiqyement, Ubuntu utilise un résolveur DNS local via systemd-resolved pour la résolution DNS. Du coup, la configuration de /etc/resolv.conf pointe sur 127.0.0.*. Or sur un réseau local, les accès à un DNS public peuvent être filtrés. Dès lors, votre conteneur est incapable de faire une quelconque résolution DNS (interne ou externe à votre réseau).

La solution consiste à mettre en place un “drop-in” systemd

Source :

Nous voulons surcharger le fichier de type unit docker.service et surcharger plus précisément la valeur de ExectStart.

Etape 1 : Créer un répertoire /etc/systemd/system/docker.service.d

sudo mkdir -p /etc/systemd/system/docker.service.d

Etape 2 : Créer un fichier de configuration contenant la surcharge :

sudo $EDITOR /etc/systemd/system/docker.service.d/10-dns.conf

Contenu du fichier :

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --dns 192.168.2.1 --dns 192.168.2.2

Le “doublon” sur ExecStart est normal, cela permet de réinitialiser la commande pour en définir un autre ensuite.

Il ne reste plus qu’à rechercher la configuration de systemd et relancer le service docker :

sudo systemctl daemon-reload
sudo systemctl restart docker

Docker utilisera donc ces DNS lors du lancement d’un conteneur et cela évitera qu’il fasse un fallback sur les DNS de Google quand il voit un resolver local…

Par contre, si vous utilisez docker dans un autre contexte que celui du réseau de votre entreprise, cela peut ne plus fonctionner (ou alors il faut enrichir la configuration DNS pour rajouter d’autres DNS)

Une autre solution peut être de renseigner les DNS dans /etc/docker/daemon.json (documentation) avec les mêmes inconvénients.

Au-delà de cet exemple appliqué à Docker, l’utilisation des “drop-ins” systemd est une solution intéressante pour surcharger une configuration sans impacter les fichiers sources et évite tout conflit lors d’une mise à jour du fichier.

Automatisation

  • Ansible 2.5: Traveling space and time : au programme de cette nouvelle version : des namespaces pour les “facts”, la capacité d’interdire des modules, des nouvelles “variables magiques” (les magic vars sont des variables spécifiques à Ansible et l’exécution des playbooks). On notera aussi des améliorations sur le support Windows, des nouveaux modules cloud (AWS, GCP, Azure, VMWare) et des nouveaux plugins.

Container et Orchrestration

Dataviz

Java

  • No Free Java LTS Version? : Oracle change ses pratiques de distribution du JDK Oracle (Une version majeure tous les 6 mois, moins de report de patches, etc).

Let’s encrypt

  • ACME v2 and Wildcard Certificate Support is Live : Let’s Encrypt va donc fournir des certificats wildcard (*.domaine.fr). Si je m’étais réjoui de l’idée au début, je ne vois finalement pas ou peu l’intérêt du fait de la méthode de validation (enregistrement DNS avec le temps de propagation associé). En dehors du cas où l’on dépassait les limites d’enregistrement de Let’s Encrypt en terme de nombre de certificats, la génération dynmique et unitaire via une méthode HTTP me semble plus simple. Surtout quand on utilise Traefik ;-)

Postgres

Python

TICK

Astuce(s) du mois

J’utilise Ansible dans une logique d’IAC et pour automatiser un maximum des actions pour la gestion de l’infrastructure et des applications de mes clients. Toutefois, chaque client avait son arborescence et la réutilisation d’un composant d’un client à l’autre était fastidieuse (copier/coller).

Un premier travail a consisté à extraire les rôles commun dans un dépôt git tiers et faire des liens symboliques mais cela n’était pas très pratique. Suite à un travail chez un autre client, j’ai revu mon approche et je pars pour le moment sur la solution suivante :

  • Un dépôt “global”, contenant la configuration ansible, les plugins, les playbooks, les variables d’hotes ou de groupes, l’inventaire et les rôles.
  • Pour chaque rôle, je repars sur le principe d’extensibilité du code avec un rôle générique et des extensions par clients. Il y aura donc un répertoire du nom du composant et un répertoire <composant>.<client> ou <client>.<composant> (le choix n’est pas encore arrêté). Le second répertoire contenant les éléments spécifiques au client.

Exemple avec un rôle MariaDB :

mariadb/
├── README.md
├── defaults
│   └── main.yml
├── files
├── handlers
│   └── main.yml
├── meta
├── tasks
│   └── main.yml
├── templates
│   └── my.cnf.j2
└── vars
    └── main.yml
co.mariadb/
├── README.md
├── handlers
│   └── main.yml
├── tasks
│   └── main.yml
├── templates
│   ├── my-primary.cnf.j2
│   └── my-replica.cnf.j2

Ainsi, la partie générique et la partie spécifique à mon client sont isolées. Il faut juste envisager le séquencement entre les deux rôles pour que cela se passe bien. Pour le moment, le seul code dupliqué se retrouve au niveau des handlers.

Si je devais donner accès à mes clients à leurs playbooks respectifs, il faudrait que je revois l’organisation pour ne leur donner accès qu’à leurs données. Il faudrait alors recréeer n dépots mais avec cette méthode, il est aussi facile de reconstruire a posteriori des dépots par clients depuis un dépot global. L’intérêt étant pour moi de conserver ma flexibilité et d’améliorer la réutilisabilité de mes composants.

Le Blog

Nous partageons ici notre veille et nos réflexions

Nuage de tags

docker kubernetes elasticsearch kafka postgres ansible grafana mysql tick influxdb sécurité python aws chronograf redis swarm cassandra cloud microservice spark terraform traefik angularjs confluent container graphql hashicorp javascript rancher serverless stream test api architecture arm csp devops docker-compose documentation elastic hpkp java kapacitor kibana lambda lean log microsoft npm orientdb rest rethinkdb reverse-proxy service-mesh sql ssh windows agile azure bash big-data certificat cli cluster cncf cookie dns fluxlang gcp gdpr git grav hsts https hypriot iac istio json ksql lets-encrypt licence linux mobile monitoring nginx opensource php prometheus redhat replication rsyslog scale solr systemd telegraf timescaledb vue.js wagtail yarn accessibilité akka alerte amazon-emr anonymisation apm ara automatisation bastion beam beat bilan bounded-context branche brigade browser buildkit cdc certificats checklist cloud-init cloud-storage cockroachdb code codeurs-en-seine consul containerd continous-delivery coreos cors cqrs crash cron crontab csrf css curl cérénit d3.js dashboard data-pipelining dataviz date ddd debezium debian desktop devoxx distributed-systems dive docker-app dokcer draft drop-in ebs ec2 elassandra electron elk engineering event-sourcing facebook falcor feature-policy feed filebeat firebase firefox fish flash flask fleet fluentd flux foundation framework frontend fullstack github glacier google grid géospatial hacker hadoop hdfs header helm html html5 http http/3 hue ia iaac ibm immutable incident index infrastructure-as-code ingénierie inspec jq jquery jwt k8s kubeadm laravel liste-de-diffusion logstatsh loi machine-learning mailing-list management mariadb message micro-service molecule mot-de-passe multi-cloud médecine newsletter nomad nosql null openmetrics openshit openweb over-engineering packaging password performance perspective pip portainer publicité push queue quic raml react reaper reindex reinvent responsive revocation revue-de-code rkt rolespec root rpi rpo rto rwd s3 scaleway search select serverless-architecture service-worker sha1 shell shipyard société spinnaker sre sri ssl statistique superset sympa syslog-ng test-unitaire tiers timer timezone tls training travail ubuntu unikernel unit ux vault vie-privée virtualbox virtualenv vm vnc voxxeddays vpc

Syndication

Atom