Позволяет разделить эти две различные проблемы: 1) управление настройками для сайта и 2) управление секретами.
1) сайт-специфические настройки
версии всё (кроме секретов), настройки даже для разработчиков конкретного.
С Django и множеством других программных файлов конфигурационный файл представляет собой часть исполняемого кода, что упрощает загрузку общих параметров конфигурации и отменяет все, что необходимо переопределить. Таким образом, вы можете остановиться DRY.
# settings_prod.py
from settings_base import *
... # override whatever needs to be overridden for production environment
Так что теперь вы settings_base.py
, settings_prod.py
, settings_dev.py
, settings_developper_john.py
и т.д. Как сказать Django, какой использовать?
Развертывание соответствующего файла настроек на сервере является задачей для сценария развертывания, я считаю. Сценарий развертывания будет знать, что вы устанавливаете для размещения prod17 который является сервером продукции, поэтому он будет генерировать на лету в settings.py
файл, который будет выглядеть следующим образом:
# settings.py (generated by deployment script)
from settings_prod import *
Другим решением является, что логика в общий settings.py
: он может прочитать переменное окружение или получить имя хоста (или применить любую другую логику) и загрузить соответствующий модуль настройки:
# settings.py
import os
if os.environ["MY_APP_ENV"] == "prod":
from settings_prod import *
elif ...
Моего любимым решением для настройки Django является described here.
Для любого другого программного обеспечения, которое не так гибко с его конфигурационным файлом, лучшим вариантом является, вероятно, создание сценария развертывания файла конфигурации, возможно, с использованием шаблонов (такие инструменты, как Chef или Puppet, делают это проще). Это позволяет вам оставаться сухим: например, скажем, для программного обеспечения требуется файл config.ini
, тогда сценарий развертывания может читать файл common.ini
и production.ini
, смешать их вместе и создать config.ini
, готовый к развертыванию на производство.
Управление секреты
Прежде всего, не хранить пароли в системе управления версиями. :-)
Одно из решений для управления секретами заключается в том, чтобы сценарий развертывания передавал секреты. Например, bob отвечает за развертывание веб-приложений, он знает пароль для базы данных, поэтому, когда он запускает сценарий развертывания, ему предлагается ввести пароль базы данных, а сценарий передает его на сервер. Или сценарий развертывания просто считывает пароль в файле на компьютере bob и передает его. Это, вероятно, наиболее распространенное решение. Это нормально в большинстве случаев.
secrets
deployer ================> server
Если вам нужно автоматизировать создание виртуальных машин, и вы не хотите автоматизирован-Установщик знать любой секрет, то вы могли бы включать секреты в VM-изображения. Конечно, во-первых, кто-то должен включать секреты в образ VM.
VM image including secrets
human deployer -------------------------------+
|
|
image_name v
automated deployer ==============> Cloud Service ========> VM including secrets
Проблема с этим решением заключается в том, что вам нужно сгенерировать новый образ виртуальной машины каждый раз, когда какие-либо секретные изменения. Если вы хотите этого избежать, тогда вам может понадобиться «секретный сервер»: сервер для управления секретами каждого другого сервера. Тогда единственный секрет, который вам нужно включить в образ VM, - это секрет бутстрапа, необходимый для подключения к «секретному серверу».
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
Например, секретный сервер может быть сервером Chef, секреты могут быть хранить в шифрованных пакетах данных, и бутстраповская секрет будет ключ для расшифровки этих пакетов.
См. Также этот хороший ответ, в котором используются текущие учетные данные для входа в систему, чтобы различать конкретные параметры (но все еще есть все в управлении версиями): http://stackoverflow.com/questions/6009/how-do-you-deal- с-configuration-files-in-source-control/65226 # 65226 –