Linux 工具命令(04): envsubst2 一个比 envsubst 更省心的配置渲染工具

如果在 公众号 文章发现状态为 已更新, 建议点击 查看原文 查看最新内容。

状态: 未更新

原文链接: https://typonotes.com/posts/2023/02/22/envsubst2-usage/

对于配置文件的渲染, 通常我们会使用 envsubst。 这个工具基本上在 Linux 各个发行版上都可以通过官方源进行安装。

  1. 安装
1
2
3
4
5
# alpine
$ apk add --no-cache gettext

# ubuntu
$ apt instsall gettext
  1. 渲染
  • 默认模式, 这种模式会替换所有 变量站位符, 包括 $abc 或者 ${abc}, 如果变量不存在, 则使用 空字符串 进行替换。
  • 白名单模式, 这种模式可以指定 需要替换白名单变量。 这种模式就是的麻烦点在于 当白名单变量 太多的时候, 命令看起来就乱糟糟的。
1
2
$ envsubst < /path/2/template.txt > /path/2/target.txt
$ envsubst '${key1} ${key2}' < /path/2/template.txt > /path/2/target.txt

更多参考 Linux 工具命令(03): 使用 envsubst 渲染配置文件

为什么使用 envsubst2

使用 envsubst 进行模版渲染, 如果要保留某些 变量格式的字符串 , 就有点麻烦了。 如果你搞过 Nginx 的配置, 应该就能理解我说的是什么情况。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
server {
    listen  443;

    resolver  ${DNS_RESOLVER};  # 这里 ${DNS_RESOLVER} 需要替换
    # resolver  $DNS_RESOLVER;  # 另一个没有花括号的写法。

    location / {
        proxy_pass http://$host;  # 这里 $host 不需要替换
        proxy_set_header Host $host;
    }
}

如果是用 envsubst 替换,

  1. 白名单模式, 指定 ${DNS_RESOLVER} 替换。
  • 1. 需要替换的变量多2. 需要替换的变量随时可能变 的时候, 维护起来就会很麻烦。
  1. 或者 转义 不需要被替换的的 $ 符号。 例如 \$host.
  • 这样维护模版就会非常的麻烦。

我们的工作, 需要 更简单更通用更无脑。 不应该在这些琐碎的事情上浪费时间。

于是便又了 envsubst2

envsubst2 的使用方式

envsubst2 使用了 ${[a-zA-Z0-9_]+} 作为正则匹配的 模版。 意味着, 只有类似 ${key1} 这种带有花括号的变量才会被渲染

这样做,

  1. 兼容 envsubst 的使用使用, 迁移过来更方便。
  2. 减少认知压力, 不用在担心 $key1${key1} 这样 有没有花括号 的问题了。

默认情况下, envsubst2 只会读取 存在环境变量 进行替换。 如果 变量存在, 且值为空 也会替换。

注意: 变量 不存在值为空 是两种不同的状态。

$ envsubst2 -h
version: v0.1.8+sha.5acb37b-devel

Usage:
  envsubst2 [flags]

Flags:
      --force-replace   replace all the placeholders, even if their value is empty (default true)
  -h, --help            help for envsubst2
      --input string    input file
      --output string   output file, os.Stdout if empty.

当前版本, 支持以上 3 个参数

  1. --input: 输入文件(模版文件)。

  2. --outpu: 输出文件, 内容保存的地方。 如果没有指定, 则为 屏幕标准输出

  3. --force-replace: 强制替换所有变量, 即使变量值为空 或者 没有被设置

  4. 默认 替换所有 ${key1} , 不论其值是否为空。

  • 但是可以通过开关 --force-update=false 关闭。 当关闭状态时, ${key1} 值为空时 不替换 , 即在文件中保留字面值。

Demo 案例

模版

My home path is ${HOME}.
My user is ${USER}.

This variables doesn't exist: ${DONT_EXIST}
This variables is empty: ${EMPTY}

渲染

1
$ EMPTY="" ./envsubst2 --input template.txt --force-replace=false

结果

My home path is /Users/devops.
My user is devops.

This variables doesn't exist: ${DONT_EXIST}
This variables is empty: 

源码

在 Github 上: https://github.com/tangx/envsubst2

其实没什么, 就是一个正则匹配。