Ansible : Présentation et utilisation

Ansible pour automatiser vos traitements sur un parc de machines

Qu’est-ce qu’Ansible ? Comment s’en servir ? Quels concurrents ? Petit tour pour cibler un nouveau produit qui fait une forte impression depuis quelques temps.

Ansible est apparu en 2012. En octobre 2015, Red Hat annonce le rachat d’Ansible qui devient alors un produit phare de sa stack. Celui-ci s’intègre parfaitement dans les solutions de Red Hat et vient renforcer les arguments concernant la facilité de gestion d’un parc de serveurs.

Ansible est une solution permettant de réaliser des déploiements, l’exécution de tâches et la gestion de configuration sur plusieurs machines en même temps. Il est agent-less et utilise SSH pour mettre en place les actions à réaliser, elles-mêmes écrites en YAML.

Dans Ansible, il existe de nombreux produits qui peuvent perturber lorsqu’on commence. Vous entendrez peut-être parler de Ansible Playbook, Ansible Vault et Ansible Galaxy.

Ansible et les modules

Deux choses à savoir :

  • Quand vous utilisez Ansible, vous utilisez des modules. Il existe une liste de modules déjà écrite, mais vous pouvez également écrire les vôtres. Vous devrez l’écrire en Python.
  • Vous devez donner une ou un groupe de domaine/IP où l’action doit être utilisée.

Exemple :

On va vérifier que notre machine est bien up avec le module ping.

1
2
3
4
5
$ ansible localhost -m ping
localhost | SUCCESS => {
"changed": false,
"ping": "pong"
}

Pour utiliser autre chose que localhost, comme par exemple un ensemble de domaines, vous devez compléter le fichier /etc/ansible/hosts.

1
2
3
[baptiste-donaux.fr]
www.baptiste-donaux.fr
me.baptiste-donaux.fr
1
2
3
4
5
6
7
8
9
10
$ ansible -m ping baptiste-donaux.fr
me.baptiste-donaux.fr | success >> {
"changed": false,
"ping": "pong"
}
www.baptiste-donaux.fr | success >> {
"changed": false,
"ping": "pong"
}

Et voilà comment on vérifie qu’un pool de serveurs en bien up . Voici la liste des modules présents de base.

Une fois qu’on a compris comment fonctionne un module on peut utiliser tous les autres modules de la même manière. Lorsqu’on utilise un module, on peut donner des arguments (argument -a).

Par exemple, comment exécuter une commande sur plusieurs.

1
2
3
4
5
6
$ ansible -m shell -a "docker --version" baptiste-donaux.fr
me.baptiste-donaux.fr | success | rc=0 >>
Docker version 1.12.1, build 23cf638
www.baptiste-donaux.fr | success | rc=0 >>
Docker version 1.12.1, build 23cf638

Mais également s’assurer qu’un paquet est bien installé.

1
2
3
4
$ ansible -m apt -a "name=vim state=present" www.baptiste-donaux.fr
www.baptiste-donaux.fr | success >> {
"changed": false
}

Ou tout simplement mettre à jour un ou des serveurs.

1
2
3
4
5
6
7
8
9
10
11
12
$ ansible -m apt -a "update_cache=yes" www.baptiste-donaux.fr
www.baptiste-donaux.fr | success >> {
"changed": false
}
$ ansible -m apt -a "upgrade=dist" www.baptiste-donaux.fr
www.baptiste-donaux.fr | success >> {
"changed": false,
"msg": "Reading package lists...\nBuilding dependency tree...\nReading state information...\n0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.\n",
"stderr": "",
"stdout": "Reading package lists...\nBuilding dependency tree...\nReading state information...\n0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.\n"
}

Ansible et les Playbooks (welcome in the true world)

Gérer un parc de machines avec les commandes c’est déjà bien, et c’est surtout la base d’Ansible. Malgré ça, on imagine mal jouer un scénario en exécutant des commandes les unes à la suite des autres. Heureusement pour nous, ansible-playbook est là pour ça !

Playbook pour facilement gérer des tâches

Les scénarios s’écrivent en YAML. En voici un petit exemple.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
- hosts: baptiste-donaux.fr
tasks:
- name: Add APT key for Docker repository
apt_key:
keyserver: "hkp://p80.pool.sks-keyservers.net:80"
id: 58118E89F3A912897C070ADBF76221572C52609D
- name: Add APT Docker repository
apt_repository: repo='deb https://apt.dockerproject.org/repo debian-jessie main' state=present
- name: Update APT cache with new repository
apt: update_cache=yes
- name: Install docker-engine package if it doesn't exist
apt: name=docker-engine state=present
- name: Enable and start Docker service
systemd: enabled=yes state=started name=docker
- name: Install Python
apt: name=python state=present
- name: Install PIP
apt: name=python-pip state=present
- name: docker-py dependency
pip: name=docker-py
- name: Pull Nginx image
docker_image: name=nginx pull=yes
- name: Create a Nginx container
docker_container:
name: proxy
image: nginx
published_ports:
- "80:80"
state: present
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
$ ansible my_playbook.yml
PLAY [baptiste-donaux.fr] ******************************************************
TASK [setup] *******************************************************************
ok: [baptiste-donaux.fr]
TASK [Add APT key for Docker repository] ***************************************
ok: [baptiste-donaux.fr]
TASK [Add APT Docker repository] ***********************************************
ok: [baptiste-donaux.fr]
TASK [Update APT cache with new repository] ************************************
ok: [baptiste-donaux.fr]
TASK [Install docker-engine package if it doesn't exist] ***********************
ok: [baptiste-donaux.fr]
TASK [Install Python] **********************************************************
ok: [baptiste-donaux.fr]
TASK [Install PIP] *************************************************************
ok: [baptiste-donaux.fr]
TASK [docker-py dependency] ****************************************************
ok: [baptiste-donaux.fr]
TASK [Pull Nginx image] ********************************************************
ok: [baptiste-donaux.fr]
TASK [Create a Nginx container] ************************************************
ok: [baptiste-donaux.fr]
PLAY RECAP *********************************************************************
baptiste-donaux.fr : ok=10 changed=0 unreachable=0 failed=0

Et voilà rien de plus simple. En plus d’exécuter un scénario complet sur un ensemble de serveurs, si l’un d’entre eux se retrouve en erreur, un fichier .retry sera créé et en relançant la commande, le scénario reprendra là où vous en étiez.

Relancer facilement votre scénario et reprennez où vous vous étiez arrêté

Ansible Galaxy et Vault

Galaxy et où stocker vos modules

Ansible-Galaxy est un Hub pour partager vos modules. Il fonctionne un peu à la manière de Docker Hub pour les images Docker.

Vault et comment protéger les informations sensibles

Dans certains cas, vous aurez besoin de stocker dans vos scénarios des informations sensibles (mot de passe…). Plutôt que de stocker en clair ces informations, vous pouvez encoder/décoder ses fichiers.

Un petit exemple ne fera pas de mal.

1
2
3
4
# my_playbook.yml
- hosts: localhost
tasks:
- shell: sshpass -p "foo" scp -r /bar baz@localhost:/qux
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Encoder avec Vault votre fichier
$ ansible-vault encrypt my_playbook.yml
New Vault password:
Confirm New Vault password:
Encryption successful
# Display the playbook encoded
$ cat my_playbook.yml
$ANSIBLE_VAULT;1.1;AES256
34396264333338636331323838386331393664623065383463663661373436643764336536326662
6238626432373334356436613935306630376461633136650a316561316531323937633963643032
64643239616561653864346132356537656536313030656532373733316262663536396438383262
3463373265636232640a626364306666373665303633663630353132383764323530646438383737
31336163633631373162356339633739356461656130353533306137613436663333383137376366
62383533393262376362393565386133306432323266393034616331333932663266613739653538
36663666333938323961343231366266323430376234376363353662386366373061636434613763
35653139316465613562613834373434636238643661633434326661303438666233313732653338
3264
# Utiliser le playbook encodé sans le décoder préalablement
$ ansible-playbook my_playbook.yml --ask-vault-pass
Vault password:

C'est simple de protéger vos playbooks avec Ansible Vault

Conclusion

Cet article a pour simple objectif de présenter Ansible et de montrer en quoi il peut simplifier vos tâches. N’hésitez pas à faire des retours, à améliorer et/ou corriger ce post.