Edited at

FabricとCuisineとJinja2を組み合わせてみた

More than 3 years have passed since last update.

メモなので雑です。

こういうこともできたよということで


やりたいこと

複数のDjangoアプリを開発をしていて、FabricとCuisineを使ってデプロイをする。

githubに載せたくないsettings.py内の記述や環境(development, staging, production)によって異なる変数があるので、それらをローカルのファイルからリモートサーバーのファイルに反映させたい


コード


テンプレートファイル


project_root/settings/production.py


# 共通の設定項目は全環境でproject_root/settings/common.pyで共通に持たせてます。

from sample_app.settings.common import *

SECRET_KEY = '{{ secret_key }}'

DEBUG = False

ALLOWED_HOSTS = ['127.0.0.1']

DATABASES = {
'default': {
'ENGINE': '{{ databases.default.engine }}',
'NAME': '{{ databases.default.name }}',
'USER': '{{ databases.default.user }}',
'PASSWORD': '{{ databases.default.password }}',
'HOST': '{{ databases.default.host }}',
'PORT': {{ databases.default.port }},
}
}



yamlファイル

値は適当にしてます


secrets.yml

django:

settings:
production:
secret_key: ''
databases:
default:
engine: django.db.backends.mysql
name: sample_app
user: root
password: ''
host: 127.0.0.1
port: 3306


ファイルをアップロードする処理

アップロードというよりは、リモートで指定した中身のファイルを作っているといったほうが正しいですね。

from jinja2 import Environment, FileSystemLoader

from cuisine import file_write

secrets = yaml.load(file('secrets.yml'))
local_template_name = local_template_path.split('/')[-1]
local_template_dir = local_template_path.replace(local_template_name, '')

# 以下3行がメインの処理。変数をテンプレートに組み込んだ文字列を取得して、それを中身とするファイルをリモートサーバーに作成する。
jinja2_env = Environment(loader=FileSystemLoader(local_template_dir))
content = jinja2_env.get_template(local_template_name).render(secrets['django']['settings']['production'])
file_write(remote_path, content.encode('utf-8'))


参考

https://gist.github.com/wrunk/1317933