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 relance python3 generer_vues_obsidian.py dans le dossier scripts.

  • À 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é."