やりたいこと
インフラエンジニアは、環境間で値だけが異なる設定ファイルをメンテナンスすることが多い。
そんなことを繰り返していると、次のようなことを考えるようになる。
- 別ファイルに用意した設定値を、いい感じで設定ファイルに反映したい
今回は Python の jinja2 を使って、YAML の設定値を JSON に埋め込む方法を紹介したい。
(裏の)やりたいこと
Python 系の記事を書くと、いいねがもらえるらしいので、本当かどうか確かめたい。
yaml を jinja2 に流し込むサンプルコード
import sys, yaml, jinja2
_loader = jinja2.FileSystemLoader("./", encoding='utf-8')
_environment = jinja2.Environment(loader=_loader)
_template = _environment.get_template(sys.argv[1])
sys.stdout.write(_template.render(yaml.load(sys.stdin)))
本コードは、YAML の値を標準出力から受け取り、第一引数で指定されたテンプレートファイルの中に埋め込んで出力する処理を行っている。
あとで利用するので、yaml_jinja2.py のファイル名で保存しておくこと。
テキストの中に設定値を埋め込むサンプルスクリプト
cat > param.yml <<'EOF'
---
hoge: HOGE
hage: HAGE
...
EOF
cat > template.j2 <<'EOF'
{{ hoge }} は、{{ hage }} だ。
EOF
cat param.yml \
| python yaml_jinja2.py template.j2
rm param.yml template.j2
実行すると以下の出力を得る。
HOGE は、HAGE だ。
JSON の中に設定を埋め込むサンプルスクリプト
cat > param.yml <<'EOF'
---
hoge: HOGE
hage: HAGE
...
EOF
cat > template.j2 <<'EOF'
{
"hoge": {{ hoge|tojson }}
"hage": {{ hage|tojson }}
}
EOF
cat param.yml \
| python yaml_jinja2.py template.j2
rm param.yml template.j2
実行すると以下の出力を得る。
ポイントは、テンプレートの中に記載している tojson というフィルターである。これを入れないと、いい感じには変換ができないので注意してほしい。
{
"hoge": "HOGE"
"hage": "HAGE"
}
今後にむけて
反響がよければ、配列の展開も説明する。
あと、出力の文言も見直すかを要検討。