4

у меня есть 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.

Как получить 2 значения в VCL?

ответ

5

Я сумел разобрать мой 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

Вы можете использовать использование эха для строк eval.

Обычно вы можете сделать что-то вроде:

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 
Смежные вопросы