6.6 KiB
Architecture NETbian
Ce document decrit l'architecture actuelle de NETbian et le pipeline d'execution du provisioning.
Vue d'ensemble
NETbian repose sur une architecture profiles + roles.
profile -> liste ordonnee de roles
role -> implementation technique autonome
Un profil ne contient que de la composition. Toute la logique technique est portee par les roles et par les fonctions partagees de lib.sh.
Arborescence
netbian/
├── run.sh
├── roles.sh
├── lib.sh
├── profiles/
│ ├── cli.sh
│ ├── desktop.sh
│ ├── devel.sh
│ └── server.sh
├── roles/
│ ├── base/
│ ├── codium/
│ ├── desktop/
│ ├── devel/
│ ├── docker/
│ ├── firewall/
│ ├── server/
│ └── zram/
└── config/
Profils
Chaque profil est un script shell qui declare ROLE_ORDER.
Exemple avec profiles/devel.sh :
ROLE_ORDER=(base desktop firewall zram docker codium devel)
Profils fournis :
cli->base zramserver->base firewall server zram dockerdesktop->base desktop firewall zramdevel->base desktop firewall zram docker codium devel
Contrat d'un role
Un role est un repertoire sous roles/<nom>/.
Fichiers reconnus par le moteur :
repo.shpackages.listinstall.shconfig.shrun.shl10n.packagesrules.<suffix>.list
Tout autre fichier est rejete par validate_role() pour eviter les derives silencieuses.
Pipeline global
1. run.sh
run.sh est le point d'entree. Il :
- initialise l'environnement (
PROJECT_DIR,ROLE_DIR,PROFILE_DIR) - charge
lib.shet activeset -Eeuo pipefail - parse les options CLI
- peut lister les profils et roles disponibles
- verifie les prerequis (
root, Debian 13, reseau HTTP) - valide puis lit / met a jour le fichier de configuration
- exporte
CONFIG_FILE - execute
roles.sh
2. roles.sh
roles.sh :
- charge
lib.sh - valide
CONFIG_FILE - lit
CONFIG_FILE - recupere
profile - source
profiles/<profile>.sh - valide la definition du profil et les roles references
- execute
run_rolepour chaque role dans l'ordre - imprime un resume d'execution en sortie
Resolution de configuration
Ordre de priorite :
- options CLI
- variables d'environnement
NETBIAN_* - fichier de configuration cible
Variables gerees :
profilelangCONFIG_FILE(transportee par l'environnement entrerun.shetroles.sh)
validate_config_file() refuse les lignes invalides et controle les formats de profile et lang avant sourcing.
Pipeline d'un role
Le moteur execute les etapes suivantes dans cet ordre :
repo.shpackages.listinstall.shconfig.shrun.sh
Toutes les etapes sont optionnelles.
Implementation logique de run_role() :
validate_role
run_role_script repo.sh
load_role_packages
append_localized_packages
run_role_packages
run_role_script install.sh
run_role_script config.sh
run_role_script run.sh
Les erreurs sont propagees explicitement avec || return 1 pour eviter de dependre uniquement du comportement implicite de set -e.
Gestion des paquets
load_role_packages()chargeroles/<role>/packages.listappend_localized_packages()enrichit la liste avec les paquets localises definis dansroles/base/l10n.packages- la langue utilisee provient de la configuration active (
lang) run_role_packages()appelleensure_packages_installed()
Si un role n'a aucun paquet a installer, le moteur enregistre un [SKIP] sur role/packages.list.
Configuration et copie de fichiers
copy_config() copie les fichiers depuis config/ vers leur destination finale :
- propriete
root:rootpour les fichiers systeme - propriete utilisateur si la destination est sous
/home/<user>/ - ecriture idempotente si le contenu est identique
write_if_changed() et write_text_file_if_changed() centralisent les ecritures atomiques simples.
Firewall declaratif
Le role firewall utilise un systeme declaratif base sur des listes de regles :
roles/firewall/
├── rules.common.list
├── rules.desktop.list
├── rules.devel.list
└── rules.server.list
Ordre d'application :
- initialisation UFW
- regles communes
- regles specifiques au profil
Chaque ligne correspond a une regle passee a ufw allow.
Exemple :
# rules.common.list
ssh
# rules.server.list
http
https
imap
imaps
smtp
submissions
Le modele est volontairement unique : les ouvertures UFW sont centralisees dans les fichiers rules.*.list, pas dans les autres roles.
Services systeme
restart_service_if_present() permet de redemarrer un service uniquement s'il existe. Cela evite de rendre certains roles fragiles sur des machines ou le service n'est pas installe.
Le role server s'appuie sur ce mecanisme apres ecriture de la configuration SSH.
Logs et resume d'execution
Le moteur expose les helpers suivants :
log_runlog_oklog_skiplog_infolog_warn
Tags utilises par l'orchestrateur :
[RUN][OK][SKIP][INFO][WARN]
Des tableaux runtime suivent les etapes et roles executes, ignores ou en echec :
EXECUTED_STEPSSKIPPED_STEPSFAILED_STEPSEXECUTED_ROLES
Le resume est imprime par print_execution_summary() via un trap EXIT dans roles.sh.
Decouverte et validation
Lister les profils :
./run.sh --list-profiles
Lister les roles :
./run.sh --list-roles
Validation minimale recommandee :
bash -n run.sh roles.sh lib.sh roles/*/*.sh profiles/*.sh
./run.sh --list-profiles
./run.sh --list-roles
Validation recommandee avant production :
- machine Debian 13 fraiche
- test de chaque profil
- verification des services systemd critiques (
ssh,docker,zramswap) - verification UFW apres run
- rerun complet pour confirmer l'idempotence
Principes de conception
- Idempotence : rejouer un role ne doit pas deteriorer l'etat.
- Composition simple : les profils ne font qu'ordonner des roles.
- Validation stricte : les roles, manifests et fichiers de configuration sont verifies avant execution.
- Ecritures limitees : seules les differences utiles sont ecrites.
- Previsibilite : les comportements critiques sont centralises dans
lib.sh. - Source de verite unique : un seul mecanisme par sujet critique (ex. firewall).
Resume d execution
Steps executedcompte les etapes ayant effectue une action.Steps skippedcompte les etapes entierement conformes ou sautees par l'orchestrateur.Skip eventscompte tous les messages[SKIP]emis pendant l'execution.