ansible

Premiers playbooks Ansible: créer et exécuter vos premiers playbooks Ansible en 2024

Écrire ses premiers playbooks Ansible peut être à la fois simple et facile.

Dernière modification le 15 février 2023 à 16:26 heures

Écrire ses premiers playbooks Ansible

Premiers playbooks Ansible

Dans ce quatrième article sur ‘Débuter avec Ansible‘, nous allons voir qu’écrire ses premiers playbook Ansible peut être à la fois simple et facile.

Les playbooks sont des fichiers texte écrits au format YAML et nécessitent donc:

  • de commencer par trois tirets (---)
  • une indentation appropriée en utilisant des espaces et surtout pas de tabulation !

Structure locale des fichiers de vos premiers playbooks Ansible

Pour sauvegarder et ordonner vos fichiers, je vous suggère d’utiliser une structure de fichiers locale minimale semblable à la suivante:

  • tous les fichiers Ansible se trouveront dans un sous-répertoire du ‘home directory’ de l’utilisateur local, ici ~/mon-ansible
  • les fichiers yawl des playbooks seront dans un sous-répertoire playbooks
  • les éventuels fichiers de définition de variables seront regroupés dans un sous-répertoire séparé json-files
premiers playbooks Ansible

Un playbook Ansible se compose de deux parties

  • une partie générique dans laquelle ont trouve:
    • obligatoirement la liste du/des noeuds clients sur le(s)quel(s) le playbook va s’exécuter
    • une série facultative de définitions globales propres au playbook:
      • la définition de variables éventuelles
      • des directives globales comme par exemple:
        • become: pour l’élévation de privilèges dans les playbooks, identique à l’utilisation de -b dans la commande Ad-hoc.
        • gather-facts: pour prendre en compte ou pas des variables natives la configuration de Ansible
  • la liste des tâches (tasks:) que comporte le playbook. Chaque tâche va comporter les éléments suivants:
    • le nom de la tâche
    • le nom du module Ansible utilisé
    • une liste des commandes à exécuter au sein de ce module

Votre premier playbook Ansible

Dans ce premier playbook nous allons utiliser le module Ansible shell. Pour une liste complète des modules et de leur utilisation avec des exemples, voir la documentation officielle de Ansible.

Voici à quoi notre fichier YAML du playbook va ressembler:

---
  - name: Mon premier playbook Ansible
    hosts: "{{ target | default('no_hosts')}}"
    become: yes
    gather_facts: no
    
    tasks:

    - name: Afficher l'adresse IP via la commande shell 'hostname -I'
      shell:
         "hostname -I"
      register: IPcmd

    - debug: 
        msg:
          - "l'adresse IP est {{IPcmd.stdout}}"
  • de début de fichier YAML
  • name: une description du playbook
  • hosts: la liste des noeuds clients sur le(s)quel(s) le playbook va s’exécuter:
    • soit la variable {{target}} si définie, sinon aucun host par défaut
    • become: yes utiliser les privilèges root
    • gather_facts: no ne pas utiliser les variables natives de Ansible
  • tasks: début de la liste des tâches
  • première tâche:
    • name: description de la tâche
    • shell: nom du module
      • “hostname -I” commande dans le module
    • register: permet enregistrer le résultat de la commande dans une variable locale IPcmd
  • deuxième tâche debug: permet d’afficher des messages à l’écran, ici:
    • afficher le contenu de la variable IPcmd. Remarquez les doubles accolades pour le nom de la {{variable}} et le .stdout pour ne montrer que ce qui est affichable.

Créez (avec nano par exemple) et sauvegarder le fichier dans le sous-répertoire /playbooks de /mon-ansible.

Pour lancer le playbook:

  • ouvrez un terminal sur ubuntu-vbox0 (avec ssh dans un commande prompt ou avec putty par exemple)
  • allez vers le sous-répertoire mon-ansible (cd mon-ansible)
  • lancer avec la commande:
ansible-playbook ./playbooks/premier-playbook.yml -e target=ubuntu-vbox3
  • ./playbooks/premier-playbook.yml est le chemin vers le playbook
  • -e target= est la variable à passer au playbook, dans notre cas ubuntu-vbox3
  • -e target= peut également être un groupe défini dans le fichier inventory comme par exemple mes_vbox
  • -e target= pourrait également être un fichier json définissant les variables à passer au playbook

Voici ce que cela donne:

Deuxième playbook

Dans ce deuxième playbook, nous allons utiliser le module Ansible apt pour mettre à jour les packages de noeuds clients en exécutant à distance l’équivalent d’un

  • sudo apt update
  • suivi d’un sudo apt upgrade
  • avec éventuellement un reboot si nécessaire

Nous allons travailler avec le noeud client ubuntu-vbox3, target=ubuntu-vbox3,. Vous pouvez bien entendu utiliser tout autre cible définie dans le fichier inventory, y compris les groupes de cibles comme mes_vbox.

Commençons par utiliser la commande ad-hoc “apt update” depuis le node de contrôle ubuntu-vbox0 pour visualiser l’état des packages installés par exemple sur ubuntu-vbox3, sans oublier le ‘-b’ pour l’exécution avec les privilèges root

ansible ubuntu-vbox3 -m shell -a "apt update" -b

ce qui nous donne:

Nous pouvons constater que 47 packages peuvent être mis à jour.

Avec l’éditeur nano ou tout autre éditeur (personnellement j’utilise VS code), créons notre playbook apt-update-upgrade.yml dans le sous-répertoire ./playbooks.

Comme pour le premier playbook, commençons par:

---
- name: Playbook pour updater, upgrader les packages et rebooter si nécessaire
  hosts: "{{ target | default('no_hosts')}}"
  become: yes
  gather_facts: no

et donnons lui une description adéquate.

Définissons ensuite les tâches en commençant par le module apt:

  tasks: 
    - name: sudo apt update, upgrade et autoremove
      register: updatesys
      apt:
        update_cache: yes
        force_apt_get: yes
        cache_valid_time: 3600
        upgrade: dist
        autoremove: yes
        purge: yes
  • name: description de la tâche
  • register: updatesys définir une variable résultat de la tâche
  • apt: le module utilisé
  • update_cache: yes faire un apt update
  • force_apt_get: yes utiliser apt-get plutôt que apt pour des raisons de compatibilité
  • cache_valid_time: mettre à jour le cache si apt-cache est plus vieux que 3600 secondes
  • upgrade: dist faire un dist-upgrade plutôt qu’un upgrade simple
  • autoremove: yes apt autoremove
  • purge: yes apt purge

Utilisons la variable via le module debug pour afficher le résultat de la tâche:

    - name: Montrer les dernières ligne de la tâche
      debug:
        msg:
         - "{{updatesys.stdout_lines[-10:]}}"

Testons si un reboot est nécessaire via la présence ou non du fichier /var/run/reboot-required avec le module stat

    - name: Check if reboot required
      stat:
        path: /var/run/reboot-required
      register: reboot_required_file

Terminons avec le module reboot pour redémarrer si nécessaire

    - name: Rebooter seulement si nécessaire
      reboot:
        msg: "Reboot initialisé par Ansible après la mise à jour"
      when: reboot_required_file.stat.exists == true

Sauvegardons le tout dans le sous-répertoire playbooks.

Voici le fichier apt-update-upgrade.yml final

---
- name: Playbook pour updater, upgrader les packages et rebooter si nécessaire
  hosts: "{{ target | default('no_hosts')}}"
  become: yes
  gather_facts: no

  tasks: 
    - name: sudo apt update, upgrade et autoremove
      register: updatesys
      apt:
        update_cache: yes
        force_apt_get: yes
        cache_valid_time: 3600
        upgrade: dist
        autoremove: yes
        purge: yes

    - name: Montrer les dernières ligne de la tâche
      debug:
        msg:
         - "{{updatesys.stdout_lines[-10:]}}" 

    - name: Check if reboot required
      stat:
        path: /var/run/reboot-required
      register: reboot_required_file

    - name: Rebooter seulement si nécessaire
      reboot:
        msg: "Reboot initialisé par Ansible après la mise à jour"
      when: reboot_required_file.stat.exists == true

Il ne nous reste plus qu’à exécuter le playbook depuis ubuntu-vbox0

ansible-playbook ./playbooks/apt-update-upgrade.yml -e target=ubuntu-vbox3

Nous pouvons exécuter le playbook une seconde fois et nous assurer que tout s’est bien déroulé et que tous les packages ont bien été mis à jour.

En guise de confirmation, nous pouvons également utiliser la commande ad-hoc comme précédemment:

ansible-playbook ./playbooks/apt-update-upgrade.yml -e target=ubuntu-vbox3

Liens utiles

Pour terminer, quelque liens pour vous aider dans la rédaction de vos premiers playbooks Ansible

Retour vers l’article “Débuter avec Ansible“.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *