所以我似乎找不到解决这个令人沮丧的问题的方法,我想知道这里是否有人有任何想法。 我有一个Jinja模板,它以配置文件格式吐出一长串IP地址。这很好用。问题是当我有一个客户有多个IP地址存储到他们的名称模板时,而不是将这个新IP保存在新线路上,只需将第二个IP附加到第一个IP并输出一行两个IP地址连接在一起。这当然不太理想。 以下是我正在使用的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-VELOCITY'。模板像这样吐出一行
-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 :(得分: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 %}