如何在Varnish配置中注入环境变量

时间:2014-01-10 23:35:15

标签: configuration environment-variables varnish varnish-vcl

我有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;
}

但我在$ char。

上遇到语法错误

我也尝试使用user variables,但我无法在vcl_recv之外定义它们。

如何在VCL中检索我的2个值?

5 个答案:

答案 0 :(得分:8)

我设法解析了我的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

答案 1 :(得分: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);

答案 2 :(得分:2)

您可以使用echo来评估字符串。

通常你可以这样做:

VAR=test # Define variables

echo "my $VAR string" # Eval string

但是,如果你在文件中有文字,你可以使用&#34; eval&#34;具有相同的行为:

VAR=test # Define variables

eval echo $(cat file.vcl) # Eval string from the given file

答案 3 :(得分:1)

听起来像envsubst的工作。

只需在配置$ MY_VAR和...中使用标准env var语法...

envsubst < myconfig.tmpl > myconfig.vcl

您可以在Ubuntu中与apt get install gettext一起安装。

答案 4 :(得分:0)

现在,您可以使用VMOD清漆标准模块(std)在VCL中获取环境变量,例如:

set req.backend_hint = app.backend(std.getenv("VARNISH_BACKEND_HOSTNAME"));

Se文档:https://varnish-cache.org/docs/trunk/reference/vmod_std.html#std-getenv