Ansible – script d’inventaire

Ansible – script d’inventaire

Ansible

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 de 0, 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.txt est utilisé (avec détection d’OS).
    • Si root est absent : le fichier basic_scan.txt est utilisé (sans détection d’OS).
  • 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].

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