Ansible Tower 高级智能清单使用
Ansible Tower 高级智能清单使用
背景
智能清单 是 Red Hat Ansible Tower 3.2 中添加的一项功能。此功能允许您生成一个新的清单,其中包含 Ansible Tower 中其他清单中存在的主机。此清单始终保持最新,并使用我们称为主机过滤器的功能进行填充。主机过滤器是一种特定于域的查询语言,它混合了 Django Rest Framework GET 查询语言和添加的 JSON 查询语法。实际上,这使您可以创建主机及其关系字段以及相关 JSON 结构的清单。
ansible_facts 字段是主机上的一个相关字段,由启用了事实缓存的作业模板运行(作业)填充。Ansible Tower 为启用了事实缓存的作业模板添加了 Ansible 事实缓存插件。这种类型的作业模板运行调用 Ansible gather_facts 的剧本,会导致这些事实保存到 Ansible Tower 数据库中,当作业完成时。
智能清单过滤器的限制在于它只允许对 ansible_fact JSON 数据进行相等匹配。在本博文中,我将向您展示如何克服此限制,并使用例如主机是否属于某个子网的范围查询,将主机添加到智能清单。
Ansible Tower 对象
不要再谈论它了,让我们看一个例子。我们将在 Ansible Tower 中创建对象。具体来说,下表中的对象。
资源 | 值 |
---|---|
组织 | 变形金刚 |
清单 | 汽车人 |
项目 | 事实 |
主机 | optimus, bumblebee, jazz |
作业模板 | gather, clear, subnet, set_fact_cacheable |
为所有作业模板启用事实缓存
1. 事实缓存
现在,让我们开始行动。运行 gather 作业模板。然后查看为汽车人清单收集到的 UI 中的结果事实。
以上是如何在 UI 中查看事实收集过程结果的示例。现在让我们看看如何从收集到的事实中创建智能清单。
2. 我们的第一个智能清单
我们将创建一个智能清单,其中只包含 Red Hat 主机。在我的示例中,optimus 和 bumblebee 都是 Red Hat 主机,而 jazz 是 Ubuntu 主机。
使用主机过滤器创建智能清单:ansible_facts.ansible_distribution:RedHat
我的新智能清单“Red Hat 汽车人”包含 2 个主机(见下图)。
3. 注入剧本事实
我们现在将离开智能清单功能,回到事实缓存。具体来说,我将向您展示如何在剧本中使用 set_fact
,并将该事实存储在 Ansible Tower 中。
运行作业模板 set_fact_cacheable
。以下是运行结果。
现在,让我们看看此剧本运行的 3 个主机中任何一个的事实。请注意,bumblebee 现在具有一组新的事实(见下图)。
具体来说
a: b: c: - a - b
这些事实由此剧本设置,该剧本使用 cacheable: true
设置的 set_fact Ansible 模块。
创建智能清单
我已经向您展示了创建基于非简单相等匹配的主机事实的智能清单所需的所有部分。这些部分是
- 事实缓存
- 智能清单
- 注入剧本事实
现在,我将向您展示使用所有这些部分来构建子网内主机的智能清单的示例。这是一个很好的例子,因为根据子网选择主机是一个范围查询,它不是一个简单的相等查询。因此,我们将需要利用 3. 注入剧本事实来完成创建智能清单以对这些主机进行分组。
总体目标是将主机上的 is_subnet
设置为 True(如果主机在所需子网中),或 False(如果主机不在子网中)。然后,我们可以构造一个类似于 ansible_facts.is_subnet:true
的智能清单主机过滤器来获取子网中的主机。以下剧本 实现了这一点.
- hosts: all vars: subnet: '172.18.0.0/16' tasks: - name: "Presume host to not belong to subnet" set_fact: is_subnet: False cacheable: True - name: "Figure out if host belongs to subnet" set_fact: is_subnet: True cacheable: True when: ansible_all_ipv4_addresses | ipaddr(subnet)
未来
目前,Ansible Tower 对象上所有传统的关系数据库字段都可以在智能清单主机过滤器查询中使用(即主机名、清单名称、组织描述等);唯一与主机相关的可搜索 JSON 字段是 ansible_facts 字段。我们希望在将来扩展可搜索的 JSON 字段以及支持的操作符(目前我们只支持相等)。但是,必须认真考虑此操作的性能特征以及存储要求。