public enum { java, logiciels libres,…}

public enum { java, logiciels libres,…}

Ansible pour les provisionner tous ! — 25 juin 2019

Ansible pour les provisionner tous !

Si vous provisionnez vos VM VirtualBox avec Vagrant, vous avez sans doute eu l’idée d’automatiser le provisionning des machines virtuelles. Dans mon cas une VM GNU/Linux basée sur Debian 9.

Pour cela, soit vous faite tout manuellement et après les mises à jour deviennent fastidieuses, soit vous appliquez un script shell au démarrage de vagrant, soit vous utilisez Ansible.

Ansible est un outil opensource permettant d’automatiser le provisionning et la mise à jour des environnements à distance (via SSH). L’avantage par rapport à des outils tels que Puppet, est qu’il ne nécessite pas l’installation d’agent.

Je vais essayer de vous montrer comment mettre en place le provisionning via Ansible pour VirtualBox.

Configuration de Vagrant

Dans le fichier Vagrantfile, on active le provisionning via Ansible:

config.vm.provision "ansible_local" do |ansible|
ansible.playbook = "site.yml"
ansible.install_mode = "pip"
ansible.version = "2.7.10"
end

Cette configuration fait référence à un fichier « playbook » site.yml. C’est la configuration qui sera appliqué lors du provisionning . Que ça soit à la création ou pour les mises à jour.

Voici un exemple de contenu:

- name: VirtualBox
hosts: all
become: yes
become_user: "root"
become_method: "sudo"
roles:
- common
vars_files:
- vars/environment.yml

Ce fichier est la racine de notre configuration Ansible. On y référence les rôles appliqués et les fichiers d’ environnement. Voici un exemple de rôle:

- name: "Remove useless packages from the cache"
apt:
autoclean: yes
force_apt_get: yes

- name: "Remove dependencies that are no longer required"
apt:
autoremove: yes
force_apt_get: yes

- name: "Update and upgrade apt packages (may take a while)"
become: true
apt:
upgrade: dist
update_cache: yes
force_apt_get: yes

- name: "Install useful packages"
become: true
apt:
name:
- gcc
- g++
...
- zsh
- firewalld
state: present
update_cache: no

- name: ansible create directory example
file:
path: "{{ home }}/.m2"
state: directory
owner: "{{ username }}"
group: "{{ username }}"

- name: Install Maven settings.xml
copy:
src: settings.xml
dest: "{{ home }}/.m2/settings.xml"
owner: "{{ username }}"
group: "{{ username }}"

- name: "Install Maven"
raw: "curl -sL \"http://mirror.ibcp.fr/pub/apache/maven/maven-3/{{ maven_version }}/binaries/apache-maven-{{ maven_version }}-bin.tar.gz\" -o /opt/apache-maven.tar.gz && tar -zxf /opt/apache-maven.tar.gz -C /opt"
become: true
become_user: root
become_method: sudo

- name: "Change Maven Rights"
file:
path: /opt/*
state: touch
modification_time: "preserve"
access_time: "preserve"
owner: "{{ username }}"
group: "{{ username }}"

Les variables d’environnement permettent de variabiliser certains champs de vos rôles. On peut trouver par exemple les versions de certains outils déployés

maven_version: 3.5.4
username: vagrant
home: /home/vagrant
docker_compose_version: 1.22.0

Il y a une quantité impressionnante de modules Ansible que l’on peut utiliser. Que ça soit pour lancer des commandes shell ou lancer des services. Contrairement à la création d’un script shell qui pourrait faire les mêmes actions à la création, on peut facilement gérer la mise à jour de la VM car Ansible détecte les modifications lors de son exécution.

Configuration spécifique pour VirtualBox

Pour VirtualBox, j’ai ajouté deux fichiers de configuration supplémentaires à la racine:

ansible.cfg
[defaults]
hostfile = hosts
hosts
[local]
localhost ansible_connection=local

Provisionning

A la création

le provisionning peut se faire au lancement de vagrant via la commande:

vagrant up

Pour faire une mise à jour

Directement dans la box, vous pouvez lancer les commandes suivantes :

sudo mount -t vboxsf vagrant /vagrant

Puis, vous pouvez lancer les commandes suivantes dans la box:

su -
cd /vagrant
export ANSIBLE_CONFIG=/vagrant
ansible-playbook site.yml

 

Au secours! Spotify Connect ne fonctionne plus sur MoodeAudio — 15 mars 2019

Au secours! Spotify Connect ne fonctionne plus sur MoodeAudio

Après avoir mis à jour mon mot de passe Spotify ( oui, il faut modifier régulièrement ses mots de passe ) , j’ai eu un petit soucis sur MoodeAudio ( version 4.4) et notamment sur la connexion avec Spotify.

Après quelques recherches sur le forum de moodeaudio, j’ai trouvé la correction qui allait bien.

Voici comment faire :

D’abord on se connecte via SSH sur le raspberry pi

$ ssh pi@192.168.0.xx

Puis on lance la commande:

$ sudo mv /var/local/www/spotify_cache/credentials.json /home/pi/
$ sudo reboot

Normalement, Spotify Connect devrait fonctionner après le redémarrage 🙂

Une radio connectée DIY — 7 mars 2019

Une radio connectée DIY

Dans la série j’équipe ma maison en Raspberry PI, j’ai décidé de me doter d’une station radio connectée qui me permettrait de « moderniser » un peu ma chaîne HI-FI.

Mes besoins sont:

  • Connexion en analogique à une chaîne HI-FI
  • Jouer des MP3/FLAC stockés dans un NAS
  • Jouer des web radios (ex. FIP, TSF JAZZ)
  • Connexion SPOTIFY
  • Une interface web sympa

Après quelques recherches, j’ai donc opté pour une solution basée sur un DAC JustBoom, un Raspberry PI et la distribution MoodeAudio.

Voici le DAC que l’on branche directement sur le port GPIO du Raspberry PI:

 

L’installation et la configuration du DAC se sont très bien passées. L’installation se fait comme avec des LEGOs.

Que la lumière soit

 

Pour la configuration, j’ai testé dans un premier temps Volumio puis MoodeAudio. Pour  l’instant, je reste sur cette dernière. Toutes les fonctionnalités que je souhaite sont en standard. Pas besoin de plugins tiers.

Toutes les étapes d’ installation et de configuration pour que le DAC soit reconnu sont décrites ici. Les gens de chez JustBoom ont bien documenté la configuration pour les principales distributions.

Le seul reproche que je trouve à MoodeAudio est l’ergonomie. Sur un téléphone, ce n’est pas top. Surtout sur l’accès aux menus d’administration. J’ai du également ajouter des radios manuellement alors que dans Volumio, avec le plugin TuneIn, ça pouvait se faire automatiquement. Je me suis basé sur les informations fournies par ce site.

Quoi qu’il en soit, tout ce que je souhaitais fonctionne super bien! Spotify Connect, l’écoute de TSF JAZZ, la lecture des morceaux de ma bibliothèque fonctionnent nickel !

 


Deuxième crossover : Opensource business models — 23 janvier 2019
Tracer (facilement) les entrées sorties d’une API REST — 1 décembre 2018

Tracer (facilement) les entrées sorties d’une API REST

Il y a quelques jours, je cherchais comment tracer rapidement et simplement les entrées sorties d’une API REST en appliquant quelques formatages, des filtres, et des insertions en base si besoin.

Travaillant sur une stack SpringBoot, vous allez me dire : oui tu peux faire des filtres. Pour être franc, j’ai essayé d’ appliquer des interceptor et filtres mais dans mon contexte, ça ne collait pas.

Me voilà donc à la recherche d’une solution faisant le taff et qui soit peu intrusive dans mon contexte.

J’ai trouvé par hasard au fil de mes lectures sur Stackoverflow le framework logbook réalisé par … Zalando ( et oui, ils ne font pas que des chaussures) en licence MIT. 
Ce composant ne fait qu’une seule chose, mais il le fait bien !

Il permet entre autres de s’intégrer dans une stack JAVA ( JAX-RS ou SpringMVC), de filtrer, récupérer les différentes informations des requêtes et réponses et enfin de formatter selon l’envie (ex. JSON).

Voici un exemple de mise en œuvre dans un projet SpringBoot:

Dans le  fichier pom.xml, ajouter cette dépendance:

<dependency>
<groupId>org.zalando</groupId>
<artifactId>logbook-spring-boot-starter</artifactId>
<version>1.11.2</version>
</dependency>

Dans une de vos classes Configuration, définir la factory de Logbook

@Bean
public Logbook createLogBook() {
// too easy : return Logbook.create();
return Logbook.builder()
.condition(Conditions.requestTo("/helloworld"))
.formatter(new JsonHttpLogFormatter())
.build();
}

Dans mon cas j’ai fait un filtre en n’incluant que l’ API /helloworld et j’ai formatté en JSON.
On peut également modifier le processus d’écriture pour ne pas écrire dans un fichier mais en base par ex.

Ensuite, j’ai ajouté la configuration du logger dans le fichier application.properties

logging.level.org.zalando.logbook:TRACE

Et voila !

Dans la console, lors d’un appel ou d’une réponse à mon API, j’ai le message suivant :

018-12-01 15:14:18.373 TRACE 3605 --- [nio-8080-exec-1] org.zalando.logbook.Logbook              : {"origin":"remote","type":"request","correlation":"c6b345013835273f","protocol":"HTTP/1.1","remote":"127.0.0.1","method":"GET","uri":"http://127.0.0.1:8080/helloworld","headers":{"accept":["/"],"host":["127.0.0.1:8080"],"user-agent":["curl/7.52.1"]}}
2018-12-01 15:14:18.418 TRACE 3605 --- [nio-8080-exec-1] org.zalando.logbook.Logbook : {"origin":"local","type":"response","correlation":"c6b345013835273f","duration":48,"protocol":"HTTP/1.1","status":200,"headers":{"Content-Length":["11"],"Content-Type":["text/plain;charset=UTF-8"],"Date":["Sat, 01 Dec 2018 14:14:18 GMT"]},"body":"Hello world"}

Vous remarquerez que les requêtes / réponses peuvent désormais être associés grâce à un identifiant de corrélation. On peut facilement déterminer le temps de traitement d’une requête ou encore faciliter les recherches.

Vous trouverez tout le code dans ce repo github.




Gérer plusieurs clés et plusieurs repo GIT — 16 novembre 2018

Gérer plusieurs clés et plusieurs repo GIT

En attendant d’avoir plus d’imagination, voici un rapide tuto pour gérer plusieurs référentiels GIT avec des clés SSH différentes.

Imaginons que vous deviez vous connecter sur différents serveurs GIT (ex. github et gitlab) avec des emails différents et donc des clés RSA différentes ( oui je sais ce cas n’arrive pas souvent ). Le tout sous Windows et GNU/LINUX. Sous GNU/LINUX ont peut le gérer différemment via la commande ssh-add.

Pour pouvoir gérer ceci de manière simple, j’ai fait la manipulation suivante :

Dans le répertoire ~/.ssh. J’ai crée les différentes clés avec la doc fournie par GITHUB. Puis, j’ai crée le fichier ~/.ssh/config avec le contenu suivant:

 

Host monhost1.fr
HostName monhost1.fr
User git
IdentityFile ~/.ssh/id_rsa

Host monhost2.fr
HostName monhost2.fr
User git
IdentityFile ~/.ssh/nouvellecle_rsa

 

Et voila !

Après avoir fait les différentes configurations coté serveur ( c.-a-d. ajout des clés publiques ), je peux interagir avec les différents serveurs ( pull, push ).

En espérant que ça puisse servir à d’autres

 

Premier cross over … — 29 octobre 2018
Installer docker ce sur Debian 9 — 26 septembre 2018

Installer docker ce sur Debian 9

Bon, ça fait quelques temps que je n’ai rien posté…
Voici un rapide tuto pour installer docker-ce sur une debian9. Oui, je sais, docker est déjà présent sur les dépôts, mais si vous souhaitez avoir une version un peu plus récente, vous pouvez passer par l’installation de la version ce fournie par docker.

Pré-requis

Supprimer les éventuelles installations de docker et docker-compose


#apt-get remove docker docker-compose

Installation

Lancer les commandes suivantes:

# apt-get install apt-transport-https ca-certificates
# curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
# add-apt-repository \ 
"deb [arch=amd64] https://download.docker.com/linux/debian \ 
$(lsb_release -cs) \ stable"

Puis lancer


# apt update

# apt install docker-ce

Installation de docker-compose

Lancer les commandes suivantes:


# curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# chmod a+x /usr/local/bin/docker-compose

Configuration des droits

Pour lancer docker depuis un utiliser non root, il faut lancer les commandes suivantes:


# groupadd docker

# adduser monutilisateur docker

# usermod -aG docker monutilisateur

Après ceci, vaut mieux redémarrer le pc …

Configuration du démon

Voici quelques config à appliquer pour que le démon soit accessible par des outils tels que le plugin maven ou encore configurer l’accès à un proxy

Configuration du port

Exécuter la commande:


# systemctl edit docker.service

Entrer le code suivant:


[Service]

ExecStart=

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

Et l’enregistrer sous /etc/systemd/system/docker.service.d/docker.conf

Configuration du proxy

Avec la même commande


# systemctl edit docker.service

Entrer la configuration suivante:


[Service]

Environment="HTTP_PROXY=http://mon_proxy:mon_port/"

Environment="NO_PROXY=127.0.0.1"

Activation des configurations

Lancer les commandes suivantes:


# systemctl daemon-reload # systemctl restart docker

Validation

Maintenant, vous pouvez valider votre configuration avec la commande:


$ docker run hello-world

Devoxx 2018 — 20 avril 2018

Devoxx 2018

L’édition 2018 de DEVOXX touche bientôt à sa fin. Pour ceux qui ne connaissent pas cette conférence, c’est LA conférence sur le développement en France. A titre personnel, je peux plus apprendre en trois jours à cette conférence qu’en formation.

img_20180419_155256624099247.jpg

Tout d’abord un grand merci aux organisateurs. Ils assurent réellement. Bon, pour l’année prochaine, n’hésitez à retenir ma conférence 😉

Si vous n’avez pas eu la chance d’assister aux trois jours, il faut savoir que vous pourrez voir les rediff sur la chaine youtube.

Les tendances

Voici les tendances que  j’ai retenu :

  • Spring, spring et encore spring
  • Du réactif en veux tu en voila
  • Du DDD sinon rien
  • Du devops

et le plus impressionnant pour moi était la conférence de JOSHUA BLOCH(!!!) sur Effective Java. Pas tant dans le contenu, car il reprenait peu ou prou celui du livre, mais de voir une personne de ce calibre (dans le monde JAVA, c’est une rock star) en France, c’est assez impressionnant.

Les keynotes ( dont celle sur le smart building) étaient dans l’ensemble très intéressantes. Les conférences étaient également d’un très bon niveau. J’ai pu découvrir par exemple l’avance que peut avoir l’Estonie sur l’IT ( voir le projet x-road )  par rapport à la France qui lance le projet french road.

Voici quelques conférences qui m’ont plu et interpelé :

Je ne vais pas trop les décrire ( voire pas du tout ), elles seront disponibles prochainement sur la chaine youtube .

Intégration et médiation avec Apache Camel — 10 avril 2018

Intégration et médiation avec Apache Camel

Depuis quelques jours, je teste Apache Camel pour la mise en œuvre  de médiations.

Apache-camel-logo

Apache Camel est un framework assez ancien. Il est similaire à Spring Intégration et permet l’ implémentation de patterns d’intégration.

Les patterns d’intégration

Qu’est-ce qu’un pattern d’intégration allez-vous me dire ? C’est une solution d’architecture ou plus simplement une recette de cuisine permettant d’avoir une solution toute prête à une problématique d’intégration donnée. L’ensemble de ces patterns est décrit sur ce site ( ne vous attardez pas sur le look des années 90 … ).

Exemple :

PublishSubscribeSolution

 

Camel permet simplement de gérer l’intégration via un DSL.

Choix d’implémentations

On peut faire pas mal de choses avec ce FRAMEWORK et de plusieurs manières. J’ai fait les choix d’implémentation suivants :

  • Tout se fera avec SPRING … et pas en XML 🙂
  • Il faut que toutes les médiations soient testables
  • J’exécute le code dans un FATJAR ( pourquoi avec springboot )

Configuration de la route

Apache Camel définit les médiations dans des routes. Elles se définissent assez rapidement .

Les routes commencent par une instruction from et se terminent par une ou plusieurs instructions to.

Pour mon exemple, j’extrais les données d’une table et les stocke dans un fichier.

Tout se configure par des URLs. La première permet d’extraire les données via JPA/HIBERNATE. Une entité Address permet le requêtage. La seconde permet le stockage dans un fichier texte JSON.

Elles sont externalisées dans des fichiers de configuration pour faciliter les tests et accessibles via SPRING.

Lancement de la route

Le lancement de la route se fait dans une méthode main() :

Tests

Camel fournit une API de test assez bien fournie. Elle permet notamment de mocker des endpoints existants (ex. : le fichier de sortie de mon cas de test).

Dans mon cas, j’ai décidé de remplacer la base de données que j’interroge en input par une base HSQLDB chargée en mémoire. Le fichier de sortie est, lui, remplacé dynamiquement par un mock. Pour ce faire, j’ai utilisé les « adviceWith »

Pour aller plus loin

Il y a pas mal d’exemples sur le GITHUB de CAMEL. Vous pouvez également acheter le livre « Camel In Action ». Ca ne vaut pas Effective Java 🙂 , mais vu qu’il est écrit par le principal développeur, c’est une très bonne référence.