2013-08-22 82 views
0

我剛剛開始部署一個我已經開發到Openshift的Django應用程序。我已經創建了應用程序並創建了正確的環境(據我所知),現在我可以通過對Openshift的承諾進行更改。Django on Openshift,保持配置文件在不同環境下不同

我使用我的家用Linux桌面作爲開發機器,正如您可以想象的那樣,兩種環境下的設置是不同的 - 數據庫登錄信息,路徑等。我的問題是,我該如何在家開發,將更改推向Openshift,並且仍然最容易在兩個系統上維護我的設置?我已經知道.gitignore,但我的理解是,只有當您首次提交到存儲庫時才起作用。如果我想稍後開始忽略其他文件,我可以看到變得難以維護。

將settings.py中的值替換爲在不同環境中保存不同值的環境變量會更好嗎?就像在我的本地機器上定義$ OPENSHIFT_HOME_DIR一樣?這似乎有點哈克。

我應該如何解決這個問題?我有興趣聽到任何在Openshift或其他具有類似環境的系統上執行此操作的人的消息。

回答

0

我有這個問題太。我嘗試了@Arsh Singh的說法,爲Opensift創建基地,開發和製作文件並將DJANGO_SETTINGS_MODULE設置爲settings.production。 但是,我因爲openshift無法找到設置文件而收到錯誤。

如果您只想運行您的production(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。這只是代碼。 我的另一個問題是當需要運行第三個環境進行暫存時,那麼這個解決方案是不合適的。

然後,爲了再次解決問題,我使用了Frabric [1]在openshift上運行一些命令。 我的解決方案是在我的django應用程序中創建一個名爲config的文件夾。 在此文件夾中,創建三個文件,local_env.txt2staging_env.txt2production_env.txt2。 在這個文件中,我有一個JSON字典,像這樣:

{ 
    "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 

希望有所幫助。

相關問題