首页 > 解决方案 > 使用带有 ini 主机文件的 Jinja2 模板

问题描述

我正在创建一个 ansible 角色,这将允许用户列出要创建的所需组和 ipset

我的第一个想法是使用 ini 查找插件,但这根本不起作用。我需要做一些正则表达式,在主机行中有一些变量,我得到了所有的模板,但我没有想到的是下面。

给定一个.ini文件和一个组列表,我想制作一个模板来打印组中的所有主机行。我似乎找不到在匹配变量之后打印行的方法,直到出现空白行。

所以例如inventory.inigroup_1group_3

[group_1]
host1 ansible_host=X.X.X.X
host2 ansible_host=X.X.X.X
host3 ansible_host=X.X.X.X

[group_2]
host4 ansible_host=X.X.X.X
host5 ansible_host=X.X.X.X
host6 ansible_host=X.X.X.X

[group_3]
host7 ansible_host=X.X.X.X
host8 ansible_host=X.X.X.X
host9 ansible_host=X.X.X.X

将模板:

host1 ansible_host=X.X.X.X
host2 ansible_host=X.X.X.X
host3 ansible_host=X.X.X.
host7 ansible_host=X.X.X.X
host8 ansible_host=X.X.X.X
host9 ansible_host=X.X.X.X

目前我使用文件查找插件将我们的库存文件添加到变量中,并在模板文件中使用该变量。下面的示例适用于清单文件中的所有主机。

{% for line in inventory.split('\n') %}
{% if 'ipv4_public=' in line %}
add {{ ipset_name }} {{  line | regex_search( '(?<=ipv4_public=).[^ ]*' ) }}
{% if 'ansible_host=' in line %}
add {{ ipset_name }} {{  line | regex_search( '(?<=ansible_host=).[^ ]*' ) }}
{% endif %}
{% endfor %}

标签: ansiblejinja2ini

解决方案


按照我的评论,简而言之,只是为了让你走上正轨:

编辑:我认为您将提供一个 var 是理所当然的host_groups,它将是您要处理的所有组的列表,例如

host_groups:
  - group1
  - group3

和(例如,未经测试的)模板:

{% for host in (host_groups | map('extract', groups) | flatten | unique) %}
{% if hostvars[host].ipv4_public is defined %}
add {{ ipset_name }} {{ hostvars[host].ipv4_public }}
{% endif %}
add {{ ipset_name }} {{ hostvars[host].ansible_host }}

请注意,最后一行将返回inventory_nameifansible_host未在您的清单中明确定义。适应您的确切需求。


推荐阅读