我们希望听到您的意见!帮助我们了解 Ansible 生态系统的现状。
参加 2024 年 Ansible 项目调查

在 Red Hat Ansible Tower 中使用 Infoblox 作为动态清单

在 Red Hat Ansible Tower 中使用 Infoblox 作为动态清单

您是否还在使用电子表格跟踪所有设备清单?您的基础设施中是否部署了 Infoblox 设备?您是否希望开始自动化,而无需维护静态设备注册表?如果您对上述任何问题的回答都是肯定的,那么这篇博客就是为您准备的。

运维团队经常难以使他们的配置管理数据库 (CMDB) 保持最新,主要是因为他们没有参与规范流程以分享哪些信息与他们相关,或者即使他们参与了,一旦流程建立起来

团队被禁止更改任何配置项 (CI) 因为他们只有只读权限!

现实情况是,当我们谈论CMDB 时,我们通常指的是数据库中的表,这些表没有任何版本控制机制,因此只为最终用户提供只读访问权限。

影响是,为了执行配置项的生命周期管理(创建/更新/退役),团队必须经历一个繁琐的手动流程,直到他们放弃更改 CMDB 中的 CI(配置项),并让一切保持原样。接下来会发生什么? 不同的团队开始依赖他们自己的CMDB(也称为电子表格)来跟踪子网、IP 分配、DNS 记录、区域、视图等。最终结果是什么? 最终用户请求他们的机器,仍然需要等待至少一周,才能让 NetOps 团队的人员查看他们自己的 CMDB(是的,电子表格)来提供 DNS 记录和 IP 地址。

动态清单

动态清单是 Red Hat Ansible Tower 中最强大的功能之一。动态清单允许 Ansible 查询外部系统,并使用响应数据来构建其清单。Red Hat Ansible Tower 通过动态清单脚本提供了一些开箱即用的集成,并且还允许用户通过提供他们自己的自定义动态清单脚本来扩展这些功能。

Red Hat Ansible Tower 和 Infoblox

让我们看看配置自定义动态清单脚本以查询 Infoblox 并依赖它作为我们的真实清单来源所需的步骤。

安装 infoblox-client

首先,我们需要在 Red Hat Ansible Tower 的每个集群节点的 venv 中安装 infoblox-client python 库,以及 Infoblox 清单脚本所需的配置文件

# source /var/lib/awx/venv/awx/bin/activate
# pip install infoblox-client

注意:您也可以使用 Ansible pip_module创建一个剧本来完成此操作。

/etc/ansible/infoblox.yaml中创建infoblox 配置文件

---
filters:
  extattrs: {}
  view: null

注意:请查看此 Ansible GitHub Issue,我建议从环境变量或文件中获取配置项,以提高灵活性。

凭据类型

在先前步骤的安装成功完成所有集群节点后,我们需要在 Ansible Tower 中指定凭据和主机名,以便与 Infoblox 设备建立通信。截至目前,我们还没有针对 Infoblox 的任何特定 Ansible Tower 凭据,因此让我们创建一个自定义凭据类型。然后,我们可以提供与 Infoblox 通信所需的信息,并将密码由 Ansible Tower 保护,并使用RBAC(基于角色的访问控制)。

作为管理员,转到左侧菜单中的凭据类型

创建一个新的凭据类型:INFOBLOX_INVENTORY(绿色 + 号)

Credential Types - Infoblox Inventory

screenshot

输入配置字段中定义所需的输入

fields:
  - type: string
    id: hostname
    label: Hostname
  - type: string
    id: username
    label: Username
  - secret: true
    type: string
    id: password
    label: Password
required:
  - username
  - password

注入器配置字段中定义作为环境变量的输入注入

env:
  INFOBLOX_HOST: '{{ hostname }}'
  INFOBLOX_PASSWORD: '{{ password }}'
  INFOBLOX_USERNAME: '{{ username }}'
凭据

在 Ansible Tower 中创建凭据类型 INFOBLOX_INVENTORY 后,我们可以使用它来创建新的凭据,并指定与 Infoblox 设备通信的信息。

创建一个与 Infoblox 设备通信的凭据:infoblox-ip.ip.ip.ip

Create credential

注意:在示例中,名称包含 IP 或 FQDN,因此我们可以知道此特定凭据指的是哪个设备。

清单脚本

创建自定义清单脚本,以查询 Infoblox 设备并将输出解析为 Ansible 清单所需的格式。

创建一个新的自定义清单脚本_infoblox-inventory-script.py

从 Ansible 的 GitHub 获取infoblox.py,并将其粘贴到自定义脚本字段中

Create inventory script

清单来源

创建清单,其中使用 infoblox 动态脚本作为动态来源并进行同步,以使用 Infoblox 设备返回的条目填充我们的清单。

转到清单,然后创建新的清单netops

Create inventory

添加来源,引用 infoblox-dynamic-script.py

add source

同步清单来源:

sync inventory source

检查同步状态:

check sync status

清单条目

验证主机、组和变量是否基于 Infoblox 设备中的现有条目在清单中正确填充

在清单中检查主机条目: netops -> hosts

check host inventory

检查与主机条目关联的变量:netops -> hosts -> rtr01.acme.com

check variables

host details

check inventories

此时,我们的动态清单中已包含服务器和路由器,因此从现在开始,我们可以对它们执行任何 Ansible 剧本。 在下一节中,我们将介绍 Infoblox 方面的配置情况。

Infoblox

此时,您可能想知道:Ansible Tower 清单中的这些变量是如何在我的 Infoblox 设备中指定的?答案是,我们使用 Infoblox 中的可扩展属性来实现 ansible_* 变量,因此它们会自动填充到 Ansible Tower 的清单中。以下是从 Infoblox 的 WebUI 获取的一些屏幕截图

Infoblox 中的可扩展属性配置,用于变量“ansible_host”

Extensible Attributes Configuration in Infoblox

为什么要使用可扩展属性?

答案很简单。通常,DNS 中的条目会引用服务器或提供的服务的生产接口,而管理访问仅通过专用带外管理接口提供。ansible_host 附加属性定义,对于此特定条目,Ansible 应使用其值通过管理接口与服务器建立通信。

此外,我们可以依靠可扩展属性变量来指定条目是否由 Ansible Tower 管理(例如:ansible_managed: true/false),并相应地更新我们的“动态清单配置文件”,以使用此特定属性作为过滤器。结果是,Ansible Tower 的清单将只填充我们想要自动化的条目(ansible_managed: true)。