はじめに
<バージョン>
python: 3.7.9
以下のような、jinja2テンプレートとymlを組み合わせるにはどうすればいいでしょうか?
参考記事(1つ目)のように、ymlを引数としてpythonに渡すコードは見つかったのですが、
pythonコードの中で完結しているものがなかったので作ってみました。
test.j2
var1: {{ var1 }}
var2: {{ var2 }}
test.yml
---
var1: test1
var2: test2
1. サンプルコード
コードにあるように「with open」を使えば、ymlを引数としてpythonに渡す必要が
無くなるようです。
template.py
#!/usr/bin/env python3
# coding: utf-8
import sys, yaml, jinja2
# define variable
base_dir = '/home/ec2-user/test'
j2_dir = base_dir + '/j2'
yml_dir = base_dir + '/yml'
# import j2 template
_loader = jinja2.FileSystemLoader(j2_dir, encoding='utf-8')
_environment = jinja2.Environment(loader=_loader)
_template = _environment.get_template("test.j2")
# import yaml and render
with open(yml_dir + '/' + 'test.yml') as import_yml:
sys.stdout.write(_template.render(yaml.load(import_yml)))
2. ディレクトリ構成
ファイルは以下の構成にしてください。
.
├── template.py
├── j2
│ └── test.j2
└── yml
└── test.yml
3. 実行結果
想定通り、jinja2を使ってymlとtemplateを組み合わせることが出来ました。
出力
[ec2-user@ip-<ip-addr> test]$ python template.py
var1: test1
var2: test2
参考資料
PythonでYAMLを読み込んでJinja2で整形する
【PyYAML VS ruamel.yaml】PythonからYAMLファイルを触ってみた