module

Beryl::Config::Merger

Fusionne la chaîne d'héritage d'un host pour produire sa config effective.

Ordre d'application (du plus général au plus spécifique) :

  1. _default.yml (socle technique commun)
  2. <domaine>.yml (identité du domaine, users, clé domaine)
  3. <groupe>.yml (optionnel, packages/sudoers métier)
  4. <host>.yml (spécificités host)

Règles de merge :

  • Scalaires (hostname, raid, timezone…) : override strict.
  • Hashes imbriqués : merge récursif.
  • freebsd.packages / freebsd.sudoers : append + dédup.
  • freebsd.users : merge par name. Pour un user présent dans plusieurs niveaux, les scalaires (shell, primary_group…) sont overridés, et ssh_keys est remplacé par la liste la plus spécifique (pas append).
  • freebsd.disks : override strict.
  • freebsd.users[].ssh_keys : chaque user reçoit EN PLUS la ou les clés SSH du domaine (champ racine ssh_keys: du fichier <domaine>.yml) injectées en tête. La clé domaine est obligatoire, non supprimable par un niveau inférieur.

Class methods

append_array_path?(path : String) : Bool

Chemins dont les arrays s'appendent au lieu de se remplacer. Liste volontairement courte et explicite — pas de règle globale « toutes les arrays s'appendent » pour éviter les surprises (disks, ssh_keys qui doivent rester override).

Source
deep_merge(base : Hash(YAML::Any, YAML::Any), override : Hash(YAML::Any, YAML::Any), path : String) : Hash(YAML::Any, YAML::Any)

Merge récursif avec règles spécifiques pour les chemins connus. path suit la position dans l'arbre (ex: "freebsd.packages").

Source
inject_domain_keys_into_users(config : Hash(YAML::Any, YAML::Any), domain_keys_resolved : Array(String), ssh_dir : String = DEFAULT_SSH_DIR) : Hash(YAML::Any, YAML::Any)

Injecte la ou les clés SSH du domaine en tête de ssh_keys de chaque user. Les clés que chaque user déclare sont aussi résolues (nom de fichier → contenu), puis filtrées pour éviter les doublons avec la clé domaine. La clé domaine ne peut pas être supprimée par un niveau inférieur : elle est toujours présente en tête.

Source
merge(defaults : Hash(YAML::Any, YAML::Any), domain : Domain, group : Group | Nil, host : HostNode, ssh_dir : String = DEFAULT_SSH_DIR) : Hash(YAML::Any, YAML::Any)

Produit le Hash YAML effectif d'un host, en partant de defaults et en appliquant les niveaux un à un. La clé domaine est injectée dans chaque user après le merge, et toutes les clés SSH (domaine + user) sont résolues via Config.resolve_ssh_key (nom de fichier dans ssh_dir → contenu, ou inline si la chaîne commence par ssh-).

Source
merge_arrays(base : Array(YAML::Any), override : Array(YAML::Any), path : String) : Array(YAML::Any)
Source
merge_users(base : Array(YAML::Any), override : Array(YAML::Any)) : Array(YAML::Any)

Merge de deux listes de users par leur champ name. Pour un user présent des deux côtés, on applique un deep_merge (scalaires overridés). ssh_keys est remplacé par la version du niveau supérieur (pas append, cohérent avec la sémantique déclarative voulue pour beryl apply).

Source