From 71833ebfeeec3b7ef6105db126f92beabb14486a Mon Sep 17 00:00:00 2001 From: Dany LE Date: Fri, 11 Apr 2025 13:01:38 +0000 Subject: [PATCH] feat: add examples of persionalized module --- modules/library/my_module.py | 14 ++++ modules/library/second_module.py | 106 +++++++++++++++++++++++++++++++ modules/module-example.yml | 12 ++++ modules/second_module.yml | 17 +++++ 4 files changed, 149 insertions(+) create mode 100644 modules/library/my_module.py create mode 100644 modules/library/second_module.py create mode 100644 modules/module-example.yml create mode 100644 modules/second_module.yml diff --git a/modules/library/my_module.py b/modules/library/my_module.py new file mode 100644 index 0000000..e37b204 --- /dev/null +++ b/modules/library/my_module.py @@ -0,0 +1,14 @@ +#!/usr/bin/python +from ansible.module_utils.basic import AnsibleModule +def main(): + module = AnsibleModule( + argument_spec={ + "name": {"type": "str", "required": True} + } + ) + name = module.params["name"] + if name == "admin": + module.fail_json(msg="Nom réservé !") + module.exit_json(changed=True, msg=f"Bonjour {name}") +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/modules/library/second_module.py b/modules/library/second_module.py new file mode 100644 index 0000000..a189cda --- /dev/null +++ b/modules/library/second_module.py @@ -0,0 +1,106 @@ +#!/usr/bin/python + +from ansible.module_utils.basic import AnsibleModule +import os + +DOCUMENTATION = """ +--- +module: mon_module +short_description: Crée un fichier avec un message personnalisé +description: + - Ce module écrit un message de salutation dans un fichier. + - Il prend en compte l'idempotence, le mode check, et fournit un diff si le fichier change. +options: + name: + description: + - Le nom de la personne à saluer. + required: true + type: str + path: + description: + - Le chemin du fichier à créer ou mettre à jour. + required: true + type: str +author: + - "Moi !!" +""" + +EXAMPLES = """ +- name: Créer un message dans un fichier + mon_module: + name: Alice + path: /tmp/bonjour.txt +""" + +RETURN = """ +message: + description: Résultat de l'exécution + type: str + returned: always +diff: + description: Ancien vs nouveau contenu (si applicable) + type: dict + returned: when changed +""" + +def main(): + module = AnsibleModule( + argument_spec=dict( + name=dict(type="str", required=True), + path=dict(type="str", required=True), + ), + supports_check_mode=True + ) + + name = module.params["name"] + path = module.params["path"] + + # Nouveau contenu généré + new_content = f"Bonjour {name} ! Passe une excellente journée avec Ansible.\n" + old_content = "" + + # Lire l'ancien contenu s'il existe + if os.path.exists(path): + try: + with open(path, "r") as f: + old_content = f.read() + except Exception as e: + module.fail_json(msg=f"Erreur de lecture du fichier : {str(e)}") + + # Vérifier s’il y a une réelle différence + content_changed = old_content != new_content + + # Mode check : on affiche le diff mais on ne change rien + if module.check_mode: + module.exit_json( + changed=content_changed, + message="Simulation : le fichier serait mis à jour." if content_changed else "Simulation : aucun changement.", + diff={"before": old_content, "after": new_content} if content_changed else {} + ) + + # Si le contenu est déjà identique → rien à faire + if not content_changed: + module.exit_json( + changed=False, + message="Aucun changement nécessaire. Le fichier est déjà à jour." + ) + + # Sinon, on écrit le nouveau contenu + try: + with open(path, "w") as f: + f.write(new_content) + except Exception as e: + module.fail_json(msg=f"Erreur d'écriture du fichier : {str(e)}") + + # Message visible dans le callback (stdout) + print(f"Nouveau message pour {name} écrit dans {path}") + + # Fin : on informe Ansible que le contenu a changé + module.exit_json( + changed=True, + message=f"Fichier {path} mis à jour pour {name}.", + diff={"before": old_content, "after": new_content} + ) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/modules/module-example.yml b/modules/module-example.yml new file mode 100644 index 0000000..2ee6800 --- /dev/null +++ b/modules/module-example.yml @@ -0,0 +1,12 @@ +--- +- name: Exemple Ansible module personnalisé + hosts: localhost + gather_facts: false + tasks: + - name: Dire bonjour + my_module: + name: Dany LE + register: result + - name: Afficher le message + debug: + msg: "{{ result.msg }}" \ No newline at end of file diff --git a/modules/second_module.yml b/modules/second_module.yml new file mode 100644 index 0000000..f27e757 --- /dev/null +++ b/modules/second_module.yml @@ -0,0 +1,17 @@ +- name: Test du module personnalisé second_module + hosts: localhost + connection: local + gather_facts: false + tasks: + - name: Utiliser second_module pour dire bonjour + second_module: + name: Dany LE + path: /tmp/bonjour_ansible-2.txt + register: result + - name: Afficher le message du module + debug: + msg: "{{ result.message }}" + - name: Afficher le diff (si présent) + debug: + var: result.diff + when: result.diff is defined \ No newline at end of file