Modello di configurazione#
Un deploy è il risultato di fino a quattro livelli di configurazione, ciascuno di un team diverso e modificato con ritmi diversi. Tenerli separati permette a un team applicativo di rilasciare con un descrittore di dieci righe, mentre il team di piattaforma mantiene il controllo su comandi, credenziali e regole.
flowchart TB
M["manent.yml<br/><small>team di piattaforma · letto all'avvio</small>"]
E["Configurazione di ambiente<br/><small>responsabili degli ambienti · letta a ogni deploy</small>"]
T["Registro dei tenant<br/><small>facoltativo · proprietari e tag delle applicazioni</small>"]
D["Descrittore<br/><small>team applicativo · uno per rilascio</small>"]
M -->|plugin, pipeline, regole, limiti| X(("Deploy<br/>effettivo"))
E -->|target, parametri, riferimenti ai segreti, strategia| X
T -->|proprietario, coda, restrizioni, tag| X
D -->|artefatto, opzioni| X
I livelli#
| Livello | Dove | Responsabile | Contiene | Letto |
|---|---|---|---|---|
manent.yml |
Un file su ogni processo server (una ConfigMap con Helm). | Team di piattaforma | Plugin e i loro limiti, step della pipeline, regole di governance, autenticazione e RBAC, integrazioni, sorgenti degli artefatti ammesse, descriptor_policy. |
All'avvio. |
| Configurazione di ambiente | KV di Consul (manent/<application>/<environment>) o file. |
Responsabili degli ambienti | Plugin, target con etichette, parametri del plugin, riferimenti ai segreti, strategia di rollout e di traffico, rollback, parametri degli step personalizzati. | All'avvio di ogni deploy, nello step config. |
| Registro dei tenant | Un file (tenants.yml). |
Team di piattaforma | I team, le applicazioni che ciascuno possiede con i loro tag, membri, coda e restrizioni. | All'invio (proprietario e restrizioni registrati nella richiesta), con cache. |
| Descrittore | Il repository dell'applicazione, inviato con ogni richiesta. | Team applicativo | Applicazione, ambiente, artefatto, id di idempotenza, step facoltativi, pianificazione, callback, dipendenze. |
All'invio, poi salvato con il deploy. |
Regole di fusione#
Nello step config i livelli vengono fusi nel deploy effettivo, che è ciò che ricevono i plugin.
- L'ambiente è autorevole. Ciò che definisce non può essere cambiato dal descrittore. Il descrittore può solo aggiungere ciò che manca, o ripetere un valore identico.
- I conflitti sono errori. Un parametro con due valori diversi fa fallire il deploy; nulla viene sovrascritto in silenzio.
- Alcune sezioni appartengono solo all'ambiente.
traffic(load balancer e router) viene rifiutato in un descrittore;rolloutsi può solo ripetere identico. descriptor_policylimita le aggiunte. Inmanent.ymlla piattaforma decide quali parametri dei plugin, riferimenti ai segreti, parametri degli step personalizzati e target può aggiungere un descrittore. Una policy tipica di produzione non ammette comandi né target.- Il tenant restringe, non aggiunge. Il proprietario dell'applicazione può limitare riferimenti ai segreti, sorgenti degli artefatti e host dei callback dei suoi deploy; non aggiunge mai parametri né target.
| Campo | Ambiente | Descrittore |
|---|---|---|
plugin |
Li definisce. | Può ripeterli. |
targets |
Li definisce. | Può ometterli o ripeterli; può aggiungerne solo se descriptor_policy.targets lo consente. |
params |
Li definisce. | Può aggiungere le chiavi ammesse da descriptor_policy.params. |
secrets |
Dichiara nome → riferimento. | Può aggiungere segreti il cui riferimento corrisponde a descriptor_policy.secret_refs. |
rollback |
Può imporlo. | Può attivarlo entro la policy del tipo di artefatto; non può disattivare ciò che l'ambiente impone. |
rollout |
Definisce la strategia. | Può solo ripeterla identica. |
traffic |
Definisce pool e router. | Non ammesso. |
La tabella completa è in Configurazione di ambiente.
Un esempio sui tre livelli#
plugins:
remote-copy:
artifact_types: [application]
descriptor_policy:
params:
remote-copy: [verify_checksum] # niente comandi, niente directory
secret_refs: ["vault:secret/data/{application}/*"]
targets: false
artifacts:
allow_unlisted: false
sources:
- prefix: https://nexus.example.com/repository/releases/
plugin: remote-copy
targets:
- {host: web-1.prod.internal, user: deploy, labels: {az: eu-1a}}
- {host: web-2.prod.internal, user: deploy, labels: {az: eu-1b}}
params:
dest_dir: /opt/shop
layout: releases
ssh_key_secret: deploy-key
prepare_command: 'tar -xzf "$MANENT_ARTIFACT" -C "$MANENT_RELEASE_DIR"'
post_command: "sudo systemctl restart shop"
secrets:
- {name: deploy-key, ref: "vault:secret/data/shop/prod#ssh_key"}
rollback:
enabled: true
Il team applicativo non vede mai host, chiavi o comandi; i responsabili degli ambienti non toccano la cadenza dei rilasci; la piattaforma decide cosa può cambiare ciascuno.
Quando viene letto ogni livello#
Ciò che un deploy usa viene fissato in momenti precisi, così un deploy ripreso dopo un crash si comporta esattamente come quello partito.
| Cosa | Fissato quando | Conseguenza |
|---|---|---|
| Piano (step e loro ordine) | All'invio. | Cambiare pipeline.steps non altera i deploy già accodati. |
| Decisione di governance, destinazioni delle notifiche, regola di change | All'invio. | Una regola più severa arrivata dopo non invalida un'approvazione già data (salvo governance.start: strict). |
| Configurazione di ambiente | Nello step config, all'avvio dell'esecuzione. |
Un deploy pianificato usa la configurazione valida quando gira; un deploy ripreso riusa quella già letta. |
| Valori dei segreti | Al momento dell'uso, mai salvati. | Ruotare un segreto in Vault ha effetto al successivo utilizzo, anche dentro un deploy in corso. |
manent.yml |
All'avvio del processo. | La maggior parte delle modifiche richiede un riavvio. Eccezioni: auth.tokens_file, le policy Rego e i freeze a runtime, ricaricati a caldo. |
Dove mettere cosa#
| Vuoi | Modifica |
|---|---|
| Aggiungere un server alla produzione | La configurazione di ambiente (targets). |
| Rilasciare una nuova versione | Il descrittore (artifact.version, artifact.source), di solito dalla CI con --version e --source. |
| Attivare i test post-deploy per un solo rilascio | Il descrittore (steps: {post-test: true}). |
| Rendere obbligatorio il rollback in produzione | La configurazione di ambiente (rollback.enabled: true). |
| Vietare i comandi shell provenienti dai descrittori | manent.yml (descriptor_policy.params). |
| Richiedere due approvazioni in produzione | manent.yml (governance.rules) o una policy Rego. |
| Ruotare la chiave SSH | Solo il gestore dei segreti: i riferimenti non cambiano. |