我在 Ec2 上使用 nginx 和 uwsgi,并且有一个构建我的服务器的厨师食谱。为了解决这个问题,在厨师中,我的角色包含未存储在应用程序存储库中的凭据。
/home/user/web/site/environment
该厨师根据角色创建的文件。
MYSQL_DATABASE=databasename
MYSQL_USER=databaseuser
MYSQL_PASSWORD=databasepassword
MYSQL_HOST=databaseip
MYSQL_PORT=3306
REDIS_HOST=redishost
REDIS_PASSWORD=redispassword
REDIS_PORT=6379
REDIS_DB=0
MEDIA_ROOT=/home/user/web/site/media
STATIC_ROOT=/home/user/web/site/static
在我的生产/登台/等设置文件的开头,我有以下块来读取环境文件
import os, re
try:
dirname = os.path.dirname(os.path.abspath(__file__))
# my environment file is always in the same place relative to my project's settings file
env_path = os.path.normpath(os.path.join(dirname, '..', '..', '..', '..', 'environment'))
with open(env_path) as f:
content = f.read()
for line in content.splitlines():
m1 = re.match(r'\A([A-Za-z_0-9]+)=(.*)\Z', line)
if m1:
key, val = m1.group(1), m1.group(2)
m2 = re.match(r"\A'(.*)'\Z", val)
if m2:
val = m2.group(1)
m3 = re.match(r'\A"(.*)"\Z', val)
if m3:
val = re.sub(r'\\(.)', r'\1', m3.group(1))
os.environ.setdefault(key, val)
except IOError:
pass
瞧,设置在单独管理的存储库(厨师)中进行源代码控制并加载到应用程序中。这可能不是最好的方法,但它是相当安全的 b/c 权限是如何锁定在 chef repo 和目标服务器上并且易于部署的。