【发布时间】:2021-04-12 13:52:03
【问题描述】:
我正在创建一个 ansible 角色,它允许用户列出要创建和 ipset 的所需组
我的第一个想法是使用 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 %}
【问题讨论】:
-
像
{% for host in groups['group1'] %}这样遍历库存的组名要简单得多。你试过了吗? -
要添加到 @seshadri_c :遍历您的库存并使用
hostvarsdictionnary 从所需主机获取变量。 -
我的团队告诉我,在运行 playbook 时循环主机变量需要很长时间。所以我正在使用正则表达式来剪掉运行速度更快的 ansible_host IP
-
我建议您自己尝试一下,并确定您的团队所说的是否有意义。