Consente di separare questi due problemi distinti: 1) gestire le impostazioni specifiche del sito e 2) gestire i segreti.
1) le impostazioni specifiche del sito
Versione tutto (tranne i segreti), impostazioni anche specifiche per sviluppatori.
Con Django e molti altri software, il file di configurazione è un pezzo di codice eseguibile, che semplifica il caricamento di impostazioni di configurazione comuni e l'override di tutto ciò che deve essere sovrascritto. In questo modo puoi rimanere DRY.
# settings_prod.py
from settings_base import *
... # override whatever needs to be overridden for production environment
Così ora avete settings_base.py
, settings_prod.py
, settings_dev.py
, settings_developper_john.py
, ecc Come si fa a dire Django quale usare?
La distribuzione del file delle impostazioni appropriato sul server è un'attività per lo script di distribuzione, credo. La script di distribuzione saprebbe che si sta distribuendo per ospitare prod17 che è un server di produzione, in modo che avrebbe generato al volo un file settings.py
che sarebbe simile a questa:
# settings.py (generated by deployment script)
from settings_prod import *
Un'altra soluzione è quella di avere quella logica in un generico settings.py
: si potrebbe leggere una variabile d'ambiente o ottenere il nome host (o applicare qualsiasi altra logica) e caricare il modulo impostazioni appropriate:
# settings.py
import os
if os.environ["MY_APP_ENV"] == "prod":
from settings_prod import *
elif ...
la mia soluzione preferita per le impostazioni di Django è described here.
Per qualsiasi altro software che non sia flessibile con il suo file di configurazione, l'opzione migliore è probabilmente avere lo script di distribuzione generare il file di configurazione, possibilmente utilizzando i modelli (strumenti come Chef o Puppet rendono questo facile). Ciò consente di rimanere asciutti: ad esempio, un software richiede un file flat config.ini
, quindi lo script di distribuzione può leggere un file common.ini
e un file production.ini
, unirli in modo appropriato e produrre un config.ini
pronto per essere distribuito alla produzione.
Gestione dei segreti
Prima di tutto, non conservare le password in un sistema di controllo versione. :-)
Una soluzione per la gestione dei segreti è che lo script di distribuzione trasferisca i segreti. Ad esempio, bob è responsabile della distribuzione di applicazioni Web, conosce la password del database, quindi quando lancia lo script di distribuzione, viene richiesto per la password del database e lo script lo trasferisce al server. Oppure lo script di distribuzione legge semplicemente la password in un file sul computer di Bob e la trasferisce. Questa è probabilmente la soluzione più comune. Va bene nella maggior parte dei casi.
secrets
deployer ================> server
Se avete bisogno di automatizzare la creazione di macchine virtuali e non si desidera che il-deployer automatizzato per conoscere un segreto, allora si potrebbe includere i segreti del VM-immagine. Ovviamente qualcuno deve includere i segreti nell'immagine della VM in primo luogo.
VM image including secrets
human deployer -------------------------------+
|
|
image_name v
automated deployer ==============> Cloud Service ========> VM including secrets
Il problema con questa soluzione è che è necessario generare una nuova immagine VM ogni volta che vengono apportate modifiche segrete. Se vuoi evitarlo, potresti volere un "server segreto": un server per gestire i segreti di ogni altro server. Quindi l'unico segreto che è necessario includere nell'immagine della VM è il segreto di boot necessario per connettersi al "server segreto".
step 1:
VM image including bootstrap secret
human deployer -----------------------------------+
|
|
image_name v
automated deployer ==================> Cloud Service ========> VM including secrets
step 2:
bootstrap secret
==================>
VM Secret Server
<==================
secrets
Ad esempio, il server segreto potrebbe essere un server Chef, i segreti potrebbero essere conservare in sacchetti di dati crittografati, e il segreto di bootstrap sarebbe la chiave per decifrare queste borse.
Vedere anche questa buona risposta qui che utilizza le credenziali di accesso correnti per differenziare le impostazioni specifiche (ma mantenerle tutte in controllo di versione): http://stackoverflow.com/questions/6009/how-do-you-deal- con-configuration-files-in-source-control/65226 # 65226 –