Troubleshooting - Foufou-exe/iac-terraform-ansible-aws-webserver-demo GitHub Wiki
Ce guide couvre tous les problèmes courants et leurs solutions détaillées.
Error: error configuring Terraform AWS Provider: no valid credential sources for Terraform AWS Provider found.
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: Error launching source instance: InvalidKeyPair.NotFound: The key pair 'id_rsa' does not exist
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: Error launching source instance: InstanceLimitExceeded: You have reached the limit on the number of instances you can run.
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)
ssh: connect to host X.X.X.X port 22: Connection refused
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).
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.
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
curl: (7) Failed to connect to X.X.X.X port 80: Connection refused
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
La page par défaut d'Apache s'affiche au lieu de votre page personnalisée.
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/*
TASK [Installation d'Apache2] *************************************************
fatal: [web-apache-tm]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh"}
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
TASK [Installation d'Apache2] *************************************************
fatal: [web-apache-tm]: FAILED! => {"msg": "Missing sudo password"}
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
#!/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é !"
#!/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
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é