ansible - 使用带有 ini 主机文件的 Jinja2 模板
问题描述
我正在创建一个 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 %}
解决方案
按照我的评论,简而言之,只是为了让你走上正轨:
编辑:我认为您将提供一个 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_name
ifansible_host
未在您的清单中明确定义。适应您的确切需求。
推荐阅读
- ansible - Ansible:如何根据列表中的特定单词将列表转换/过滤为字典
- python - 投资组合体积计算中的 ValueError
- python - 当我不在函数内部递归调用“return”时,为什么这个递归树函数会起作用?
- vuejs2 - 使用可选参数/可选道具创建组件
- r - R中的For循环-如何使用先前创建的值
- mysql - 无法在 MySQL 上切换用户
- javascript - Try/Catch - 如何在一段时间后自动触发 catch 块?
- google-developers-console - 如何从 Google Developer Play 商店获取安装和卸载统计信息?
- php - 用唯一键索引替换 PHP 中的子字符串
- docker - docker-compose“命令”用法