メモなので雑です。
こういうこともできたよということで
やりたいこと
複数の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'))