Позволяет разделить эти две различные проблемы: 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 - , описанное здесь .
Для любого другого программного обеспечения, которое не является настолько гибким в своем конфигурационном файле, возможно, лучше всего, чтобы сценарий развертывания генерировал файл конфигурации, возможно, с использованием шаблонов (инструменты, такие как Chef или Puppet, делают это легко). Это позволяет вам оставаться СУХИМЫМИ: например, если для программного обеспечения требуется плоский файл config.ini
, то сценарий развертывания может прочитать файл common.ini
и production.ini
, смешать их соответствующим образом и создать config.ini
, готовый к быть развернутым к производству.
Управление секретами
Прежде всего, не храните свои пароли в системе контроля версий. : -)
Одним из решений для управления секретами является передача сценариями сценария развертывания. Например, Боб отвечает за развертывание веб-приложений, он знает пароль к базе данных, поэтому, когда он запускает сценарий развертывания, ему предлагается ввести пароль базы данных, и сценарий передает его на сервер. Или сценарий развертывания просто читает пароль в файле на компьютере Боба и передает его. Это, наверное, самое распространенное решение. Это нормально в большинстве случаев.
secrets
deployer ================> server
Если вам нужно автоматизировать создание виртуальных машин и вы не хотите, чтобы автоматизированный установщик знал какой-либо секрет, вы можете включить эти секреты в образ виртуальной машины. Конечно, кто-то должен сначала включить секреты в образ виртуальной машины.
VM image including secrets
human deployer -------------------------------+
|
|
image_name v
automated deployer ==============> Cloud Service ========> VM including secrets
Проблема этого решения заключается в том, что вам необходимо генерировать новый образ виртуальной машины каждый раз, когда происходят какие-либо секретные изменения. Если вы хотите избежать этого, то вам может потребоваться «секретный сервер»: сервер, управляющий секретами каждого другого сервера. Тогда единственный секрет, который вам нужно включить в образ виртуальной машины, - это секрет начальной загрузки, необходимый для подключения к «секретному серверу».
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, секреты могут храниться в зашифрованных пакетах данных, а секретный ключ начальной загрузки будет ключом для расшифровки этих пакетов.