Sommaire

Ansible Stage 2

Introduction

Sur l’article où je faisais mes débuts avec Ansible et celui ou je mets cela en application, je n’avais pas de structure particulière : tous étaient dans un seul et même fichier.

Depuis, je me suis relancé sur le sujet. J’arrive maintenant à configurer plusieurs tâches et utiliser des variables et c’est ce que je vous partage ici.

Contexte

Dans ce tutoriel, on va définir plusieurs rôles que l’ont va appliqué sur un seul est même hôte.

De ce fait, je me positionne dans un dossier avec les fichiers suivants :

  • Fichier hosts.yml
1
2
3
4
5
6
---
all:
  hosts:
    192.168.92.17:
      ansible_python_interpreter: /usr/bin/python3
      ansible_user: root
  • Fichier playbook.yml
1
2
3
4
5
6
---
- name: "Azerty"
  hosts: all
  roles:
    - un-role
    #- un-autre

Vous l’aurez compris, on va créer des rôles qui auront des noms pas très originaux.

Premier rôle

On créer alors notre premier rôle avec la commande ansible-galaxy init un-role.
On obtient alors un dossier un-role avec l’arborescence suivante :

├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml

Lors du lancement du playbook (comme configuré dans la partie précédente), Ansible va exécuter les tâches contenues dans tasks/main.yml.

On va alors y définir deux actions :

  1. Copier un fichier
  2. Installer de paquets
1
2
3
4
5
- name: Copie du script
  copy:
    src: mon_script.sh
    dest: /usr/local/sbin/mon_script
    mode: u=rwx,g=rwx,o=r

On voit que cette tâche copie le fichier mon_script.sh en tant que mon_script dans le dossier /usr/local/sbin de l’hôte.

Mais à quelle endroit fait référence le dossier source (celui ou se trouve mon_script.sh) ?
Tous simplement le dossier files ! Il vous suffit donc de placer vos fichiers dans ce dossier pour pouvoir les référencer rapidement. Vous pouvez aussi y mettre une arborescence.

1
2
3
- name: Installation de trucs
  apt: name={{ item }} state=latest
  loop: "{{ une_liste_de_trucs }}"

L’installation de paquets me permet de vous montrer un autre aspect d’Ansible : les variables. En effet, l’élément en Mustache (soit une_liste_de_trucs) est à définir dans le fichier vars/main.yml.

Comme ceci :

1
2
3
4
5
une_liste_de_trucs:
  - sl
  - cmatrix
  - cowsay
  - toilet

Ou comme cela :

1
une_liste_de_trucs: ["sl", "cmatrix", "cowsay", "toilet"]

Vous pouvez alors tester cela en revenant dans le dossier racine (parent de un-role) avec la commande :

1
ansible-playbook -i hosts.yml playbook.yml

Second rôle

1
2
ansible-galaxy init un-autre
cd un-autre

L’intérêt de faire un autre rôle et de vous présenter autre chose.
On va ici organiser les tâches dans plusieurs fichiers que l’on va ensuite inclure dans le tasks/main.yml

Fichier tasks/premiere.yml

1
2
3
4
5
- name: Copie de 1.txt
  copy:
    src: un/1.txt
    dest: /tmp/1.txt
    mode: u=r,g=r,o=r

Fichier tasks/deuxieme.yml

1
2
3
4
5
- name: Copie de 2.txt
  copy:
    src: deux/2.txt
    dest: /tmp/2.txt
    mode: u=r,g=r,o=r

Les fichiers ont donc respectivement les chemins d’accès suivants :

  • un-autre/files/un/1.txt
  • un-autre/files/deux/2.txt

L’appel de ces deux fichiers dans un-autre/tasks/main.yml se fait de la manière suivante :

1
2
3
4
5
6
7
---
# tasks file for un-autre (tasks/main.yml)
- name: Première tâche
  include_tasks: un-autre/tasks/premiere.yml

- name: Deuxième tâche
  include_tasks: un-autre/tasks/deuxieme.yml

Bizarrement, il faut donner le chemin relatif à la racine du playbook (pas comme pour les fichiers de dossier files)…

Tags

Un moment donné, vous allez surement avoir un playbook assez long :

1
2
3
4
5
6
7
8
9
- name: "Azerty"
  hosts: all
  roles:
    - un-role
    - un-autre
    - encore-un-autre
    - avant-avant-dernier
    - avant-dernier
    - dernier

Lors d’ajout de chose mineure dans un rôle, il est probable que vous souhaiteriez seulement lancer ce rôle et pas les autres pour rien.
Pour ma part, je commentais les autres rôles dans le fichier playbook.yml et je le lançais.

On peut rendre cela un peu mieux en ajoutant un tag à ces rôles. Reprenons le playbook.yml de la manière suivante :

1
2
3
4
5
6
7
8
9
- name: "Azerty"
  hosts: all
  roles:
    - {role: 'un-role', tags: 'un-role'}
    - {role: 'un-autre', tags: 'un-autre'}
    - {role: 'encore-un-autre', tags: 'encore-un-autre'}
    - {role: 'avant-avant-dernier', tags: 'avant-avant-dernier'}
    - {role: 'avant-dernier', tags: 'avant-dernier'}
    - {role: 'dernier', tags: 'dernier'}

Ainsi, on peut lancé un rôle en utilisant sont tag :

1
ansible-playbook -i hosts.yml playbook.yml --tags avant-dernier

On peut aussi utiliser plusieurs tags en les séparant par des virgules.

Outroduction

Je suis loin d’avoir un bon niveau en Ansible mais je progresse.
Du coup, il y aura surement un “Stage 3” quand j’aurai des trucs plus complexes à faire.

Bien à vous ! 😉