【问题标题】:Using listed YAML variables for Jinja templating将列出的 YAML 变量用于 Jinja 模板
【发布时间】:2017-10-04 15:28:45
【问题描述】:

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

【问题讨论】:

  • 为什么不添加嵌套 for 循环来遍历 ip 地址?
  • 我试过这个,但我可能做错了。当我这样做时,它最终生成了一个巨大的输出文件,其中包含太多条目,并且每个客户端在每一行上都具有相同的 IP 地址值。您是否有机会建议如何正确执行此操作?

标签: ansible jinja2


【解决方案1】:

不清楚为什么您希望您的模板输出两行。您只有一个循环,每个“客户”循环一次。如果您想为每个客户块生成多行输出,您将需要另一个循环。

在大多数情况下,您会遇到以下情况:

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

【讨论】:

  • 谢谢!对不起,愚蠢的问题。对 Jinja 还是很陌生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 2021-11-16
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
相关资源
最近更新 更多