0

私はGunicornで動作するDjangoアプリを持っていて、Ansibleによって管理されているSupervisorDによって管理されています。スーパーバイザプログラムにシェル環境変数を渡すには?

環境から変数DJANGO_SECRET_KEYを読み込むようにしたいのですが、設定ファイルやVCSに秘密鍵を保存したくないからです。そのために私は私のsettings.pyにおける環境からキーをお読みください。

Supervisor docsを見て
SECRET_KEY = os.environ['DJANGO_SECRET_KEY'] 

それは言う:サブプロセスは「開始するために使用するシェルの環境変数を継承します

をスーパーバイザー "以外はここでは上書きされます。 「サブプロセス環境」を参照してください。

は、ここに私のsupervisor.confです:

[program:gunicorn] 
command=/.../.virtualenvs/homepage/bin/gunicorn homepage.wsgi -w 1 --bind localhost:8001 --pid /tmp/gunicorn.pid 
directory=/.../http/homepage 

私は、変数を設定し、シェルからGunicornコマンドを実行すると、それがうまく起動:

$ DJANGO_SECRET_KEY=XXX /.../.virtualenvs/homepage/bin/gunicorn homepage.wsgi -w 1 --bind localhost:8001 --pid /tmp/gunicorn.pid 

しかし私は、変数を設定するとシェルとスーパーバイザサービスを再起動します。私のアプリが見つからないというエラーに関するエラーで起動できません。

$ DJANGO_SECRET_KEY=XXX supervisorctl restart gunicorn 
gunicorn: ERROR (not running) 
gunicorn: ERROR (spawn error) 

スーパーバイザーのエラーログを見て:

File "/.../http/homepage/homepage/settings.py", line 21, in <module> 
    SECRET_KEY = os.environ['DJANGO_SECRET_KEY'] 
    File "/.../.virtualenvs/homepage/lib/python2.7/UserDict.py", line 40, in __getitem__ 
    raise KeyError(key) 
KeyError: 'DJANGO_SECRET_KEY' 
[2017-08-27 08:22:09 +0000] [19353] [INFO] Worker exiting (pid: 19353) 
[2017-08-27 08:22:09 +0000] [19349] [INFO] Shutting down: Master 
[2017-08-27 08:22:09 +0000] [19349] [INFO] Reason: Worker failed to boot. 

私も上司サービスを再起動しようとしたが、同じエラーが発生します。

$ DJANGO_SECRET_KEY=XXX systemctl restart supervisor 
... 
INFO exited: gunicorn (exit status 3; not expected) 

私の質問は、私はスーパーバイザーが「合格」に作るのですかどのようです環境変数を子プロセスに割り当てる

+1

これは完全に間違った方法です。スーパーバイザーはユーザーIDで実行されません。スーパバイザ設定で変数を設定する必要があります。 –

+0

@DanielRoseman私はスーパーバイザー設定をVCSに持っているので、自分の秘密鍵を入れることはできません。 –

+1

'DJANGO_SECRET_KEY'環境変数を読み込むのは監督者のconfとは関係ありません。どのようにしているのか分かりませんが、 'os.environ.get( 'DJANGO_SECRET_KEY')'を使ってdjango設定ファイルに値を割り当てることができます。 'django-environ'のようなパッケージを使うこともできます。 – demonno

答えて

0

このような実行可能ファイルを作成し、手動で起動してください。 つまり、以下のファイルとコピースクリプトを作成してください/home/user/start_django.sh

を入力し、あなたのケースに合わせて調整する必要があります。また、それに応じてアクセス権を調整する必要があるかもしれません。

#!/bin/bash 

DJANGODIR=/.../.../.. 
ENVBIN=/.../.virtualenvs/homepage/bin/bin 

# Activate the virtual environment 
cd $DJANGODIR 
source $ENVBIN/activate 

DJANGO_SECRET_KEY=XXX 
#define other env variables if you need 

# Start your Django 
exec gunicorn homepage.wsgi -w 1 --bind localhost:8001 --pid /tmp/gunicorn.pid 

手動で起動する場合は、conf内でこのファイルを使用してください。役に立つかもしれません

[program:django_project] 
command = /home/user/start_django.sh 
user = {your user} 
stdout_logfile = /var/log/django.log 
redirect_stderr = true 
# you can also try to define enviroment variables in this conf 
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8,DJANGO_SECRET_KEY=XXX 

参照、

+0

ええと、 'start_django.sh'をどうすれば管理できますか?私はそれが秘密鍵を含んでいるのでバージョンコントロールに入れることができません。秘密鍵を 'settings.py'や' supervisor.conf'に簡単に入れることもできますが、問題はこれらのファイルもバージョン管理下にあることです。 –

+0

私は、外部ファイル(バージョン管理によって追跡されていない)からenv変数をエクスポートする提案されたbashスクリプトに行を追加することは可能だと思います。しかし、私は個人的に '.jvango-environ'を使いたいと思います。これは' .env'ファイルからすべての変数を読み込むように設定できます。 – demonno

0

OKは自分自身をそれを考え出しました。この種のジョブ(暗号化キー)にはVaultという機能があります。

私はアシスタントのhost_varsにアーチ型の秘密鍵を追加しました。 Vault: single encrypted variableInventory: Splitting out host and group specific dataを参照してください。

私は、サーバーへのansibleボールトからキーファイルをコピーするために私ansible脚本にタスクを追加しました:

- name: copy django secret key to server 
    copy: content="{{ django_secret_key }}" dest=/.../http/homepage/deploy/django_secret_key.txt mode=0600 

をそしてDjangoはそのファイルから秘密を読んで作っ:

with open(os.path.join(BASE_DIR, 'deploy', 'django_secret_key.txt')) as secret_key_file: 
    SECRET_KEY = secret_key_file.read().strip() 

誰かがより簡単で優れたソリューションを持っている場合は、投稿してください。私はそれを答えとして受け入れます。

関連する問題