基于环境变量的jinja2模板化。
j2tmpl的Python项目详细描述
Jinja 2命令行模板呈现程序
转换环境变量的jinja2命令行呈现程序 进入上下文中的对象。例如:
DATABASE_MAIN_URI=mysql:3306
DATABASE_MAIN_USERNAME=app
DATABASE_CACHE_URI=redis:6379
DATABASE_CACHE_USERNAME=app
变成:
{"database":{"main":{"uri":"mysql:3306","username":"app"},"cache":{"uri":"redis:6379","username":"app"}}}
这允许使用迭代和其他方法 动态模板。
当thereareseveral命令行 Jinja2模板渲染器,它们都共享一个属性 试图解决。
其中支持环境变量(通常是Docker的环境变量) 这些环境变量显示在模板verbatum中。 也就是说,在这种环境下:
DATABASE_MAIN_URI=mysql:3306
DATABASE_MAIN_USERNAME=app
DATABASE_CACHE_URI=redis:6379
DATABASE_CACHE_USERNAME=app
模板必须按以下方式使用:
databases: { main: { uri: {{DATABASE_MAIN_URI}} username: {{DATABASE_MAIN_USERNAME}} cache: { uri: {{DATABASE_CACHE_URI}} username {{DATABASE_CACHE_USERNAME}}
不过,假设您不一定知道有多少数据库 你的集装箱会有吗?这种结构使得 必须根据不同情况定义n内容的实例 在容器部署或基础映像上。
databases: {{%forname,definitionindatabases.items()%}{{name}}: { uri: {{definition.uri}}, username: {{definition.username}} },{%endfor%}
处理碰撞
环境变量有时会引起兴趣
构建树结构时出现的问题。一个ValueError
将
如果变量定义了两次,则抛出。但是,下面
是一组有效的环境变量:
AUTH_LDAP=true
AUTH_LDAP_USERNAME=app
在模板上下文中,{{ auth.ldap }}
必须是
username
是其中的一个键。在这种情况下,
AUTH_LDAP
将下移到一个特殊的_
键中。两个
变量将是:
{{auth.ldap._}}=true{{auth.ldap.username}}=app
要使其正常工作,几乎所有环境键中的_
都将被删除。
所以,AUTH__LDAP_
仍然被翻译成{{ auth.ldap }}
。唯一的
异常是带有下划线的变量。在这种情况下,一个'uu'
添加到具有该值的上下文的根。请注意
将创建此单下划线值:
_
___
____________________
如果存在多个单独下标的环境变量,则为{{CD1}} 被扔了。
安装
这可以通过两种方式安装:
pip3 install j2tmpl
- 下载预构建的二进制文件。
注意,预构建的二进制文件包括整个python解释器 所以它们可以像 confd。
用法
这可以通过两种方式使用:处理单个文件或整个目录。
当目录路径作为模板文件传递时,
j2tmpl
将扫描目录中的任何文件
与template-extensions
匹配的扩展名,参数
默认为tmpl,jinja,jinja2,j2,jnj
。
Note that it will still output to stdout unless
-o
is used. If it is, then make sure it's a directory as well. If the target directory doesn't exist, it will be created.
除了与该模式匹配的文件外,任何目录
与该模式匹配并以.d
结尾的
已扫描模板片段。模板文件也是
作为.d
目录中以这些扩展名结尾的文件
全部连接在一起并呈现为一个输出文件
与不带模板的目录名匹配的
扩展名,不带.d
。
例如,给定以下目录结构:
foo.conf.jinja.d/
foo-1.jinja
foo-2.jinja
bar.conf.jinja.d/
bar-1.jinja
bar-2.jinja
foo.conf.jinja
baz.conf.jinja
输出目录将包含以下内容:
bar.conf
baz.conf
foo.conf
内置过滤器和扩展
金贾的do 和loopcontrols 默认情况下启用扩展 trim_blocks 以及lstrip_blocks
最后,以下附加过滤器是可用的:
readfile(str):
读入由str
表示的文件内容。尤其是
对容器机密有用。
boolean(str):
将参数转换为布尔值。与
“true”、“yes”和“1”将返回True
。其他一切都是假的。
b64encode(str): 基64对值进行编码。
b64解码(str): 基64解码该值。
为什么不确认?
说到confd,为什么不直接用它呢?虽然confd很棒,但它可以 有点太啰嗦了。必须定义一系列配置文件 所有为每一个键确认的键都可以涂抹叮叮声。肯定的 项目,这可能是有道理的,但我经常想 将一些环境变量放入配置文件中 复杂程度很小。
confd是一个5.5MB左右的二进制文件,它仍然小于15MB。有可能 如何使这个更小,我想探索。