Django on Openshift,在不同环境中保持配置文件不同

时间:2013-08-22 17:08:13

标签: python django git openshift

我刚刚开始部署我已经在Openshift上开发的Django应用程序。我已经创建了应用程序并且环境设置正确(据我所知),现在我能够git push我对Openshift的更改。

我使用我的家用Linux桌面作为开发机器,你可以想象两种环境之间存在不同的设置 - 数据库登录信息,路径等。我的问题是,如何在家开发,将更改推送到Openshift,并且最容易在两个系统上维护我的设置?我已经了解.gitignore但我的理解是,只有在您第一次进入存储库时才会产生影响。如果我想稍后开始忽略其他文件,我可能会发现难以维护。

将settings.py中的值替换为在不同环境中包含不同值的环境变量是否更好?就像在我的本地机器上定义$ OPENSHIFT_HOME_DIR一样?这看起来有点笨拙。

我该如何解决这个问题?我有兴趣听听任何在Openshift或类似环境的其他系统上做过此事的人。

2 个答案:

答案 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.txt2staging_env.txt2production_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

希望有所帮助。

相关问题