我刚刚开始部署我已经在Openshift上开发的Django应用程序。我已经创建了应用程序并且环境设置正确(据我所知),现在我能够git push
我对Openshift的更改。
我使用我的家用Linux桌面作为开发机器,你可以想象两种环境之间存在不同的设置 - 数据库登录信息,路径等。我的问题是,如何在家开发,将更改推送到Openshift,并且最容易在两个系统上维护我的设置?我已经了解.gitignore
但我的理解是,只有在您第一次进入存储库时才会产生影响。如果我想稍后开始忽略其他文件,我可能会发现难以维护。
将settings.py中的值替换为在不同环境中包含不同值的环境变量是否更好?就像在我的本地机器上定义$ OPENSHIFT_HOME_DIR一样?这看起来有点笨拙。
我该如何解决这个问题?我有兴趣听听任何在Openshift或类似环境的其他系统上做过此事的人。
答案 0 :(得分:0)
您应该为不同的环境制作不同的设置文件。您可以创建一个base.py文件来包含常用设置,然后将其导入dev.py和production.py并在那里定义特定于环境的设置
检查此项目的布局:https://github.com/twoscoops/django-twoscoops-project/tree/develop/project_name/project_name
答案 1 :(得分:0)
我也有这个问题。我尝试了@Arsh Singh所说的,为base,dev和production创建文件,并在Openshift上将DJANGO_SETTINGS_MODULE设置为settings.production
。
但是,我得到错误只是因为openshift无法找到设置文件。
如果只想运行生产(openshift)和dev(本地机器)版本,可以在名为pre_start_python-2.7的action_hook上将环境变量设置为openshift。
文件的路径为:.openshift/action_hooks/pre_start_python-2.7
示例:
#!/bin/bash
export DEV_MACHINE="False"
export EMAIL_HOST='smtp.example.com'
它对我有用,但它有任何问题。 首先,如果您想要更改环境变量的任何值,则应该推送提交。另一个问题是,不是一个好的做法将你的敏感设置如密码,路径放在git上。它仅适用于代码。 我遇到的另一个问题是需要为Staging运行第三个环境,那么这个解决方案并不合适。
然后,为了再次解决问题,我使用Frabric [1]在openshift上运行一些命令。
我的解决方案是在我的django应用程序上创建一个名为config的文件夹。
在此文件夹中,创建三个文件local_env.txt2
,staging_env.txt2
和production_env.txt2
。
在这个文件中,我有一个json dict,如下所示:
{
"DEV_MACHINE": "True",
"EMAIL_HOST":"smtp.gmail.com"
}
然后,为了将环境变量发送到openshift,我创建了以下代码,只读取配置文件并发送到openshift。此代码的文件名应为fabfile.py
。
"""Management utilities."""
from fabric.api import abort, env, local, settings, task, run, sudo, cd
from fabric.operations import put
import json
# DEPLOY ON OPENSHIFT
@task
def staging_site():
"""Staging config for deployment on openshift"""
env.environment_variables = "config/staging_env.txt2"
env.environment = "staging"
env.app_name = '<staging project name on openshift>' #
@task
def production_site():
"""Production config for deployment on openshift"""
env.environment_variables = "config/production_env.txt2"
env.environment = "production"
env.app_name = '<production project name on openshift>'
@task
def set_envs_openshift(args=""):
"""
Setup all evironmnt variables
Example of usage:
* fab staging_site setup_envs_openshift
if you are logged in more than one accont on openshift, use it:
* fab staging_site setup_envs_openshift:'-l <account email>'
"""
unset_envs_openshift(args)
# run locally command
str_envs = open(env.environment_variables, 'r').read()
json_envs = json.loads(str_envs)
env_list = ''
for k, v in json_envs.items():
env_list += ' %s="%s" ' % (k, v)
local("rhc env set %s -a %s %s" % (env_list, env.app_name, args))
local("rhc app-stop -a %s %s" % (env.app_name, args))
local("rhc app-start -a %s %s" % (env.app_name, args))
@task
def unset_envs_openshift(args=""):
"""
Unset all environment variables on openshift.
Example of usage:
* fab staging_site unset_envs_openshift
"""
str_envs = open(env.environment_variables, 'r').read()
json_envs = json.loads(str_envs)
keys_list = ''
for k in json_envs.keys():
keys_list += ' %s ' % k
local("rhc env unset %s -a %s %s --confirm" % \
(keys_list, env.app_name, args))
# END DEPLOY ON OPENSHIFT
然后,要部署环境变量,请运行它:
fab production_site setup_envs_openshift
希望有所帮助。