是否有Ansible/Jinja2子组变量唯一筛选器?

是否有Ansible/Jinja2子组变量唯一筛选器?,ansible,jinja2,Ansible,Jinja2,我们正在使用Ansible从Jinja2模板生成一些iptables规则。主机位于嵌套组中,其子网作为变量存储在资源清册文件中的子组变量中,如下所示: [parent_group] [parent_group:children] child_group1 [child_group1] FQDN1 FQDN2 [child_group1:vars] subnet=10.0.0.0/24 我们有许多子组,每个子组都有各自主机组的子网/掩码。大多数Ansibl

我们正在使用Ansible从Jinja2模板生成一些iptables规则。主机位于嵌套组中,其子网作为变量存储在资源清册文件中的子组变量中,如下所示:

[parent_group]
[parent_group:children]
child_group1
    [child_group1]
    FQDN1
    FQDN2
    [child_group1:vars]
    subnet=10.0.0.0/24

我们有许多子组,每个子组都有各自主机组的子网/掩码。大多数Ansible/Jinja2文档都指向通过使用for循环在其成员主机上迭代来引用组变量,这将导致模板文件中出现重复行。只有一次抓取父组的子组变量的最佳方法是什么?有没有办法在Jinja2 for循环中筛选唯一的值?

在对Jinja2表达式进行了一些摸索之后,我找到了以下模板,可以基于子组变量创建规则,而不存在重复项:

{% set subnets = [] %}
{% for host in groups['parent_group'] %}
{% if hostvars[host].subnet not in subnets %}
-A INPUT -s {{hostvars[host].subnet}} -j ACCEPT {{subnets.append(hostvars[host].subnet)}}
{% endif %}
{% endfor %}

我觉得它很笨拙,所以如果有人知道更好的方法,我会非常感激。

在摸索了几遍Jinja2表达式之后,我能够想出以下模板来创建基于子组变量的规则,而不重复:

{% set subnets = [] %}
{% for host in groups['parent_group'] %}
{% if hostvars[host].subnet not in subnets %}
-A INPUT -s {{hostvars[host].subnet}} -j ACCEPT {{subnets.append(hostvars[host].subnet)}}
{% endif %}
{% endfor %}

我觉得它很笨重,所以如果有人知道更好的方法,我会非常感激。

下面是一个表达式,用于获取父组中主机的唯一子网列表:

{{ groups['parent_group'] | map('extract',hostvars,'subnet') | list | unique }}

描述了这种值提取技术。

下面是一个表达式,用于获取父组中主机的唯一子网列表。:

{{ groups['parent_group'] | map('extract',hostvars,'subnet') | list | unique }}
描述了该值提取技术