我有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个值?
答案 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