2017-10-04 33 views
0

所以,我似乎無法找到我的方式來解決這個令人沮喪的問題,我想知道這裏有沒有人有任何想法。 我有一個Jinja模板,它以配置文件格式吐出一長串IP地址。這工作正常。問題是,當我有一個客戶有一個以上的IP地址存儲到他們的名字模板,而不是將這個新的IP保存在一個新的線上,只需將第二個IP附加到第一個IP上, IP地址連接在一起。這當然不理想。 下面是我使用的神社模板:使用列出的YAML變量進行Jinja模板

{% for cust, config in customers.items()%} 
{% raw %}#{% endraw %} {{ cust }} - {{ config['type'] }} 
-A INPUT -s {{ config['ipaddr'] }} -p tcp -m state --state NEW -m tcp --dport {{config['accept']}} ACCEPT 
{% endfor %} 

這是變量,從該文件的模板走的是值:

BTG-VELOCITY: 
    type: PBSTP 
    accept: 32500 
    connect: 33500 
    ipaddr: 
     196.167.203.65 
     192.167.203.65 
    subtype: OUTBOUND 
GFAM: 
    type: SPOT 
    accept: 32501 
    connect: 33501 
    ipaddr: 192.168.563.20 
    subtype: AMOUNT 
GUANFABANK: 
    type: SPOT 
    accept: 32503 
    connect: 33503 
    ipaddr: 192.168.563.40 
    subtype: STACKED 
MAINBANK: 
    type: FWD 
    accept: 32504 
    connect: 33504 
    ipaddr: 192.167.203.02 
    subtype: TIERED 
TEST-BANK: 
    type: PBSTP 
    accept: 32506 
    connect: 33506 
    ipaddr: 192.167.203.92 
    subtype: INBOUND 
SESH: 
    type: SPOT 
    accept: 32508 
    connect: 33508 
    ipaddr: 192.167.203.63 
    subtype: TIERED 

的問題是與客戶的BTG速「 。模板吐出了這樣一行

-A INPUT -s 192.168.563.20 196.168.563.20 -p tcp -m state --state NEW -m tcp --dport 32501 ACCEPT 

而不是期望的兩條線路是這樣的:

-A INPUT -s 192.168.563.20 -p tcp -m state --state NEW -m tcp --dport 32501 ACCEPT 
-A INPUT -s 196.168.563.20 -p tcp -m state --state NEW -m tcp --dport 32501 ACCEPT 
+0

爲什麼不添加嵌套循環來遍歷IP地址? –

+0

我試過這個,但我可能做錯了。當我這樣做的時候,最終會產生一個巨大的輸出文件,其輸入方式太多,每個客戶端在每一行都有相同的IP地址值。你有沒有機會建議如何正確地做到這一點? –

回答

0

爲什麼你會希望你的模板來輸出兩行目前尚不清楚。您只有一個循環,並且每個「客戶」循環一次。如果您想爲每個客戶區塊生成多行輸出,則需要另一個循環。

在大多數情況下,你有這樣的:

ipaddr: 192.167.203.63 

爲了您的BTG-VELOCITY客戶,您可以:

ipaddr: 196.167.203.65 192.167.203.65 

所以,如果你在空白分裂的ipaddr的價值,你會獲取地址列表。這可以讓你做這樣的事情:

{% for cust, config in customers.items()%} 
{% raw %}#{% endraw %} {{ cust }} - {{ config['type'] }} 
{% for ipaddr in config['ipaddr'].split() %} 
-A INPUT -s {{ ipaddr }} -p tcp -m state --state NEW -m tcp --dport {{config['accept']}} ACCEPT 
{% endfor %} 
{% endfor %} 

這會得到你想要的。

從數據結構的角度來看,你可能想使ipaddr一個列表,如:

BTG-VELOCITY: 
    type: PBSTP 
    accept: 32500 
    connect: 33500 
    ipaddr: 
     - 196.167.203.65 
     - 192.167.203.65 
    subtype: OUTBOUND 
GFAM: 
    type: SPOT 
    accept: 32501 
    connect: 33501 
    ipaddr: 
192.168.563.20 
    subtype: AMOUNT 

這使得很明顯這是一個多值屬性,這意味着你不再需要split值:

{% for cust, config in customers.items()%} 
{% raw %}#{% endraw %} {{ cust }} - {{ config['type'] }} 
{% for ipaddr in config['ipaddr'] %} 
-A INPUT -s {{ ipaddr }} -p tcp -m state --state NEW -m tcp --dport {{config['accept']}} ACCEPT 
{% endfor %} 
{% endfor %} 
+0

謝謝!對於這些愚蠢的問題抱歉。對Jinja來說還是很新的。 –