TUTOS.EU

Playbook Ansible qui utilise python

Utiliser Python dans un Playbook Ansible

Ansible c'est bien mais quand on doit commencer à faire des manipulations un peu complexes qui nécessites des if else etc sur les postes, cela devient vite compliqué.
Du coup cela peut être intéressant de demander à Ansible d'exécuter un script python sur les machines cibles et de récupérer le résultat.

 

Le but ici est de montrer un exemple de script python qui sera copié et exécuté sur les machines.
En regardant le code vous verrez que via print Python peut afficher des choses que l'on verra à l'exécution du playbook.
Le script peut retourner un code erreur qui permettra d'indiquer à Ansible si tout s'est bien passé ou non.

 

Le script en lui même ne fait rien de spécial.
Je lui ai fait afficher le nom de la machine, la distribution avec sa version.
Ensuite on exécute la commande ls -al /

On récupère la sortie que l'on affiche.
On récupère également un code d'erreur. S'il est différent de 0 Ansible considère qu'il y a un problème et affichera le résultat en rouge.
 

Le script Python.

import socket

#Nom du serveur en minuscules
hostname = socket.gethostname().lower()

#Informations sur la distribution à partir du fichier /etc/os-release
with open('/etc/os-release', 'r') as file:
    os_release_info = file.read()

# Analysez le contenu du fichier pour obtenir le nom de la distribution
distro_line = next(line for line in os_release_info.splitlines() if line.startswith('ID='))
distro_name = distro_line.split('=')[1].strip().lower().strip('""') if distro_line else ""

# Obtenez la version à partir du fichier /etc/os-release
version_line = next(line for line in os_release_info.splitlines() if line.startswith('VERSION_ID='))
version = version_line.split('=')[1].strip('""') if version_line else ""

print("Hostname\t{}".format(hostname))
print("Distribution\t{}".format(distro_name))
print("Version\t{}".format(version))

command = "ls -al /"


# Exécutez la commande

import subprocess
result = subprocess.run(command, shell=True, capture_output=True)

# Récupérer le code de retour
code_retour = result.returncode

print(f"Code de retour par défaut : {code_retour}")

# Afficher la sortie standard et la sortie d'erreur
print("Sortie standard:", result.stdout.decode())
print("Sortie d'erreur:", result.stderr.decode())

exit(code_retour)
Lien vers le fichier : cliquez ici Copier le code

Le playbook lui va :

  • installer python3 sur la machine cible
  • copier le script sur la machine
  • exécuter le script
  • le supprimer sur la machine

 

Dans cet exemple le compte utilisé sous Linux se nomme ansible 

 

Ansible est capable de récupérer le code d'erreur envoyé par le script python et d'afficher ce qu'il indique.

---
 - name: Execute
   hosts: all
   become: yes
   become_method: sudo
   tasks:
    - name: Install python3
      ansible.builtin.yum:
        name: python3
        state: present
      ignore_errors: yes  # Ignorer les erreurs et continuer en cas d'échec

    - name: Copier le script Python sur le serveur
      copy:
        src: /home/ansible/vault/monscriptpython.py
        dest: /home/ansible/monscriptpython.py
        owner: ansible
        group: ansible
        mode: 'u+x'

    - name: Exécuter le script
      command: python3 monscriptpython.py
      args:
        chdir: /home/ansible/
      register: myoutput

    - name: Print myoutput
      ansible.builtin.debug:
        msg:
        - "Code erreur : {{ myoutput.rc }}"
        - "{{ myoutput.stdout }}"

    - name: "Effacer le script"
      ansible.builtin.file:
        path: /home/ansible/monscriptpython.py
        state: absent
Lien vers le fichier : cliquez ici Copier le code

2