2014-01-10 35 views
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之外定義它們。

如何在VCL中檢索我的2個值?

回答

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

您可以使用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