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
Le playbook lui va :
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
Article(s) en relation(s)