Migrer un script shell en script Ansible

Si vous êtes un développeur ou un administrateur système, vous avez probablement déjà écrit des scripts Bash pour automatiser des tâches courantes. Les scripts Bash sont puissants, mais ils ne sont pa

 · 6 min read

Migrer votre script Bash en script Ansible Idempotent : Guide pour Débutants

Si vous êtes un développeur ou un administrateur système, vous avez probablement déjà écrit des scripts Bash pour automatiser des tâches courantes. Les scripts Bash sont puissants, mais ils ne sont pas toujours idempotents, ce qui signifie qu'ils peuvent produire des résultats imprévisibles si vous les exécutez plusieurs fois. Pour résoudre ce problème, vous pouvez migrer vos scripts Bash vers Ansible, un outil d'automatisation populaire qui prend en charge l'idempotence. Dans cet article, nous vous guiderons à travers le processus de migration d'un script Bash en un script Ansible idempotent.

Qu'est-ce que l'idempotence ?

L'idempotence est une propriété essentielle des scripts d'automatisation. Un script est dit idempotent lorsqu'il peut être exécuté plusieurs fois sans causer de changements indésirables lorsqu'il est appliqué à un système déjà configuré. En d'autres termes, l'idempotence garantit que l'état cible est atteint, quel que soit l'état actuel du système.

Pourquoi migrer vers Ansible ?

Ansible est un outil d'automatisation open source qui simplifie la gestion de la configuration et le déploiement d'infrastructures. Il est particulièrement adapté à la gestion de serveurs, de réseaux et d'applications. Voici quelques avantages de l'utilisation d'Ansible :

  1. Idempotence intégrée : Ansible est conçu pour garantir que les états souhaités sont atteints de manière idempotente, ce qui signifie que vous pouvez exécuter vos tâches de manière répétée sans problème.
  2. Syntaxe simple : Ansible utilise une syntaxe YAML facile à lire, ce qui le rend accessible même aux personnes qui ne sont pas des experts en programmation.
  3. Gestion de l'infrastructure en tant que code : Ansible permet de gérer votre infrastructure comme du code, ce qui facilite la collaboration et le suivi des modifications.
  4. Extensible : Vous pouvez étendre les fonctionnalités d'Ansible en écrivant vos propres modules en Python.

Étapes pour migrer un script Bash en Ansible

Étape 1 : Analyser votre script Bash

Avant de commencer la migration, passez en revue votre script Bash existant. Identifiez les tâches que le script effectue et notez les commandes Bash utilisées.

Étape 2 : Créer un fichier YAML pour Ansible

Créez un fichier YAML qui représentera votre tâche Ansible. Le fichier YAML doit contenir les éléments suivants :


---
- name: Nom de votre tâche
  hosts: cibles_ansibles
  tasks:
    - name: Nom de votre tâche Ansible
      become: yes  # Pour exécuter la tâche en tant qu'administrateur
      # Insérez vos commandes Ansible ici
    

Étape 3 : Traduire les commandes Bash en modules Ansible

Remplacez les commandes Bash de votre script par des modules Ansible équivalents. Ansible propose une grande variété de modules pour effectuer des tâches courantes. Par exemple, pour installer un package, vous pouvez utiliser le module apt pour les systèmes basés sur Debian ou le module yum pour les systèmes basés sur Red Hat. Voici un exemple :


---
- name: Installer le package nginx
  hosts: serveurs_web
  tasks:
    - name: Utiliser le module apt pour installer nginx
      become: yes
      apt:
        name: nginx
        state: present
    

Étape 5 : Testez votre script Ansible

Avant de lancer votre script Ansible en production, testez-le sur un environnement de développement ou de test. Assurez-vous qu'il fonctionne comme prévu et qu'il est idempotent.

Exemple Pratique : Migration d'un Script Bash vers Ansible

Pour illustrer le processus de migration d'un script Bash vers Ansible, prenons l'exemple d'un script Bash qui installe et configure Apache Tomcat. Nous allons décomposer ce script Bash en différentes étapes et montrer comment le migrer vers Ansible.

Script Shell d'Installation de Tomcat

Voici le script shell complet qui installe et configure Tomcat :

#!/bin/bash
# Tomcat installation 
echo "Installing Tomcat"
cd $install_dir/scripts/tomcat
# Créer l'utilisateur tomcat avec le répertoire home /opt/tomcat
echo "Create tomcat user"
sudo useradd -m -U -d /opt/tomcat -s /bin/false tomcat
# Télécharger l'archive de Tomcat 9.0.65
echo "Download Tomcat archive"
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.65/bin/apache-tomcat-9.0.65.tar.gz -P /tmp
# Extraire l'archive vers /opt/tomcat
echo "Extract Tomcat archive"
sudo tar -xf /tmp/apache-tomcat-9.0.65.tar.gz -C /opt/tomcat
# Créer un lien symbolique 'latest' pour gérer plusieurs versions de Tomcat
echo "Create a link to the latest version"
sudo ln -svf /opt/tomcat/apache-tomcat-9.0.65 /opt/tomcat/latest
# Changer la propriété de /opt/tomcat à l'utilisateur et au groupe 'tomcat'
sudo chown -R tomcat:tomcat /opt/tomcat
# Rendre exécutables les scripts binaires
sudo bash -c 'chmod +x /opt/tomcat/latest/bin/*.sh'
# Configurer le service Tomcat
source tomcat-service.sh
# Configurer l'interface de gestion web
source tomcat-users.sh
source tomcat-manager.sh
source tomcat-host-manager.sh

Conversion vers Ansible

Voici comment nous pouvons convertir chaque étape du script Bash en une tâche Ansible équivalente, avec des explications détaillées :

---
- name: Installer et configurer Tomcat 9
  hosts: tomcat
  become: true
  tasks:
    - name: Créer l'utilisateur Tomcat
      ansible.builtin.user:
        name: tomcat
        home: /opt/tomcat
        shell: /bin/false
      # Explication : Utilisation du module Ansible 'ansible.builtin.user' pour créer un utilisateur nommé 'tomcat' avec un répertoire home '/opt/tomcat' et un shell '/bin/false'.
    - name: Télécharger Tomcat
      ansible.builtin.get_url:
        url: "https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.65/bin/apache-tomcat-9.0.65.tar.gz"
        dest: "/tmp/apache-tomcat-9.0.65.tar.gz"
        mode: "0644"
      # Explication : Utilisation du module Ansible 'ansible.builtin.get_url' pour télécharger l'archive Tomcat depuis une URL spécifiée.
    - name: Extraire Tomcat
      ansible.builtin.unarchive:
        src: "/tmp/apache-tomcat-9.0.65.tar.gz"
        dest: "/opt/tomcat"
        remote_src: yes
        creates: "/opt/tomcat"
      # Explication : Utilisation du module Ansible 'ansible.builtin.unarchive' pour extraire l'archive Tomcat dans le répertoire '/opt/tomcat'.
    - name: Créer un lien vers la dernière version
      file:
        src: /opt/tomcat/apache-tomcat-9.0.65
        dest: /opt/tomcat/latest
        state: link
      # Explication : Utilisation du module Ansible 'file' pour créer un lien symbolique vers la dernière version de Tomcat.
    - name: Changer la propriété du répertoire /opt/tomcat
      file:
        path: /opt/tomcat
        state: directory
        recurse: yes
        owner: tomcat
        group: tomcat
      # Explication : Utilisation du module Ansible 'file' pour changer la propriété du répertoire '/opt/tomcat' à l'utilisateur 'tomcat' et au groupe 'tomcat'.
    - name: Trouver tous les fichiers se terminant par .sh
      ansible.builtin.find:
        paths: /opt/tomcat/latest/bin
        patterns: '*.sh'
      register: sh_files
      # Explication : Utilisation du module Ansible 'ansible.builtin.find' pour trouver tous les fichiers se terminant par '.sh' dans le répertoire des binaires de Tomcat.
    - name: Rendre exécutables tous les fichiers se terminant par .sh
      file:
        path: "{{ item.path}} "
        state: file
        mode: a+x
      with_items:
        - "{{ sh_files.files}}"
      # Explication : Utilisation du module Ansible 'file' pour rendre exécutables tous les fichiers '.sh' trouvés précédemment.
    - name: Générer la configuration OpenID Connect
      template:
        src: "template/nextcloud.conf.j2"
        dest: "/etc/nginx/sites-available/nextcloud.conf"
        mode: 0644
      # Explication : Utilisation du module Ansible 'template' pour générer une configuration à partir d'un modèle Jinja2 et la placer à l'emplacement spécifié.
    - name: Créer le fichier de service Tomcat
      template:
        src: "tomcat.service.j2"
        dest: "/etc/systemd/system/tomcat.service"
        mode: 0644
      # Explication : Utilisation du module Ansible 'template' pour créer un fichier de service Tomcat.
    - name: Redémarrer et activer le service Tomcat
      service:
        name: tomcat
        enabled: true
        state: restarted
      # Explication : Utilisation du module Ansible 'service' pour redémarrer et activer le service Tomcat.
    - name: Créer les utilisateurs Tomcat
      template:
        src: "tomcat-users.xml.j2"
        dest: "/opt/tomcat/latest/conf/tomcat-users.xml"
        mode: 0644
      # Explication : Utilisation du module Ansible 'template' pour créer un fichier de configuration 'tomcat-users.xml'.
    - name: Autoriser l'interface de gestion Tomcat avec une adresse IP
      template:
        src: "tomcat-manager.xml.j2"
        dest: "/opt/tomcat/latest/webapps/manager/META-INF/context.xml"
        mode: 0644
      # Explication : Utilisation du module Ansible 'template' pour configurer l'interface de gestion Tomcat.
    - name: Autoriser l'interface de gestion Tomcat Host Manager avec une adresse IP
      template:
        src: "tomcat-host-manager.xml.j2"
        dest: "/opt/tomcat/latest/webapps/host-manager/META-INF/context.xml"
        mode: 0644
      # Explication : Utilisation du module Ansible 'template' pour configurer l'interface de gestion Tomcat Host Manager.
    - name: Redémarrer et activer le service Tomcat à nouveau
      service:
        name: tomcat
        enabled: true
        state: restarted
      # Explication : Utilisation du module Ansible 'service' pour redémarrer et activer le service Tomcat à nouveau.

Dans cet exemple pratique, nous avons converti chaque étape du script Bash d'installation et de configuration de Tomcat en une tâche Ansible correspondante, en fournissant des explications détaillées pour chaque étape. Vous pouvez ainsi automatiser ce processus avec Ansible en bénéficiant de l'idempotence et de la facilité de gestion.

Conclusion

La migration de vos scripts Bash vers Ansible vous permettra de bénéficier de l'idempotence intégrée, de la simplicité de la syntaxe YAML et de la gestion de l'infrastructure en tant que code. Suivez les étapes ci-dessus pour migrer vos scripts avec succès et profitez des avantages qu'offre Ansible en matière d'automatisation et de gestion de configuration.

N'oubliez pas de consulter la documentation Ansible pour en savoir plus sur les modules et les fonctionnalités avancées. Bonne migration !


No comments yet

No comments yet. Start a new discussion.

Add Comment