【问题标题】:Jinja syntax for YAML FileYAML 文件的 Jinja 语法
【发布时间】:2017-10-24 16:09:52
【问题描述】:

我已经阅读了很多关于 python 和 JINJA 中的循环的信息,但我没有找到解决我的问题的正确答案。我对编程真的很陌生,所以我一定错过了一些东西

我有以下 YAML 文件

CONT_PLANE_PROT_V4:
  - RANGES:
    - 10.193.130.240/28
    - 10.193.135.240/28
  - HOSTS:
    - 10.193.131.131
    - 10.196.180.5

我想用这些变量生成一个模板,如果我在 Ansible 中打印该变量,它会显示如下:

打印变量

[{u'RANGES': [u'10.193.130.240/28', u'10.193.135.240/28']}, {u'HOSTS': [u'10.193.131.131', u'10.196.180.5']}]

我在 JINJA 模板中尝试以下操作,但没有成功:

JINJA 模板

{% for list in CONT_PLANE_PROT_V4 %}
  {% for ips in CONT_PLANE_PROT_V4[list] %}      

    Statement1 {{RANGES_IPs}

  {% endfor %}
{% endfor %}

{% for list in CONT_PLANE_PROT_V4 %}
  {% for ips in CONT_PLANE_PROT_V4[list] %}  

    Statement2 {{HOSTS_IPs}}

  {% endfor %}
{% endfor %}

Ansible 错误: "AnsibleUndefinedVariable: list object has no element {u'RANGES': [u'10.193.130.240/28', u'10.193.135.240/28', u'10.183.64.240/28', u'10.183.60.240/28', u'10.183.106.240/28', u'10.36.12.240/28', u'10.128.64.240/28', u'10.44.12.240/28', u'10.213.12.240/28', u'10.111.64.240/28', u'10.193.80.240/28']}"}

请求: 您能否让我知道正确获取 2 个列表(4 个 IP)的值的最佳方法或最简单方法。我需要访问“RANGES”和“HOST”列表中的值。 “RANGES”列表中的值将用于语句 1,“HOSTS”列表中的值将用于语句 2。

类似这样的:

预期结果

statement1 10.193.130.240/28
statement1 10.193.135.240/28

statement2 10.193.131.131
statement2 10.196.180.5

【问题讨论】:

  • 这里缺少一些东西。向我们展示你是如何运行它的——大概是命令行和播放文件。
  • @ryekayo,您几乎不需要在 YAML 文件中以 --- 开头。

标签: python ansible jinja2


【解决方案1】:

如果您可以重构 YAML 数据,请按如下方式进行更改:

CONT_PLANE_PROT_V4:
  RANGES:
    - 10.193.130.240/28
    - 10.193.135.240/28
  HOSTS:
    - 10.193.131.131
    - 10.196.180.5

这样CONT_PLANE_PROT_V4 是一个包含两个键RANGESHOSTS 的字典,它们是字符串列表。

那么你可以这样做:

{% for r in CONT_PLANE_PROT_V4['RANGES'] %}
    Statement1 {{ r }} 
{% endfor %}

{% for h in CONT_PLANE_PROT_V4['HOSTS'] %}
    Statement2 {{ h }}
{% endfor %}

使用您的原始数据,您有一个列表CONT_PLANE_PROT_V4,其中包含字典作为它的元素,每个字典内部都有不同的键。您必须编写更复杂的模板来处理此结构。

【讨论】:

  • 康斯坦丁太棒了,对我有用。我重新安排了我的 YAML 并以这种方式访问​​了变量。谢谢!
【解决方案2】:

基于@konstantin-suvorov YAML 重构,您可以执行以下代码,因此它可以更加动态

{% for name, sublist in CONT_PLANE_PROT_V4.items() %}
  List: {{ name}}
  {%for value in sublist %}
    Value: {value}
  {% endfor %}
{% endfor %}

如果您无法更改 YAML,请根据您之前显示的输出

Printing Variable
[{u'RANGES': [u'10.193.130.240/28', u'10.193.135.240/28']}, {u'HOSTS': [u'10.193.131.131', u'10.196.180.5']}]

在这种情况下,YAML 被作为数组处理,因此您需要先遍历数组

{% for lists in CONT_PLANE_PROT_V4 %}
  {%for name, sublist in lists.items() %}
   List: {name}
    {%for value in sublist %}
       Value: {value}
    {% endfor %}
  {% endfor %}
{% endfor %}

【讨论】:

    猜你喜欢
    • 2016-02-27
    • 2011-10-23
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 2021-05-07
    • 2021-12-11
    相关资源
    最近更新 更多