Files
rendu-atelier-iac/scripts/install-deps-linux.sh
T
2026-06-04 09:45:51 +02:00

211 lines
5.1 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
HASHICORP_KEYRING="/usr/share/keyrings/hashicorp-archive-keyring.gpg"
HASHICORP_LIST="/etc/apt/sources.list.d/hashicorp.list"
VIRTUALBOX_KEYRING="/usr/share/keyrings/oracle-virtualbox-2016.gpg"
VIRTUALBOX_LIST="/etc/apt/sources.list.d/virtualbox.list"
VIRTUALBOX_PACKAGE=""
log() {
printf '[install] %s\n' "$*"
}
warn() {
printf '[install] Warning: %s\n' "$*" >&2
}
die() {
printf '[install] Error: %s\n' "$*" >&2
exit 1
}
run_root() {
if [[ "${EUID}" -eq 0 ]]; then
"$@"
else
require_command sudo
sudo "$@"
fi
}
require_command() {
command -v "$1" >/dev/null 2>&1 || die "Commande requise introuvable: $1"
}
contains() {
local value="$1"
shift
local item
for item in "$@"; do
if [[ "$item" == "$value" ]]; then
return 0
fi
done
return 1
}
get_codename() {
if [[ -n "${VERSION_CODENAME:-}" ]]; then
printf '%s\n' "${VERSION_CODENAME}"
return 0
fi
if command -v lsb_release >/dev/null 2>&1; then
lsb_release -cs
return 0
fi
die "Impossible de determiner le codename de la distribution."
}
ensure_supported_distribution() {
require_command apt-get
require_command dpkg
if [[ ! -r /etc/os-release ]]; then
die "Le fichier /etc/os-release est introuvable."
fi
# shellcheck disable=SC1091
. /etc/os-release
DISTRO_ID="${ID:-}"
CODENAME="$(get_codename)"
ARCH="$(dpkg --print-architecture)"
if [[ "${ARCH}" != "amd64" ]]; then
die "Ce script cible les hotes Debian/Ubuntu amd64 pour VirtualBox. Architecture detectee: ${ARCH}."
fi
case "${DISTRO_ID}" in
ubuntu)
if ! contains "${CODENAME}" focal jammy noble oracular; then
warn "Ubuntu ${CODENAME} n'etait pas dans la liste testee au moment d'ecrire ce script. Je continue avec les depots officiels."
fi
;;
debian)
if ! contains "${CODENAME}" bullseye bookworm; then
warn "Debian ${CODENAME} n'etait pas dans la liste testee au moment d'ecrire ce script. Je continue avec les depots officiels."
fi
;;
*)
die "Distribution non prise en charge: ${DISTRO_ID:-inconnue}. Ce script supporte Debian et Ubuntu."
;;
esac
}
install_base_packages() {
log "Installation des prerequis APT..."
run_root apt-get update
run_root apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release \
software-properties-common \
wget
}
configure_hashicorp_repo() {
local tmpdir
tmpdir="$(mktemp -d)"
log "Configuration du depot HashiCorp..."
curl -fsSL "https://apt.releases.hashicorp.com/gpg" -o "${tmpdir}/hashicorp.gpg"
run_root gpg --yes --dearmor -o "${HASHICORP_KEYRING}" "${tmpdir}/hashicorp.gpg"
printf 'deb [signed-by=%s] https://apt.releases.hashicorp.com %s main\n' "${HASHICORP_KEYRING}" "${CODENAME}" \
| run_root tee "${HASHICORP_LIST}" >/dev/null
rm -rf "${tmpdir}"
}
configure_virtualbox_repo() {
local tmpdir
tmpdir="$(mktemp -d)"
log "Configuration du depot Oracle VirtualBox..."
curl -fsSL "https://www.virtualbox.org/download/oracle_vbox_2016.asc" -o "${tmpdir}/oracle_vbox_2016.asc"
run_root gpg --yes --dearmor -o "${VIRTUALBOX_KEYRING}" "${tmpdir}/oracle_vbox_2016.asc"
printf 'deb [arch=amd64 signed-by=%s] https://download.virtualbox.org/virtualbox/debian %s contrib\n' "${VIRTUALBOX_KEYRING}" "${CODENAME}" \
| run_root tee "${VIRTUALBOX_LIST}" >/dev/null
rm -rf "${tmpdir}"
}
select_virtualbox_package() {
local packages=()
local package=""
mapfile -t packages < <(apt-cache search --names-only '^virtualbox-[0-9]+\.[0-9]+$' | awk '{print $1}' | sort -V)
if [[ "${#packages[@]}" -gt 0 ]]; then
package="${packages[$(("${#packages[@]}" - 1))]}"
elif apt-cache show virtualbox >/dev/null 2>&1; then
package="virtualbox"
else
die "Aucun paquet VirtualBox compatible n'a ete trouve apres l'ajout du depot Oracle."
fi
VIRTUALBOX_PACKAGE="${package}"
log "Paquet VirtualBox selectionne: ${VIRTUALBOX_PACKAGE}"
}
install_project_dependencies() {
select_virtualbox_package
log "Installation de VirtualBox, Vagrant, Terraform et Ansible..."
run_root apt-get update
run_root apt-get install -y \
ansible \
terraform \
vagrant \
"${VIRTUALBOX_PACKAGE}"
}
install_ansible_collection() {
log "Installation de la collection Ansible community.general..."
run_root mkdir -p /usr/share/ansible/collections
run_root ansible-galaxy collection install community.general --collections-path /usr/share/ansible/collections --force
}
print_versions() {
log "Verification des versions installees:"
VBoxManage --version
vagrant --version
terraform version
ansible --version
}
print_next_steps() {
cat <<'EOF'
Installation terminee.
Etapes suivantes:
1. terraform init
2. terraform apply
Note:
- Si Secure Boot est actif, VirtualBox peut demander une validation ou une signature de modules noyau avant de pouvoir demarrer des VMs.
EOF
}
main() {
ensure_supported_distribution
install_base_packages
configure_hashicorp_repo
configure_virtualbox_repo
install_project_dependencies
install_ansible_collection
print_versions
print_next_steps
}
DISTRO_ID=""
CODENAME=""
ARCH=""
main "$@"