跳转到主要内容

使用shell环境变量在命令行上渲染jinja2模板

项目描述

envtpl

使用shell环境变量在命令行上渲染jinja2模板

安装

pip install envtpl

如何使用

假设您有一个名为 whatever.conf 的配置文件,其外观如下

foo = 123
bar = "abc"

您可以使用envtpl通过创建一个名为 whatever.conf.tpl 的文件来从命令行设置 foobar

foo = {{ FOO }}
bar = "{{ BAR }}"

如果您运行

FOO=123 BAR=abc envtpl < whatever.conf.tpl > whatever.conf

您将得到原始的 whatever.conf。

您还可以指定默认值

foo = {{ FOO | default(123) }}
bar = "{{ BAR | default("abc") }}"

运行

FOO=456 envtpl < whatever.conf.tpl > whatever.conf

将生成

foo = 456
bar = "abc"

这是所有标准的 Jinja2 语法,因此您可以进行如下操作

{% if BAZ is defined %}
foo = 123
{% else %}
foo = 456
{% endif %}
bar = "abc"

如果环境变量缺失,envtpl将引发错误

$ echo '{{ FOO }} {{ BAR }}' | FOO=123 envtpl
Error: 'BAR' is undefined

您可以通过传递 --allow-missing 标志将此行为更改为插入空字符串。

除了从stdin读取到stdout写入外,您还可以通过可选的位置参数传递输入文件名,并使用 --output-file-o)参数设置输出文件名。

envtpl -o whatever.conf  whatever.conf.tpl

作为便利,如果您没有指定输出文件名且输入文件名以 .tpl 结尾,输出文件名将是输入文件名去掉 .tpl 扩展名,即

envtpl whatever.conf.tpl
# is equivalent to
envtpl -o whatever.conf whatever.conf.tpl

默认情况下,envtpl将 删除 输入模板文件。您可以通过传递 --keep-template 标志保留它。

存在一个特殊的 环境(prefix='') 函数,你可以将其用作一种通配符变量。如果你有 hello.tpl

hello = {{ FOO }}
{% for key, value in environment('MY_') %}{{ key }} = {{ value }}
{% endfor %}

并使用以下方式编译它

FOO=world MY_baz=qux MY_foo=bar envtpl hello.tpl

最终你会得到

hello = world
baz = qux
foo = bar

这有什么用呢?

我在 Docker 镜像中大量使用这个脚本。通常,我会让 CMD 执行一些文件,比如 /bin/start_container,该文件通过在启动主进程之前将环境变量插入配置文件来设置容器的运行时配置。一个 Redis 的例子可能如下所示

#!/bin/bash
# start_container

envtpl /etc/redis.conf.tpl

redis-server

这是我优化的用例,这就是为什么 envtpl 默认会删除原始模板文件。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

envtpl-0.7.2.tar.gz (4.8 kB 查看哈希值)

上传时间

构建分布

envtpl-0.7.2-py3-none-any.whl (4.7 kB 查看哈希值)

上传时间 Python 3

由以下组织支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面