使用列出的YAML变量进行Jinja模板

时间:2017-10-04 15:28:46

标签: ansible jinja2

所以我似乎找不到解决这个令人沮丧的问题的方法,我想知道这里是否有人有任何想法。 我有一个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

1 个答案:

答案 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 %}