我一直在阅读很多关于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 TEMPLATE
{% 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
答案 0 :(得分:2)
如果您可以重构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
是一个包含两个键RANGES
和HOSTS
的字典,它们是字符串列表。
然后你可以这样做:
{% 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
,其中包含字典作为其元素,每个字典内部都有不同的键。您必须编写更复杂的模板来处理此结构。
答案 1 :(得分:1)
基于@ 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 %}