Troubleshooting - Foufou-exe/iac-terraform-ansible-aws-webserver-demo GitHub Wiki

🔧 Guide de Dépannage

Ce guide couvre tous les problèmes courants et leurs solutions détaillées.

🚨 Problèmes de Déploiement Terraform

❌ Error: Access Denied

Symptômes

Error: error configuring Terraform AWS Provider: no valid credential sources for Terraform AWS Provider found.

Solutions

1. Vérifier les Credentials

# Vérifier les variables d'environnement
env | grep AWS

# Vérifier le fichier terraform.tfvars
grep -E "(aws_access_key_id|aws_secret_access_key)" terraform.tfvars

# Test direct AWS CLI
aws sts get-caller-identity

2. Permissions IAM Manquantes

# Vérifier les permissions de l'utilisateur
aws iam get-user
aws iam list-attached-user-policies --user-name VOTRE_USERNAME

# Permissions minimales requises
aws iam attach-user-policy --user-name VOTRE_USERNAME --policy-arn arn:aws:iam::aws:policy/AmazonEC2FullAccess

3. Région Incorrecte

# Lister les régions disponibles
aws ec2 describe-regions --output table

# Mettre à jour terraform.tfvars
aws_region = "eu-west-3"  # Région correcte

❌ Error: InvalidKeyPair.NotFound

Symptômes

Error: Error launching source instance: InvalidKeyPair.NotFound: The key pair 'id_rsa' does not exist

Solutions

1. Vérifier les Clés SSH Locales

# Vérifier l'existence des clés
ls -la ~/.ssh/id_rsa*

# Si manquantes, les régénérer
ssh-keygen -t rsa -b 4096 -C "[email protected]"

2. Vérifier la Configuration

# Vérifier terraform.tfvars
grep ssh_name_public_key terraform.tfvars

# Le fichier doit exister
test -f ~/.ssh/$(grep ssh_name_public_key terraform.tfvars | cut -d'"' -f2) && echo "✅ Clé trouvée" || echo "❌ Clé manquante"

3. Recréer la Ressource Key Pair

# Supprimer et recréer
terraform destroy -target=aws_key_pair.main
terraform apply -target=aws_key_pair.main

❌ Error: Resource Limit Exceeded

Symptômes

Error: Error launching source instance: InstanceLimitExceeded: You have reached the limit on the number of instances you can run.

Solutions

1. Vérifier les Limites de Compte

# Lister les instances existantes
aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,State.Name,InstanceType]' --output table

# Vérifier les limites de service
aws service-quotas get-service-quota --service-code ec2 --quota-code L-1216C47A

2. Nettoyer les Ressources Inutilisées

# Terminer les instances inutiles
aws ec2 terminate-instances --instance-ids i-1234567890abcdef0

# Ou via Terraform
terraform destroy

3. Demander une Augmentation de Limite

# Via AWS Support ou Service Quotas dans la console
# Navigation : Service Quotas > AWS services > Amazon Elastic Compute Cloud (Amazon EC2)

🔐 Problèmes de Connexion SSH

❌ Connection Refused (Port 22)

Symptômes

ssh: connect to host X.X.X.X port 22: Connection refused

Solutions

1. Attendre le Démarrage Complet

# Les instances AWS prennent 2-3 minutes à démarrer
sleep 180

# Vérifier l'état de l'instance
aws ec2 describe-instances --instance-ids INSTANCE_ID --query 'Reservations[*].Instances[*].State.Name'

2. Vérifier le Security Group

# Lister les règles du Security Group
aws ec2 describe-security-groups --group-names "main-security-group" --query 'SecurityGroups[*].IpPermissions'

# Le port 22 doit être ouvert

3. Vérifier l'IP Publique

# Obtenir l'IP publique actuelle
terraform output ansible-tm_public_ip
terraform output web-apache-tm_public_ip

# Tester la connectivité
ping $(terraform output -raw ansible-tm_public_ip)

❌ Permission Denied (publickey)

Symptômes

Permission denied (publickey).

Solutions

1. Vérifier les Permissions des Clés

# Corriger les permissions
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub

# Vérifier la propriété
ls -la ~/.ssh/id_rsa*

2. Vérifier la Clé Utilisée

# Test avec verbose SSH
ssh -v -i ~/.ssh/id_rsa admin@IP_ADDRESS

# Spécifier la clé explicitement
ssh -o IdentitiesOnly=yes -i ~/.ssh/id_rsa admin@IP_ADDRESS

3. Vérifier l'Utilisateur

# Debian utilise 'admin', Ubuntu utilise 'ubuntu'
ssh -i ~/.ssh/id_rsa admin@IP_ADDRESS  # Debian
ssh -i ~/.ssh/id_rsa ubuntu@IP_ADDRESS # Ubuntu (si applicable)

❌ Host Key Verification Failed

Symptômes

Host key verification failed.

Solutions

1. Nettoyer les Clés Connues

# Supprimer l'ancienne entrée
ssh-keygen -R IP_ADDRESS

# Ou désactiver la vérification temporairement
ssh -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa admin@IP_ADDRESS

2. Configuration SSH Permanente

# Ajouter à ~/.ssh/config
Host aws-*
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

🌐 Problèmes du Serveur Web

❌ Apache n'est pas Accessible (HTTP)

Symptômes

curl: (7) Failed to connect to X.X.X.X port 80: Connection refused

Solutions

1. Vérifier l'État d'Apache

# Se connecter au serveur
ssh -i ~/.ssh/id_rsa admin@$(terraform output -raw web-apache-tm_public_ip)

# Vérifier le statut d'Apache
sudo systemctl status apache2

# Si arrêté, le démarrer
sudo systemctl start apache2
sudo systemctl enable apache2

2. Vérifier les Ports Ouverts

# Sur le serveur web
sudo netstat -tlnp | grep :80
sudo ss -tlnp | grep :80

# Vérifier les processus Apache
sudo ps aux | grep apache2

3. Vérifier les Logs Apache

# Logs d'erreur
sudo tail -f /var/log/apache2/error.log

# Logs d'accès
sudo tail -f /var/log/apache2/access.log

# Logs système
sudo journalctl -u apache2 -f

4. Redémarrer Apache

# Redémarrage complet
sudo systemctl restart apache2

# Test de configuration
sudo apache2ctl configtest

# Recharger la configuration
sudo systemctl reload apache2

❌ Page par Défaut au lieu de la Page Personnalisée

Symptômes

La page par défaut d'Apache s'affiche au lieu de votre page personnalisée.

Solutions

1. Vérifier le Fichier index.html

# Vérifier l'existence du fichier
ls -la /var/www/html/index.html

# Vérifier le contenu
cat /var/www/html/index.html

# Vérifier les permissions
ls -la /var/www/html/

2. Recréer la Page Personnalisée

# Relancer le playbook Ansible
cd ~/ansible
ansible-playbook -i host.ini playbook.yml -v

# Ou manuellement
sudo cat << 'EOF' > /var/www/html/index.html
<!DOCTYPE html>
<html>
<head>
    <title>Mon Site Personnalisé</title>
</head>
<body>
    <h1>Site Web Déployé avec Succès !</h1>
    <p>Date: $(date)</p>
</body>
</html>
EOF

3. Vérifier la Configuration Apache

# Vérifier la configuration des sites
sudo apache2ctl -S

# Vérifier le DocumentRoot
grep DocumentRoot /etc/apache2/sites-enabled/*

🤖 Problèmes Ansible

❌ Ansible Playbook Failed

Symptômes

TASK [Installation d'Apache2] *************************************************
fatal: [web-apache-tm]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh"}

Solutions

1. Vérifier la Connectivité SSH d'Ansible

# Se connecter au serveur Ansible
ssh -i ~/.ssh/id_rsa admin@$(terraform output -raw ansible-tm_public_ip)

# Tester la connexion vers le serveur web
cd ~/ansible
ansible -i host.ini web-apache-tm -m ping -v

2. Vérifier l'Inventaire Ansible

# Vérifier le fichier host.ini
cat ~/ansible/host.ini

# Tester avec l'IP directement
ansible -i 'IP_WEB_SERVER,' all -m ping --user admin --private-key ~/.ssh/web-apache-tm-key

3. Debug SSH depuis Ansible

# Test SSH manuel depuis le serveur Ansible
ssh -i ~/.ssh/web-apache-tm-key admin@IP_WEB_SERVER

# Si ça ne marche pas, vérifier les clés
ls -la ~/.ssh/
cat ~/.ssh/web-apache-tm-key | head -n1

4. Relancer le Playbook avec Plus de Verbosité

cd ~/ansible
ansible-playbook -i host.ini playbook.yml -vvv

❌ Sudo Password Required

Symptômes

TASK [Installation d'Apache2] *************************************************
fatal: [web-apache-tm]: FAILED! => {"msg": "Missing sudo password"}

Solutions

1. Vérifier la Configuration Sudo

# Sur le serveur web, vérifier sudo pour admin
ssh -i ~/.ssh/id_rsa admin@IP_WEB_SERVER
sudo whoami  # Doit fonctionner sans mot de passe

# Vérifier la configuration sudo
sudo cat /etc/sudoers | grep admin

2. Modifier le Playbook

# Ajouter become_method si nécessaire
- name: Installation et configuration d'Apache2
  hosts: webservers
  become: yes
  become_method: sudo
  become_user: root

🔍 Outils de Diagnostic

🛠️ Script de Diagnostic Complet

#!/bin/bash
# diagnostic.sh - Script de diagnostic complet

echo "🔍 DIAGNOSTIC COMPLET - Infrastructure AWS"
echo "=========================================="

# 1. Terraform Status
echo -e "\n📋 1. ÉTAT TERRAFORM"
terraform --version
terraform validate
echo "État actuel :"
terraform show | head -20

# 2. AWS Connectivity
echo -e "\n☁️ 2. CONNECTIVITÉ AWS"
aws sts get-caller-identity 2>/dev/null || echo "❌ AWS CLI non configuré"

# 3. Instances Status
echo -e "\n🖥️ 3. ÉTAT DES INSTANCES"
if terraform output ansible-tm_public_ip >/dev/null 2>&1; then
    ANSIBLE_IP=$(terraform output -raw ansible-tm_public_ip)
    WEB_IP=$(terraform output -raw web-apache-tm_public_ip)

    echo "Ansible Server: $ANSIBLE_IP"
    echo "Web Server: $WEB_IP"

    # Test ping
    ping -c 1 $ANSIBLE_IP >/dev/null 2>&1 && echo "✅ Ansible accessible" || echo "❌ Ansible inaccessible"
    ping -c 1 $WEB_IP >/dev/null 2>&1 && echo "✅ Web accessible" || echo "❌ Web inaccessible"

else
    echo "❌ Instances non déployées"
fi

# 4. SSH Connectivity
echo -e "\n🔐 4. CONNECTIVITÉ SSH"
if [ ! -z "$ANSIBLE_IP" ]; then
    timeout 10 ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa admin@$ANSIBLE_IP "echo 'SSH OK'" 2>/dev/null && echo "✅ SSH Ansible OK" || echo "❌ SSH Ansible FAILED"
    timeout 10 ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa admin@$WEB_IP "echo 'SSH OK'" 2>/dev/null && echo "✅ SSH Web OK" || echo "❌ SSH Web FAILED"
fi

# 5. Web Service
echo -e "\n🌐 5. SERVICE WEB"
if [ ! -z "$WEB_IP" ]; then
    HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://$WEB_IP --connect-timeout 10)
    if [ "$HTTP_STATUS" = "200" ]; then
        echo "✅ Site web accessible (HTTP $HTTP_STATUS)"
    else
        echo "❌ Site web inaccessible (HTTP $HTTP_STATUS)"
    fi
fi

# 6. Ansible Status
echo -e "\n🤖 6. ÉTAT ANSIBLE"
if [ ! -z "$ANSIBLE_IP" ]; then
    ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa admin@$ANSIBLE_IP "
        if [ -d ~/ansible ]; then
            echo '✅ Répertoire Ansible présent'
            ls -la ~/ansible/
            if [ -f ~/ansible/host.ini ]; then
                echo '✅ Inventaire présent'
                cat ~/ansible/host.ini
            fi
        else
            echo '❌ Répertoire Ansible manquant'
        fi
    " 2>/dev/null
fi

echo -e "\n🎉 Diagnostic terminé !"

📊 Monitoring en Temps Réel

#!/bin/bash
# monitor.sh - Monitoring continu

while true; do
    clear
    echo "🔄 MONITORING - $(date)"
    echo "========================"

    # Status des instances
    if terraform output ansible-tm_public_ip >/dev/null 2>&1; then
        ANSIBLE_IP=$(terraform output -raw ansible-tm_public_ip)
        WEB_IP=$(terraform output -raw web-apache-tm_public_ip)

        # Test HTTP
        HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://$WEB_IP --connect-timeout 5)
        echo "🌐 Site Web: HTTP $HTTP_CODE"

        # Test SSH
        timeout 5 ssh -o ConnectTimeout=3 -i ~/.ssh/id_rsa admin@$ANSIBLE_IP "uptime" 2>/dev/null && echo "✅ Ansible: UP" || echo "❌ Ansible: DOWN"
        timeout 5 ssh -o ConnectTimeout=3 -i ~/.ssh/id_rsa admin@$WEB_IP "uptime" 2>/dev/null && echo "✅ Web: UP" || echo "❌ Web: DOWN"
    fi

    sleep 30
done

🆘 Support d'Urgence

Actions Rapides en Cas de Problème Critique

1. Destruction et Recréation Complète

# Sauvegarde de l'état
cp terraform.tfstate terraform.tfstate.backup

# Destruction
terraform destroy -auto-approve

# Recréation
terraform apply -auto-approve

2. Recréation d'une Instance Spécifique

# Ansible uniquement
terraform destroy -target=aws_instance.ansible-tm
terraform apply -target=aws_instance.ansible-tm

# Web uniquement
terraform destroy -target=aws_instance.web-apache-tm
terraform apply -target=aws_instance.web-apache-tm

3. Reset SSH Complet

# Régénérer les clés
rm ~/.ssh/id_rsa*
ssh-keygen -t rsa -b 4096 -C "nouveau-deploy"

# Nettoyer known_hosts
> ~/.ssh/known_hosts

# Redéployer
terraform apply -replace=aws_key_pair.main

📞 Besoin d'aide ? Ouvrez une issue GitHub avec :

  • Version de Terraform (terraform version)
  • Logs d'erreur complets
  • Sortie du script de diagnostic
  • Système d'exploitation utilisé
⚠️ **GitHub.com Fallback** ⚠️