如何在 Varnish 配置中注入环境变量
Posted
技术标签:
【中文标题】如何在 Varnish 配置中注入环境变量【英文标题】:How to inject environment variables in Varnish configuration 【发布时间】:2014-01-30 03:25:03 【问题描述】:我有 2 个环境变量:
echo $FRONT1_PORT_8080_TCP_ADDR # 172.17.1.80
echo $FRONT2_PORT_8081_TCP_ADDR # 172.17.1.77
我想将它们注入到我的 default.vcl 中,例如:
backend front1
.host = $FRONT1_PORT_8080_TCP_ADDR;
但我在 $
字符上遇到语法错误。
我也尝试过使用 user variables,但我无法在 vcl_recv
之外定义它们。
如何在 VCL 中检索我的 2 个值?
【问题讨论】:
有人试过github.com/carlosabalde/libvmod-cfg 吗?它有助于访问 ENV 变量。 【参考方案1】:我已经成功解析了我的 vcl
backend front1
.host = $FRONT1_PORT_8080_TCP_ADDR;
使用脚本:
envs=`printenv`
for env in $envs
do
IFS== read name value <<< "$env"
sed -i "s|\$$name|$value|g" /etc/varnish/default.vcl
done
【讨论】:
【参考方案2】:注意:它不适用于后端配置,但可以在其他地方使用。显然后端需要常量字符串,如果你尝试,你会得到Expected CSTR got 'std.fileread'
。
您可以使用fileread
function of the std
module,并为您的每个环境变量创建一个文件。
在运行 varnishd 之前,你可以运行:
mkdir -p /env; \
env | while read envline; do \
k=$envline%%=*; \
v=$envline#*=; \
echo -n "$v" >"/env/$k"; \
done
然后,在您的清漆配置中:
import std;
...
backend front1
.host = std.fileread("/env/FRONT1_PORT_8080_TCP_ADDR");
.port = std.fileread("/env/FRONT1_PORT_8080_TCP_PORT");
我还没有测试过。另外,我不知道给后端的端口配置一个字符串是否可行。在这种情况下,转换为整数应该可以:
.port = std.integer(std.fileread("/env/FRONT1_PORT_8080_TCP_PORT"), 0);
【讨论】:
【参考方案3】:您可以使用 echo 来评估字符串。
通常你可以这样做:
VAR=test # Define variables
echo "my $VAR string" # Eval string
但是,如果文件中有文本,则可以使用“eval”来获得相同的行为:
VAR=test # Define variables
eval echo $(cat file.vcl) # Eval string from the given file
【讨论】:
【参考方案4】:现在你可以使用VMOD Varnish标准模块(std)来获取VCL中的环境变量,例如:
set req.backend_hint = app.backend(std.getenv("VARNISH_BACKEND_HOSTNAME"));
查看文档:https://varnish-cache.org/docs/trunk/reference/vmod_std.html#std-getenv
【讨论】:
【参考方案5】:听起来像是envsubst
的工作。
只需在您的配置 $MY_VAR 中使用标准 env var 语法和 ...
envsubst < myconfig.tmpl > myconfig.vcl
您可以在 Ubuntu 中使用 apt get install gettext
进行安装。
【讨论】:
以上是关于如何在 Varnish 配置中注入环境变量的主要内容,如果未能解决你的问题,请参考以下文章
JDBC(本质,配置环境变量,JDBC编程六步,类加载注册,sql注入,事务问题,封装工具类,悲观锁,乐观锁)