deploiement_roles.sh
Note de lecture générée automatiquement
Le vrai fichier est
scripts/linux/deploiement_roles.sh(Obsidian n’affiche pas les scripts eux-mêmes). Ne modifie pas cette note : modifie le script, puis relancepython3 generer_vues_obsidian.pydans le dossierscripts.
- À quoi il sert : TP B2 : rôles web/bdd/wordpress/firewall par SSH
- Lancer (dans le dossier
scripts/linux/) :./deploiement_roles.sh <IP> <web|bdd|wordpress|firewall> [user] - Fiche : L07 - Scripting Bash
- Retour : 00 - Tous les scripts
Code
#!/usr/bin/env bash
# =============================================================================
# deploiement_roles.sh — TP Linux B2 : déployer un rôle sur une VM Debian via SSH
#
# Usage : ./deploiement_roles.sh <IP_VM> <role> [utilisateur_ssh]
# Rôles : web | bdd | wordpress | firewall
# Exemple : ./deploiement_roles.sh 192.168.122.50 web
# ./deploiement_roles.sh 192.168.122.51 bdd jarvis
#
# Principe :
# - le mot de passe sudo est demandé UNE fois, sans s'afficher, et n'est
# jamais écrit dans le script ;
# - chaque rôle est une fonction qui envoie un mini-script à la VM par SSH ;
# - chaque fonction VÉRIFIE d'abord si le rôle est déjà installé.
#
# Prérequis : accès SSH à la VM (idéalement par clé : ssh-copy-id user@IP),
# l'utilisateur distant doit être dans le groupe sudo.
# =============================================================================
set -euo pipefail
ip_vm="${1:-}"
role="${2:-}"
utilisateur_ssh="${3:-$USER}"
afficher_aide() {
echo "Usage : $0 <IP_VM> <web|bdd|wordpress|firewall> [utilisateur_ssh]"
exit 1
}
-n "$ip_vm" && -n "$role" || afficher_aide
# --- Récupérer le mot de passe sudo sans l'afficher (méthode du sujet) ---------
ancien_mode=$(stty -g)
stty -echo
read -r -p "Mot de passe sudo de $utilisateur_ssh@$ip_vm (invisible) : " MOT_DE_PASSE
stty "$ancien_mode"
echo
# --- Exécuter un bloc de commandes en root sur la VM ---------------------------
# On envoie sur l'entrée standard de SSH : 1re ligne = mot de passe, puis le
# script. Côté VM, le shell lit le mot de passe dans une variable, garde le reste
# comme script, et donne le mot de passe à "sudo -S" par un tube.
# => le mot de passe n'apparaît dans AUCUNE ligne de commande (ps, historique).
executer_distant() {
local script_distant="$1"
{ printf '%s\n' "$MOT_DE_PASSE"; printf '%s\n' "$script_distant"; } |
ssh -o ConnectTimeout=5 "$utilisateur_ssh@$ip_vm" \
'IFS= read -r mdp; script_recu=$(cat); printf "%s\n" "$mdp" | sudo -S -p "" bash -c "$script_recu"'
}
# --- Rôle WEB : Apache + PHP (dépendances de base pour WordPress) --------------
role_web() {
echo "==> Rôle WEB sur $ip_vm"
executer_distant '
set -e
if dpkg -s apache2 >/dev/null 2>&1; then
echo "Apache est déjà installé : rien à faire."
else
export DEBIAN_FRONTEND=noninteractive
apt-get update -q
apt-get install -y -q apache2 php libapache2-mod-php php-mysql php-curl php-gd \
php-mbstring php-xml php-zip php-intl
systemctl enable --now apache2
echo "Apache + PHP installés : $(php -v | head -n1)"
fi
'
}
# --- Rôle BDD : MariaDB qui écoute sur toutes les interfaces -------------------
role_bdd() {
echo "==> Rôle BDD sur $ip_vm"
executer_distant '
set -e
if dpkg -s mariadb-server >/dev/null 2>&1; then
echo "MariaDB est déjà installé : rien à faire."
else
export DEBIAN_FRONTEND=noninteractive
apt-get update -q
apt-get install -y -q mariadb-server
fichier_conf=/etc/mysql/mariadb.conf.d/50-server.cnf
sed -i "s/^bind-address.*/bind-address = 0.0.0.0/" "$fichier_conf"
systemctl enable mariadb
systemctl restart mariadb
echo "MariaDB installé. Ports en écoute :"
ss -tlnp | grep 3306 || true
fi
'
}
# --- Rôle WORDPRESS : fichiers dans /var/www/wordpress + site Apache ------------
role_wordpress() {
echo "==> Rôle WORDPRESS sur $ip_vm"
role_web # WordPress a besoin d'Apache + PHP
executer_distant '
set -e
dossier=/var/www/wordpress
if [ -f "$dossier/wp-settings.php" ]; then
echo "WordPress est déjà présent dans $dossier : rien à faire."
else
apt-get install -y -q wget
cd /tmp
wget -q https://wordpress.org/latest.tar.gz -O wordpress.tar.gz
tar -xzf wordpress.tar.gz -C /var/www/ # crée /var/www/wordpress
chown -R www-data:www-data "$dossier"
find "$dossier" -type d -exec chmod 755 {} \;
find "$dossier" -type f -exec chmod 644 {} \;
cat > /etc/apache2/sites-available/wordpress.conf <<CONF
<VirtualHost *:80>
DocumentRoot $dossier
<Directory $dossier>
AllowOverride All
Require all granted
</Directory>
ErrorLog \${APACHE_LOG_DIR}/wordpress_error.log
CustomLog \${APACHE_LOG_DIR}/wordpress_access.log combined
</VirtualHost>
CONF
a2ensite wordpress.conf >/dev/null
a2dissite 000-default.conf >/dev/null
a2enmod rewrite >/dev/null
systemctl reload apache2
echo "WordPress installé : ouvre http://$(hostname -I | cut -d" " -f1)/ pour finir l installation."
fi
'
}
# --- Rôle FIREWALL : iptables selon les services présents ----------------------
role_firewall() {
echo "==> Rôle FIREWALL sur $ip_vm"
executer_distant '
set -e
command -v iptables >/dev/null || { apt-get update -q; apt-get install -y -q iptables; }
iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
echo "SSH (22) ouvert"
if systemctl is-active --quiet apache2; then
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
echo "Apache détecté : 80 et 443 ouverts"
fi
if systemctl is-active --quiet mariadb; then
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
echo "MariaDB détecté : 3306 ouvert"
fi
export DEBIAN_FRONTEND=noninteractive
echo iptables-persistent iptables-persistent/autosave_v4 boolean true | debconf-set-selections
echo iptables-persistent iptables-persistent/autosave_v6 boolean true | debconf-set-selections
dpkg -s iptables-persistent >/dev/null 2>&1 || apt-get install -y -q iptables-persistent
netfilter-persistent save
iptables -L INPUT -n --line-numbers
'
}
# --- Aiguillage selon le rôle demandé -------------------------------------------
case "$role" in
web) role_web ;;
bdd) role_bdd ;;
wordpress) role_wordpress ;;
firewall) role_firewall ;;
*) echo "Rôle inconnu : $role"; afficher_aide ;;
esac
unset MOT_DE_PASSE
echo "Terminé."