【问题标题】: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
      

      【讨论】:

        【解决方案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 进行安装。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-02-11
            • 1970-01-01
            • 2022-06-11
            • 2014-08-05
            • 2019-07-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多