Ansible – script d’inventaire

Petit script qui permet de générer un fichier d’inventaire pour Ansible avec nmap.
#!/bin/bash
# Vérifier si nmap est installé
if ! command -v nmap &> /dev/null
then
echo "Erreur : nmap n'est pas installé. Veuillez installer nmap avant de continuer."
exit 1
fi
# Vérifier si l'utilisateur a passé un réseau en argument
if [ -z "$1" ]; then
echo "Usage: $0 <network>"
echo "Exemple: $0 192.168.1.0/24"
exit 1
fi
# Prendre le réseau passé en argument
NETWORK=$1
# Vérifier si le script est exécuté avec des privilèges root
if [ "$EUID" -ne 0 ]; then
echo "Avertissement : Les privilèges root sont requis pour détecter l'OS. Le script continuera sans détection d'OS."
# Effectuer un simple scan sans détection d'OS
nmap -sn "$NETWORK" -oG basic_scan.txt
SCAN_FILE="basic_scan.txt"
else
# Scan du réseau avec détection d'OS
echo "Scanning le réseau $NETWORK pour détecter les OS..."
nmap -O "$NETWORK" -oG os_scan.txt
SCAN_FILE="os_scan.txt"
fi
# Fichiers d'inventaire INI
INVENTORY_FILE="inventory_by_os.ini"
# Créer des groupes pour les OS courants dans le fichier d'inventaire
echo "[linux]" > $INVENTORY_FILE
echo "[windows]" >> $INVENTORY_FILE
echo "[mac_os]" >> $INVENTORY_FILE
echo "[unknown_os]" >> $INVENTORY_FILE
# Lire le fichier de scan et trier les hôtes par OS
while read -r line; do
ip=$(echo "$line" | awk '{print $2}')
if [ "$EUID" -eq 0 ]; then
# Si l'utilisateur est root, essayer de détecter l'OS
if echo "$line" | grep -q "Linux"; then
# Ajouter les hôtes Linux
echo "$ip ansible_user=your_user ansible_ssh_private_key_file=~/.ssh/id_rsa" >> $INVENTORY_FILE
elif echo "$line" | grep -q "Windows"; then
# Ajouter les hôtes Windows
echo "$ip ansible_user=your_user ansible_password=your_password" >> $INVENTORY_FILE
elif echo "$line" | grep -q "Darwin" || echo "$line" | grep -q "Mac OS"; then
# Ajouter les hôtes macOS (Darwin est le noyau de macOS)
echo "$ip ansible_user=your_user ansible_ssh_private_key_file=~/.ssh/id_rsa" >> $INVENTORY_FILE
elif echo "$line" | grep -q "Running:"; then
# Si l'OS n'est pas Linux, Windows ou macOS, le classer dans "unknown_os"
echo "$ip" >> $INVENTORY_FILE
fi
else
# Si l'utilisateur n'est pas root, tous les hôtes vont dans "unknown_os"
if echo "$line" | grep -q "Host: "; then
echo "$ip" >> $INVENTORY_FILE
fi
fi
done < $SCAN_FILE
# Afficher le résultat
echo "Inventaire généré : $INVENTORY_FILE"
cat $INVENTORY_FILE
Explications du script :
- Vérification des privilèges root : Le script vérifie si le script est exécuté avec les privilèges root en vérifiant la variable
$EUID. Si l’UID est différent de0, cela signifie que l’utilisateur n’a pas les privilèges nécessaires. - Avertissement : Si le script est exécuté sans privilèges root, un message d’avertissement est affiché pour informer l’utilisateur que la détection d’OS ne sera pas effectuée.
- Continuation sans détection d’OS : Si les privilèges root sont absents, le script fait un scan simple sans détection d’OS (
nmap -sn), et tous les hôtes sont regroupés sous le groupe[unknown_os]. - Utilisation de fichiers de scan différents :
- Si root est disponible : le fichier
os_scan.txtest utilisé (avec détection d’OS). - Si root est absent : le fichier
basic_scan.txtest utilisé (sans détection d’OS).
- Si root est disponible : le fichier
- Gestion des hôtes :
- Si les privilèges root sont présents, le script tente de détecter l’OS et de classer les hôtes dans les groupes correspondants (
[linux],[windows],[mac_os]). - Sans root, tous les hôtes sont ajoutés à
[unknown_os].
- Si les privilèges root sont présents, le script tente de détecter l’OS et de classer les hôtes dans les groupes correspondants (
Rendez le script exécutable :
chmod +x generate_inventory_by_os.sh
Exécutez le script avec le réseau cible en argument :
./generate_inventory_by_os.sh 192.168.1.0/24
Comportement du script :
- Avec privilèges root : Le script détecte les OS et génère un inventaire avec les groupes
[linux],[windows],[mac_os], et[unknown_os]. - Sans privilèges root : Le script affiche un avertissement, ne tente pas de détecter l’OS, et classe tous les hôtes sous
[unknown_os].
Exemple de fichier d’inventaire généré sans privilèges root :
[linux] [windows] [mac_os] [unknown_os] 192.168.1.10 192.168.1.15 192.168.1.20
Exemple de fichier d’inventaire généré avec privilèges root :
[linux] 192.168.1.10 ansible_user=your_user ansible_ssh_private_key_file=~/.ssh/id_rsa [windows] 192.168.1.20 ansible_user=your_user ansible_password=your_password [mac_os] 192.168.1.25 ansible_user=your_user ansible_ssh_private_key_file=~/.ssh/id_rsa [unknown_os] 192.168.1.30








