Ansible 将Jinja2模板与ini主机文件一起使用

Ansible 将Jinja2模板与ini主机文件一起使用,ansible,jinja2,ini,Ansible,Jinja2,Ini,我正在创建一个ansible角色,该角色允许用户列出所需的组以进行创建和设置 我的第一个想法是使用ini查找插件,但那根本不起作用。我需要做一些正则表达式,在宿主行中使用一些变量,我已经弄清楚了所有的模板,但是我没有弄清楚的是下面 给定一个.ini文件和组列表,我想制作一个模板,打印出组中的所有主机行。我似乎找不到在匹配变量后打印行的方法,直到出现一个空行 因此,例如使用inventory.ini和group_1和group_3 [group_1] host1 ansible_host=X.X.

我正在创建一个ansible角色,该角色允许用户列出所需的组以进行创建和设置

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

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

因此,例如使用
inventory.ini
group_1
group_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 %}
{%用于清单中的行。拆分('\n')%}
{%if第%'行中的'ipv4_public='}

添加{{ipset_name}{{line | regex_search(“(?)以跟随我的评论,简而言之,就是为了让您走上正轨:

编辑:我想当然地认为您将提供一个
host\u groups
var,它将是您希望处理的所有组的列表,例如

主机组:
-第一组
-第3组
以及(示例,未测试)模板:

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

请注意,如果清单中未明确定义
ansible\u主机
,则最后一行将返回
inventory\u名称
。根据您的具体需要进行调整。

重复清单的组名要简单得多,例如
{%forhostingroups['group1']%}
。你试过了吗?为了增加@seshadri_c:循环你的清单,并使用从所需主机获取变量。我的团队告诉我,在运行playbook时,循环主机变量需要花费很长时间。因此,我使用正则表达式来剪断ansible_主机IP,它运行速度非常快。我建议你自己尝试一下,并确定是否有问题您的团队使用的旧名称是否有意义。问题是我不知道将来将使用哪些组,因此我有一个变量“host_groups”,它是一个组名列表,可用于制作ipset。它可以是组1,或组2和组45。这通常不应该出现在不稳定的评论中,但在您的问题中,wi这是一个展示你试图用代码做什么而不是用文字来解释它的过程。更新答案以适应新的要求。