2017-10-04 32 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来说还是很新的。 –