module

Beryl::Config

Namespace de la configuration beryl dans ~/.config/beryl/ (ADR-014).

Arborescence :

~/.config/beryl/ _default.yml # socle technique commun à toutes sociétés .env.yml # credentials : société → fournisseur → vars <société>/ _account.yml # optionnel : métadonnées société <domaine>.yml # identité du domaine <domaine>/ # hosts directs + groupes <host>.yml <groupe>.yml # propriétés du groupe <groupe>/ <host>.yml

Un fichier host dans un groupe garde le même FQDN <host>.<domaine> que s'il était à la racine du domaine : le groupe n'apparaît PAS dans le FQDN. Le groupe ne sert qu'à factoriser les propriétés métier (packages, sudoers…).

Hiérarchie d'héritage (du plus général au plus spécifique) :

  1. _default.yml — socle commun à tous les domaines
  2. <société>/<domaine>.yml — identité du domaine
  3. <société>/<domaine>/<groupe>.yml — spécialisation d'usage (optionnel)
  4. <société>/<domaine>/<host>.yml OU <société>/<domaine>/<groupe>/<host>.yml

Règles de merge (voir Beryl::Config::Merger) :

  • scalaires : override
  • freebsd.packages / sudoers : append + dédup
  • freebsd.users : merge par name
  • freebsd.users[].ssh_keys : remplacement (liste exacte au niveau le plus spécifique) + injection de la clé domaine obligatoire
  • freebsd.disks : override

Constants

DEFAULT_SSH_DIR = File.expand_path("~/.ssh", home: true)

Dossier par défaut où vivent les clés publiques SSH côté opérateur. Toutes les clés SSH référencées par nom dans les YAML sont cherchées ici. Philippe, 22 avril 2026 : « Toutes les clés sont systématiquement dans ~/.ssh pourquoi coder un chemin ? ».

DOMAIN_SUFFIX = ".domain.yml"

Lit l'arborescence ~/.config/beryl/ et construit un Root exploitable.

Arborescence (ADR-014) : le type d'un fichier est dans son nom (*.host.yml), celui d'un dossier dans sa PLACE — un dossier sous une société est un domaine (nom à point), un dossier sous un domaine est un GROUPE (nom sans point). Chaque niveau a ses réglages communs dans son _defaults.yml.

~/.config/beryl/ ├── _default.yml ├── .env.yml ├── <société>/ │ ├── _account.yml # optionnel : métadonnées société │ ├── .env.toml.age # optionnel : coffre credentials chiffré │ ├── <domaine>.domain.yml │ ├── <domaine>/ # hosts directs + groupes │ │ ├── <host>.host.yml │ │ └── <groupe>/ # GROUPE (nom sans point) │ │ ├── _defaults.yml # optionnel : réglages communs du groupe │ │ ├── <host>.host.yml │ │ └── ... │ ├── <sous.domaine>/ # un sous-domaine est À CÔTÉ, jamais dedans │ └── ... └── <autre société>/

Règle de typage :

  • *.domain.yml → domaine ;
  • *.host.yml → host (direct, ou membre d'un groupe) ;
  • <groupe>/ → groupe (dossier sans point sous un domaine) ;
  • *.recipe.yml → recette (lue par beryl sync, ignorée ici).

Tolère les fichiers/dossiers absents : une société peut avoir un seul domaine sans sous-dossier d'hosts, un _default.yml peut manquer, etc. Seul ~/.config/beryl/ lui-même peut être absent (on retourne un Root vide).

Suffixes typés (un seul endroit où ils sont déclarés).

GROUP_SUFFIX = ".group.yml"

Ancienne déclaration de groupe, REFUSÉE (remplacée par <groupe>/_defaults.yml).

HOST_SUFFIX = ".host.yml"

Class methods

deployed_key_names(entries : Array(YAML::Any)) : Array(String)

Noms de clés à DÉPLOYER, à partir des entrées brutes ssh_keys:. Chaque entrée est soit :

  • une clé (string) → la clé.
  • une PAIRE [active, suivante] → la PREMIÈRE (l'active). La paire signale une rotation en cours : beryl sync ne pose que l'active ; beryl rotate-key promeut la suivante. Les entrées non exploitables sont ignorées.
Source
resolve_ssh_key(value : String, ssh_dir : String = DEFAULT_SSH_DIR) : String

Résout une entrée ssh_keys: vers le contenu effectif à poser dans authorized_keys côté serveur.

Deux formes reconnues automatiquement :

  1. Clé inline (commence par ssh-) :

    • ssh-ed25519 AAAAC3... philippe@example.com Utilisée telle quelle, après .strip.
  2. Nom de fichier (tout le reste, typiquement nom.pub) :

    • philippe.example.com.pub Cherché dans ssh_dir (défaut ~/.ssh/). On lit la première ligne non vide et non commentée du fichier.

Permet à l'opérateur d'éviter la duplication (une clé vit à un seul endroit : ~/.ssh/nom.pub) et facilite la rotation : on ajoute une 2ème entrée ssh_keys: temporairement pour déployer la nouvelle clé, puis on retire l'ancienne ligne.

Source
resolve_ssh_keys(values : Array(String), ssh_dir : String = DEFAULT_SSH_DIR) : Array(String)

Résout une liste d'entrées ssh_keys: en liste de clés effectives. Helper pratique, signalement au premier échec.

Source

Nested types