Permet de séparer ces deux problèmes distincts: 1) la gestion des paramètres spécifiques au site et 2) la gestion des secrets.
1) paramètres spécifiques au site
tout version (à l'exception des secrets), les paramètres spécifiques au même développeur. Avec Django et beaucoup d'autres logiciels, le fichier de configuration est un morceau de code exécutable, ce qui facilite le chargement des paramètres de configuration courants et remplace tout ce qui doit être surchargé. De cette façon, vous pouvez rester DRY.
# settings_prod.py
from settings_base import *
... # override whatever needs to be overridden for production environment
Alors maintenant, vous avez settings_base.py
, settings_prod.py
, settings_dev.py
, settings_developper_john.py
, etc. Comment pouvez-vous dire que l'on Django à utiliser? Le déploiement du fichier de paramètres approprié sur le serveur est une tâche pour le script de déploiement, je crois. Le script de déploiement saura que vous déployez pour héberger prod17 qui est un serveur de production, de sorte qu'il générerait à la volée un fichier settings.py
qui ressemblerait à ceci:
# settings.py (generated by deployment script)
from settings_prod import *
Une autre solution est d'avoir cette logique dans un générique settings.py
: il pourrait lire une variable d'environnement ou d'obtenir le nom d'hôte (ou appliquer toute autre logique) et charger le module de paramètres appropriés:
# settings.py
import os
if os.environ["MY_APP_ENV"] == "prod":
from settings_prod import *
elif ...
Ma solution préférée pour les paramètres Django est described here.Pour tout autre logiciel moins flexible avec son fichier de configuration, la meilleure option est probablement de faire en sorte que le script de déploiement génère le fichier de configuration, éventuellement en utilisant des modèles (des outils comme Chef ou Puppet facilitent cela). Cela vous permet de rester DRY: par exemple, un logiciel nécessite un fichier config.ini
plat, puis le script de déploiement peut lire un fichier common.ini
et un fichier production.ini
, les mélanger ensemble de manière appropriée et produire un config.ini
prêt à être déployé en production.
secrets Gestion
Tout d'abord, ne pas stocker vos mots de passe dans un système de contrôle de version. :-)
Une solution pour gérer les secrets est de faire en sorte que le script de déploiement transfère les secrets. Par exemple, Bob est responsable du déploiement des applications Web, il connaît le mot de passe de la base de données, donc quand il lance le script de déploiement, il est invité à entrer le mot de passe de la base de données et le script le transfère au serveur. Ou le script de déploiement lit simplement le mot de passe dans un fichier sur l'ordinateur de Bob et le transfère. C'est probablement la solution la plus courante. C'est bien dans la plupart des cas.
secrets
deployer ================> server
Si vous avez besoin d'automatiser la création de machines virtuelles et que vous ne voulez pas le deployer automatisé de connaître un secret, vous pouvez inclure les secrets de la VM-image. Bien sûr, quelqu'un doit inclure les secrets dans l'image VM en premier lieu. Le problème avec cette solution est que vous avez besoin de générer une nouvelle image de VM chaque fois qu'un secret change. Si vous voulez éviter cela, alors vous pourriez vouloir un "serveur secret": un serveur pour gérer les secrets de tous les autres serveurs. Ensuite, le seul secret que vous devez inclure dans l'image VM est le secret bootstrap nécessaire pour se connecter au "serveur secret".
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
Par exemple, le serveur secret, pourrait être un serveur chef, les secrets pourraient être stocker dans des sacs de données cryptées, et le secret d'amorçage serait la clé pour déchiffrer ces sacs.
Voyez aussi cette bonne réponse ici qui utilise les identifiants de connexion actuels pour différencier les paramètres spécifiques (mais les a tous dans le contrôle de version): http://stackoverflow.com/questions/6009/how-do-you-deal- avec-configuration-files-in-source-control/65226 # 65226 –