【问题标题】:How to inject environment variables in Varnish configuration如何在 Varnish 配置中注入环境变量
【发布时间】: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 个值?
【问题讨论】:
标签:
configuration
environment-variables
varnish
varnish-vcl
【解决方案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
【解决方案5】:
听起来像是envsubst 的工作。
只需在您的配置 $MY_VAR 中使用标准 env var 语法和 ...
envsubst < myconfig.tmpl > myconfig.vcl
您可以在 Ubuntu 中使用 apt get install gettext 进行安装。