17 févr. 2016

[JSON] Comment parser du JSON via Linux (EN)

How to parse JSON string via command line on Linux

If you often deal with JSON-formatted texts from the command line or in shell scripts, you may wonder if there is any command-line utility which can parse JSON string. A command-line JSON parser can be handy when you test or debug JSON web services. You can feed JSON-formatted responses from web services into the command-line JSON parser, thereby easily inspecting otherwise hard-to-read JSON responses or extracting individual objects from them.

In this tutorial, I will describe how to parse JSON string from the command line.

On Linux, there is a command-line JSON processor called jq which does exactly that. Using jq, you can parse, filter, map, and transform JSON-structured data effortlessly.

To install jq on Linux, simply download its binary (available for 32-bit and 64-bit system separately) as follows.
$ wget http://stedolan.github.io/jq/download/linux32/jq (32-bit system)
$ wget http://stedolan.github.io/jq/download/linux64/jq (64-bit system)
$ chmod +x ./jq
$ sudo cp jq /usr/bin
The jq binary is also available for Windows and OS X platforms, and its full source code is released under the MIT license.

The following examples illustrate how to parse JSON-structured data with jq.

An example JSON Schema:
$ cat json.txt

{
        "name": "Google",
        "location":
                {
                        "street": "1600 Amphitheatre Parkway",
                        "city": "Mountain View",
                        "state": "California",
                        "country": "US"
                },
        "employees":
                [
                        {
                                "name": "Michael",
                                "division": "Engineering"
                        },
                        {
                                "name": "Laura",
                                "division": "HR"
                        },
                        {
                                "name": "Elise",
                                "division": "Marketing"
                        }
                ]
}
To parse a JSON object:
$ cat json.txt | jq '.name'

"Google"
To parse a nested JSON object:
$ cat json.txt | jq '.location.city'

"Mountain View"
To parse a JSON array:
$ cat json.txt | jq '.employees[0].name'

"Michael"
To extract specific fields from a JSON object:
$ cat json.txt | jq '.location | {street, city}'

{
  "city": "Mountain View",
  "street": "1600 Amphitheatre Parkway"
}


10 févr. 2016

[LINUX] Substitution avec sed

Article intéressant sur la substitution avec sed, c'est assez puissant si on veut apporter des
modifications sur un fichier très volumineux.
On peut remplacer une ligne par une autre, un mot par un autre, des minuscules par des majuscules et vis versa.

Substitution basique

Simple

- 1ère occurrence (de chaque ligne) rencontrée uniquement
sed 's/la/LA/' fichier.txt

Globale

- Toutes les occurrences (de chaque ligne) rencontrées
sed 's/la/LA/g' fichier.txt

Ciblée

- Seulement la 2ème occurrence (de chaque ligne) rencontrée
sed 's/la/LA/2' fichier.txt

Substitution conditionnée

Simple

/Motif/ - Uniquement si la ligne contient "motif"
sed '/awk/ s/sed/SED/' fichier.txt
Numéro de ligne - Uniquement la ligne n° "N"
sed '18 s/sed/SED/' fichier.txt
/Regex/ - Uniquement s'il y a correspondance avec l'expression régulière
sed '/^[ ][Ss]ed/ s/ed/ED/g' fichier.txt

Avancée

0,/regex/ - Uniquement la 1ère occurrence rencontrée
sed '0,/sed/ s//SED/' fichier.txt

Bloc

/motif1/,/motif2/ - Uniquement dans l'intervalle "motif1 - motif2"
sed '/Début/,/Fin/ s/ed/ED/' fichier.txt # 1ère occurrence uniquement
sed '/Début/,/Fin/ s/ed/ED/g' fichier.txt # toutes les occurrences
8,13 - Uniquement dans l'intervalle des lignes 8 à 13
sed '8,13 s/ed/ED/g' fichier.txt
On peut aussi combiner motif et ligne
sed '8,/Fin/ s/ed/ED/g' fichier.txt
sed '/Début/,13 s/ed/ED/g' fichier.txt
Ou encore avec des "regex"
sed '/Début/,$ s/ed/ED/g' fichier.txt # jusqu'à la fin ($)
sed '/^[ ][Ss]ed/,13 s/ed/ED/' fichier.txt

Avancée

Substituer tout un texte entre 2 motifs en excluant les motifs
sed  '/Début/,/Fin/{ /Début/b;/Fin/b; s/.*/SED - The Stream ÉDitor/; }' fichier.txt

5 févr. 2016

[DOCKER] trouver et utiliser whalesay (ETAPE 3)

Traduction depuis le site https://docs.docker.com/linux/step_three/
 
Des gens tout autour du monde créés des images Docker. Vous pouvez trouver ces images en parcourant le site internet "Docker Hub". Dans cette section, c'est exactement ce que vous allez faire, c'est-à-dire, trouver l'image et l'utiliser.

Etape 1: Localiser l'image nommée "whalesay"
 

1 - Ouvrir votre navigateur et aller sur le site Docker Hub


Le site Docker Hub contient des images dont l'origine provient d'individus comme vous et moi et d'organisation telles que RedHat, IBM, Google, etc.

2 - Rechercher le mot clé "whalesay" dans le moteur de recherche


3 - Cliquer sur "docker/whalesay" dans les résultats de recherche, cela va afficher le repository pour whalesay

Chaque repository d'image contient des informations la concernant telle que le type de logiciel que contient cette image et comment l'utiliser.
Vous pouvez notez que l'image whalesay est basée sur la distribution Linux UBUNTU. La prochaine étape consiste à lancer whalesay depuis votre machine de test.

Étape 2: Lancer whalesay

1 - Retourner sur votre shell
Taper:
$ docker run docker/whalesay cowsay boo
Unable to find image 'docker/whalesay:latest' locally
latest: Pulling from docker/whalesay
2880a3395ede: Pull complete
515565c29c94: Pull complete
98b15185dba7: Pull complete
2ce633e3e9c9: Pull complete
35217eff2e30: Pull complete
326bddfde6c0: Pull complete
3a2e7fe79da7: Pull complete
517de05c9075: Verifying Checksum
8f17e9411cf6: Download complete
ded5e192a685: Download complete
Pulling repository docker.io/docker/whalesay
fb434121fc77: Download complete
e9e06b06e14c: Download complete
a82efea989f9: Download complete
37bea4ee0c81: Download complete
07f8e8c5e660: Download complete
676c4a1897e6: Download complete
5b74edbcaa5b: Download complete
1722f41ddcb5: Download complete
99da72cfe067: Download complete
5d5bd9951e26: Download complete
Status: Downloaded newer image for docker/whalesay:latest
docker.io/docker/whalesay: this image was pulled from a legacy registry.  Important: This registry version will not be supported in future versions of docker.
 _____
< boo >
 -----
    \
     \
      \
                    ##        .
              ## ## ##       ==
           ## ## ## ##      ===
       /""""""""""""""""___/ ===
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
       \______ o          __/
        \    \        __/
          \____\______/

La première fois que vous lancer une image, la commande docker devrait ressembler à ça. Si l'image n'est pas présente, docker s'occupera de la télécharger depuis Docker Hub.

2 - La commande suivante permet de lister les images sur votre système en local. vous devrez voir docker/whalesay dans la liste
Entrer
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
hello-world         latest              0a6ba66e537a        3 months ago        960 B
docker/whalesay     latest              fb434121fc77        8 months ago        247 MB
                            3a2e7fe79da7        8 months ago        247 MB
Quand vous lancer une image dans un container, Docker télécharge l'image sur votre ordinateur. Cette copie en locale vous fait gagner du temps. Docker re-télécharge seulement l'image seulement si la source a changé sur Docker Hub. Vous pouvez bien évidement supprimer l'image par vous-même. Vous l'apprendrez plus tard, pour le moment nous pouvons laisser l'image sur la machine car nous aurons à l'utiliser plus tard.

3 - Prenons un moment pour s'amuser avec le container whalesay.

Essayez de lancer whalesay encore en remplaçant "boo" par autre chose:
Entrer:
$ docker run docker/whalesay cowsay Salut-on-s-amuse-bien-avec-Docker!
 ____________________________________
< Salut-on-s-amuse-bien-avec-Docker! >
 ------------------------------------
    \
     \
      \
                    ##        .
              ## ## ##       ==
           ## ## ## ##      ===
       /""""""""""""""""___/ ===
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
       \______ o          __/
        \    \        __/
          \____\______/

[DOCKER] Images et Containers ? (ETAPE 2)

Cet article concerne la partie 2 du tutoriel Docker pour Linux: https://docs.docker.com/linux/step_two/


En apprendre plus sur Images et Containers

Le moteur Docker (Docker Engine) fourni la technologie core Docker qui permet d'activer les images et containers.
Lors de la première partie de l'installation, la commande hello-world (docker run hello-world) a utiliser une tâche "core" via le moteur Docker.
Cette commande comporte 3 parties

  • docker: commande docker installée sur votre système d'exploitation (ici GNU/Linux)
  • run: option de la commande docker qui permet de créer et lancer un container
  • hello-world: indique à docker quelle image doit être chargée dans le container
Qu'est-ce qu'un Container ?

Un container est une version minimal de Linux.

Qu'est-ce qu'une Image ?

Une image est un logiciel que l'on charge dans le container.

Quand on lance la commande docker, le moteur logiciel (Engine software):
  • Vérifier si l'image hello-world est présente
  • Télécharge l'image depuis Docker Hub (plus à ce sujet dans le chaptire suivant)
  • Charge l'image dans le container et la lance
Dépendant du comment elle est construite, une image pourrait lancer une simple et unique commande et ensuite se finir. C'est ce que "Hello-world" fait.

Une image Docker, est néanmoins capable de beaucoup plus que ça. Une image peut démarrer un programme aussi complexe qu'une base de donnée, attendre que vous (ou un tier) ajoute des donnée, stoque les données pour les utiliser plus tard et attendre un autre utilisateur.

Qui a créer l'image "hello-world" ?

Ici, c'est Docker qui l'a développé, mais tout un chacun peut créer des images. Le moteur Docker (Docker Engine) laisse les personnes ou les entreprises créer et partager des logiciels à travers les images Docker. Concernant l'utilisation du moteur, vous n'avez pas à vous soucier à propos des capacités de votre ordinateur à lancer les images - un container peut toujours le faire.

4 févr. 2016

[DOCKER] Commencer avec Docker sous Linux (ETAPE 1)

J'ai testé le tutoriel "Get Started with Docker for Linux" (source : https://docs.docker.com/linux/)

Ce tuto est destiné à toute personne intéressée pour en apprendre plus de Docker (ce qui est mon cas!)
Il sera a moitié en Anglais et mes commentaires en Français "rouge italique citation"

Commençons ...

This getting started is for non-technical users who are interested in learning about Docker. By following this getting started, you’ll learn fundamental Docker features by performing some simple tasks. 

  You’ll learn how to:
  • install Docker
  • run a software image in a container
  • browse for an image on Docker Hub
  • create your own image and run it in a container
  • create a Docker Hub account and an image repository
  • create an image of your own
  • push your image to Docker Hub for others to use
The getting started was user tested to reduce the chance of users having problems. For the best chance of success, follow the steps as written the first time before exploring on your own. It takes approximately 45 minutes to complete.
Make sure you understand…

This getting started uses Docker commands with a terminal window. You don’t need to be experienced using a command line, but you should be familiar with how to open one and type commands.
Il faut suivre scrupuleusement les étapes pour espérer que ça fonctionne, cela devrait durer 45 minutes. Pas besoin d'être un pro de la ligne de commande mais ça peut servir...
Installer Docker
Dans mon cas, je dispose d'une machine virtuelle 1Go de RAM, le système d'exploitation est Ubuntu 14.04.3 LTS
This installation procedure is written for users who are unfamiliar with package managers. If you are comfortable with package managers, prefer not to use wget, or have problems installing and want to troubleshoot, please use our apt and yum repositories instead for your installation.

1 - Log into your Ubuntu installation as a user with sudo privileges.
2 - Verify that you have wget installed.

Taper:
root@docker:~# which wget
/usr/bin/wget
If wget isn’t installed, install it after updating your manager:
Taper:
$ sudo apt-get update
$ sudo apt-get install wget
3 - Get the latest Docker package.
Taper:
$ wget -qO- https://get.docker.com/ | sh
The system prompts you for your sudo password. Then, it downloads and installs Docker and its dependencies.

Note: If your company is behind a filtering proxy, you may find that the apt-key command fails for the Docker repo during installation. To work around this, add the key directly using the following:


Penser à faire un export https_proxy="http://proxy:8080/" si vous êtes derrière un proxy ...
$ wget -qO- https://get.docker.com/gpg | sudo apt-key add -
4 - Verify docker is installed correctly.
Taper:
$ sudo docker run hello-world
sudo: unable to resolve host docker
Unable to find image 'hello-world:latest' locally
Pulling repository docker.io/library/hello-world
Error while pulling image: Get https://index.docker.io/v1/repositories/library/hello-
world/images: dial tcp: lookup index.docker.io: no such host
Dans mon cas ça ne s'est pas passer comme prévu car j'utilise un Proxy, pour résoudre ce problème. Suivre les instructions suivantes:
Editer /etc/default/docker
Taper:
$ sudo vim /etc/default/docker
ajouter les lignes suivantes:
export http_proxy="http://10.250.0.5:8080/"
export https_proxy="http://10.250.0.5:8080/"
export HTTP_PROXY="http://10.250.0.5:8080/"
export HTTPS_PROXY="http://10.250.0.5:8080/"

(10.250.0.5 à remplacer par votre proxy...)
Redémarrer le service docker
# service docker restart
docker stop/waiting
docker start/running, process 5072
Relancer la commande docker

root@docker:~# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b901d36b6f2f: Pull complete
0a6ba66e537a: Pull complete
Digest: sha256:8be990ef2aeb16dbcb9271ddfe2610fa6658d13f6dfb8bc72074cc1ca36966a7
Status: Downloaded newer image for hello-world:latest

Hello from Docker.
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:
 https://hub.docker.com

For more examples and ideas, visit:
 https://docs.docker.com/userguide/

SOURCE: https://docs.docker.com/linux/step_one/




2 févr. 2016

[DOCKER] C’est quoi et à quoi ça sert ?

Présentation de Docker

Docker a révolutionné le monde du logiciel open-source et du cloud. Inventé par Solomon Hykes et Sébastien Barbier, cet outil innovant permet de pallier à tous les problèmes actuels du cloud computing tels que le déploiement d’applications et le packaging. Quelques points bons à savoir sur l’utilité et les avantages de ce logiciel open-source.

Docker : à quoi ça sert ?

Docker permet d’automatiser le déploiement d’applications dans des conteneurs logiciels grâce à une API simple. Avec cet outil, il sera possible d’ajouter plusieurs applications ainsi que ses dépendances dans un container virtuel qui pourra par la suite être lancé sur tous types de serveurs comme Linux. Son principal objectif est de rendre faciles la gestion des conteneurs et les déploiements des applications. Grâce à un hub collaboratif, Docker offre à tout le monde l’opportunité de mettre rapidement en place un système de conteneur et de faire un partage d’images. Ces dernières pourront après être servies pour réaliser la base de construction des conteneurs. À signaler qu’il sera possible de basculer une application entre les clouds de Google, de Microsoft et d’Amazon en utilisant Docker.

Docker : en quoi est-ce avantageux ?

Praticité, portabilité, facilité des déploiements et de gestion, nombreuses sont les raisons d’opter pour cet outil disponible en juin 2014. Contrairement à la virtualisation, Docker est beaucoup plus léger parce qu’elle ne nécessite pas l’utilisation d’un OS supplémentaire grâce au container. En plus, l’exécution des applications se fait automatiquement, sans avoir besoin de passer par la lourde procédure d’installation. D’où la rapidité du lancement qui facilitera les tâches des développeurs et des testeurs. La ligne de commande est capable en elle-même de charger le container et de l’exécuter. Ce n’est pas tout, c’est facile de lancer et d’arrêter les containers en fonction des besoins.

1 févr. 2016

[ANSIBLE] lineinfile: n'ajouter une ligne qu'une seule fois

Dernièrement, il m'est arrivé lors de l’exécution d'un playbook une seconde fois d'incrémenter une seconde fois avec les mêmes valeurs le fichier /etc/hosts ...

Dans ma vision de Ansible, on devrait pouvoir executer plusieurs fois un playbook sans avoir de parasites, doublons etc.

J'ai trouver une solution en passant par "register" pour éviter ce genre de problème.

  • Je vérifie si il y a la chaine de caractère en amont, avec shell j'utilise la command linux "grep" pour voir si la chaine de caractère est présente
  • Ensuite j'utilise register pour stocker le resultat tout en ignorant les erreurs avec ignore_errors: true (sans ça le script ansible s'arrête à cause d'une erreur fatale)
  • Puis je modifie /etc/hosts en utilisant lineinfile avec when qui permet de vérifier si le résultat stocké précédement dans register est vide ou non (fait un failed ou non).
  • Si le register hosts_grep est vide; la commande lineinfile s'execute.
  • j'espère être clair ! ;-)
Ci après un example :
roles/config/tasks/main.yml

# Vérification de /etc/hosts
- name: Test for line
  shell: grep openldap /etc/hosts
  ignore_errors: true
  register: hosts_grep
# Modification de /etc/hosts
- name: Modification /etc/hosts
  sudo: true
  lineinfile:
    dest=/etc/hosts
    regexp=''
    insertafter=EOF
    line="10.250.0.108 openldap01\n10.250.0.109 openldap02"
    state=present
  when: hosts_grep|failed
Bien faire attention à l'indentation !

Différences majeures entre Red Hat 6, 7, 8 et 9

Quelles sont les différences majeures entre RHEL 6, 7, 8 et 9 ? Système de fichiers RHEL 6: Par défaut : ext4. Autres : ext2, ext3 supportés...