精读笔记(RHCA 英文教材)· DO447 Chapter 12 Managing Advanced Inventories
大约 10 分钟
精读笔记(RHCA 英文教材)· DO447 Chapter 12 Managing Advanced Inventories
教材原文:RHCA 官方英文教材(教材第 445~480 页)(OCR 整书版已从本站移除,本页为章节精读) 关联知识:Ch8(基础静态清单/清单角色/Inventory 变量)、Ch10(Fact Cache——Smart 清单依赖它)、Ch9(Project 机制用于“清单放 Git”);本系列配套
00-RHCA教材精读-导航与学习法.md章节结构:12.1 导入外部静态清单(awx-manage / Project 内清单)→ 12.2 动态清单(内置云源/OpenStack/Satellite 6/自定义脚本)→ 12.3 Smart 清单(按 facts 过滤)→ LabManaging Advanced Inventories(advinventory-review)
Chapter Goal / Objectives(原文+译)
- GOAL: Manage inventories that are loaded from external files or generated dynamically from scripts or the Ansible Tower smart inventory feature.(管理“从外部文件载入 / 由脚本或 Smart Inventory 动态生成”的清单)
- OBJECTIVES:① 从外部文件把静态清单导入 Tower,并使用 Git 仓库管理的静态清单;② 建一个用自定义清单脚本生成主机/主机组的动态清单;③ 建 Smart Inventory——用过滤器从 Tower 上其它清单动态构造主机集合。
12.1 Importing External Static Inventories(导入外部静态清单)
两种场景(Why)
- 已有大型静态清单文件要迁进 Tower、或想继续在 Tower 外维护清单:两种解法——
- 导入进 Tower(Web UI 正常管理,能改内容);
- 清单放 SCM/Project(像 playbook 一样走 Git 版本管理,周期性同步进 Tower;代价是不能在 Web UI 里改清单内容)。
方法一:awx-manage inventory_import(考点)
awx-manage是 Tower 自带命令行工具(访问内部详细数据),必须以 root 或 awx 用户运行;最常用途=把存量静态清单文件直接导入 Tower。- 导入会连同清单文件关联的
group_vars/、host_vars/目录里的变量一起导入。目录结构示例:inventory/ |-- group_vars/ | `-- mygroup |-- host_vars/ | `-- myhost `-- hosts - 用法(先在 Tower 建好空的目标清单,再导入):
awx-manage inventory_import --source=inventory/ --inventory-name="My Tower Inventory" awx-manage inventory_import --source=./my_inventory_file --inventory-name="My Tower Inventory" - 合并 vs 覆盖(IMPORTANT,考点):目标清单非空时,默认合并(只把新变量/主机加进去,不覆盖已有)——方便也容易“搞乱”;要用
--overwrite(整体覆盖)与--overwrite_vars(覆盖变量)选项时谨慎。
方法二:清单存放在 Project(考点)
- 建一个指向 Git 的普通 Project(SCM Type/URL、需要时 SCM Credential、可选 branch/tag/commit、可选 Update Revision on Launch)——与建 Job Template 用的 Project 完全一样。
- 建清单 → 编辑 → SOURCES → “+” → SOURCE 选 Sourced from a Project → 指定 PROJECT 与 INVENTORY FILE(下拉选不到就手动键入文件名——已知产品问题)→ 可选填 Credential、勾 Update on Project Change(Git 版本更新后自动刷新该清单)。
Guided Exercise 1 要点(lab: advinventory-import)
lab advinventory-import start。ssh root@tower→ 用 awx-manage 把/root/example-inventory导入已有空清单Exercise(忽略无害错误,以最后“import completed”为准);回 Web UI 验证 Exercise 里出现多个组与主机。- 建 Project
MyProjectGit(Default / Git /http://git.lab.example.com:8081/git/inventory.git)。 - 建清单
ExerciseGit→ SOURCES → 源git-inventory:SOURCE=Sourced from a Project / PROJECT=MyProjectGit / INVENTORY FILE 手填git-inventory→ 同步后 HOSTS 里有servere.lab.example.com。 - workstation clone
inventory.git→ 编辑git-inventory给[filesrv]加serverf.lab.example.com→ commit/push → 回 Tower 更新 Project 与清单源 → HOSTS 出现 serverf。 lab advinventory-import finish。
12.2 Creating and Updating Dynamic Inventories(创建与更新动态清单)
动态清单基础(考点)
- 静态清单要人工维护;主机在云/虚拟化里频繁生灭时,用动态清单:脚本运行时根据外部源(云 API、Cobbler、LDAP、CMDB…)决定主机与组。大而快变的 IT 环境推荐用。
- Tower 内置支持的动态源(built-in cloud sources):AWS EC2、Google Compute Engine、Azure Resource Manager、VMware vCenter、Red Hat Satellite 6、Red Hat CloudForms、Red Hat Virtualization、OpenStack;也支持自定义脚本(可来自 Git Project)。
- 通用配置流程(任何内置源都类似,考点):
- 建匹配数据源类型的 Credential(如 OpenStack、Satellite 6 类型);
- 新建一个 Inventory;
- 在该清单里建 Source(SOURCE 选内置源而非 Manual),关联凭据,可勾自动 Update on Launch;
- 手动触发第一次同步。
OpenStack 动态清单示例
- OpenStack Credential 额外字段:Username、Password(或 API key)、Authentication URL(如 https://demo.../v2.0)、Project(租户名)、Domain Name(仅 Keystone v3 需要)。
- Source 的 三个 UPDATE OPTIONS(考点): | 选项 | 行为 | | --- | --- | | Overwrite | 更新时删除外部源里不存在的本地子组/主机(默认关=外部没有的保留) | | Overwrite Variables | 开启时删除外部源没有的变量(默认关=本地变量与外部变量合并) | | Update on Launch | 每次用该清单跑作业前先从外部源刷新 |
- 同步状态:源名左侧云图标灰=无状态;双箭头图标=开始同步;同步完绿=成功、红=失败。同步可手动、可定时、可每次作业前自动。
Red Hat Satellite 6 动态清单
- 场景闭环:新裸机 PXE/DHCP/TFTP 网络引导 → Satellite Kickstart 安装并注册 → 主机出现在动态清单 → Tower 用该清单跑 provisioning 作业;Provisioning Callbacks 特别适合新服务器部署时触发初始作业(详见文档)。
- 配置与 OpenStack 几乎一样:Credential TYPE=Red Hat Satellite 6,需 Satellite 6 URL / Username / Password;Source 选 Red Hat Satellite 6 + 该凭据 + 三个 UPDATE OPTIONS;同步后主机/组在 Web UI 可见。
自定义动态清单脚本(考点)
- Tower 支持目标服务器上任意动态语言脚本(至少 Python/Bash);脚本以 awx 用户运行、权限受限;必须以 shebang 开头(如
#!/usr/bin/python)。 - 脚本契约:带
--list输出 JSON 清单(组可含 hosts/children/vars);带--host hostname输出该主机的 JSON 变量哈希(可空);若--list顶层有_meta,可一次返回全部主机变量(性能更好,之后不再调 --host)。 - JSON 示例要点:组对象含
hosts列表、children(组中组)、vars(组变量)。 - 社区脚本:
github.com/ansible/ansible/tree/devel/contrib/inventory/;自行开发参考 “Developing Dynamic Inventory Sources”。 - 导入与使用:Inventories Scripts(Web UI 左侧)→ “+” → NAME/ORGANIZATION + 把脚本粘进 CUSTOM SCRIPT → SAVE;在清单源里 SOURCE=Custom Script、CUSTOM INVENTORY SCRIPT=刚导入的脚本名 → 同步。
Guided Exercise 2 要点(lab: advinventory-dynamic)
lab advinventory-dynamic start(准备 IdM 服务器)。- Inventories → Scripts → “+”:导入自定义脚本
ldap-freeipa.py(Default 组织;内容从materials.example.com/classroom/ansible/ipa-setup/ldap-freeipa.py粘贴)。 - 建 Inventory
Dynamic Inventory(Default)。 - 加 Source:NAME=
Custom Script/ SOURCE=Custom Script / CUSTOM INVENTORY SCRIPT=ldap-freeipa.py。 - 点双箭头同步 → 云图标变绿 → 清单出现 development / ipaservers / production / testing 等组及主机。
12.3 Filtering Hosts with Smart Inventories(用 Smart 清单过滤主机)
Smart Inventory 概念(考点)
- Tower 3.2+:用主机过滤器作用于 Tower 上“全部静态+动态清单的主机并集”,动态构造出新清单——命中过滤器的主机才进 Smart 清单。适合“跨现有清单抽取子集”。
- 依赖 Fact Cache(IMPORTANT):Smart 过滤器靠 fact cache 判断 facts → 必须定期用“开 Use Fact Cache 且采集 facts”的 Job Template 填充缓存(最小 playbook:
hosts: all; gather_facts: yes,无 tasks),否则新主机不匹配(facts 不在缓存)。
Smart 过滤器语法(考点:易错点)
- 建法:Inventories → “+” → Smart Inventory → NAME + ORGANIZATION + SMART HOST FILTER;点放大镜打开 DYNAMIC HOSTS 搜索窗,输入过滤器(底部实时显示命中主机);不设过滤器=全部主机。
- fact 过滤器写法(易错):以字符串
ansible_facts.开头,后跟旧式注入名的 fact(变量式),冒号后紧跟值、无空格:ansible_facts.ansible_distribution:RedHat - IMPORTANT(三坑):① 前缀
ansible_facts表示“我要匹配 fact”,不是命名空间;② 不能写成ansible_facts.ansible_facts.distribution或ansible_facts.distribution(Ansible 2.5 起 fact 才归到 ansible_facts 变量下,Smart 过滤器暂不支持新式名);③ 冒号与值之间不能有空格。 - 也能按组成员、主机名、主机描述等过滤(详见 Tower User Guide host_filter search)。
Guided Exercise 3 要点(lab: advinventory-smart)
lab advinventory-smart start;验证 servera/serverb(Dev 组)facts 已在缓存(前序作业开了 fact caching)。- 建 Smart Inventory
Smart(Default / SMART HOST FILTER=ansible_facts.ansible_distribution:RedHat)→ 命中 servera、serverb。 - 对 serverc/serverd 跑一次采集作业(模板开 Use Fact Cache)→ 回 Smart 清单查看:serverc、serverd 因 facts 入缓存并满足过滤条件而自动加入 Smart 清单。
- 结论考点:Smart 清单随 fact cache 刷新而动态扩缩。
Lab 要点(lab: advinventory-review,教材第 471~480 页 Performance Checklist)
lab advinventory-review start(建空Lab清单 + 准备 IdM)。- CLI:把
/root/lab-example-inventory用 awx-manage 导入空清单Lab。 - 建 Project
LabProjectGit(http://git@git.lab.example.com:8081/git/inventory.git,SCM Credential=student-git,勾 Update Revision on Launch)。 - 建 Inventory
LabGit,源文件git-inventory-lab(经 LabProjectGit)。 - 导入脚本
ldap-idm.py(materials.../ipa-setup/ldap-idm.py)→ 建Lab Dynamic Inventory→ 加该脚本为源。 - 把
Demo Job Template的 INVENTORY 改成LabGit并启动一次(把 LabGit 主机 facts 灌进缓存)。 - 建 Smart Inventory
LabSmart:筛 LabGit 组里 RedHat 系主机。 lab advinventory-review grade修正至通过。
SUMMARY(教材原话要点 4 条 → 考点归纳)
awx-manage inventory_import可把存量静态清单导入 Tower(默认合并、可选 --overwrite[_vars])。- 清单可放 Git 由 Project 管理:清单源设为 Sourced from a Project,走版本控制且能随 Project 更新同步。
- Tower 内置若干动态清单源,也支持自定义动态清单脚本(--list/--host/_meta JSON 契约)。
- Smart Inventory 基于 fact cache 用过滤器从全 Tower 清单抽取主机子集。
命令速查表
| 场景 | 操作/命令 |
|---|---|
| CLI 导入清单 | awx-manage inventory_import --source=<目录或文件> --inventory-name="<目标清单>"(root/awx 用户) |
| 覆盖导入 | --overwrite / --overwrite_vars(默认合并) |
| 清单放 Git | Project(Git/URL/凭据)→ 清单 SOURCES → Sourced from a Project + INVENTORY FILE(+Update on Project Change) |
| 内置动态源 | Credentials 建源类型凭据 → Inventory → Source(SOURCE=内置源 + CREDENTIAL + 三 UPDATE OPTIONS) |
| 手动同步 | 源行左侧双箭头(云图标灰/绿/红) |
| 自定义脚本 | Inventories → Scripts → “+” 粘贴脚本 → 源 SOURCE=Custom Script |
| 脚本契约 | --list(JSON:hosts/children/vars、_meta);--host <name>(主机变量 JSON) |
| Smart 清单 | Inventories → “+” → Smart Inventory → SMART HOST FILTER |
| Smart 过滤器 | ansible_facts.<旧式fact名>:<值>(冒号后无空格;勿写 ansible_facts.ansible_facts…) |
| 填充 fact cache | 开 Use Fact Cache 的采集 playbook(gather_facts: yes)定期跑 |
| GE / Lab | lab advinventory-import / -dynamic / -smart / -review start|grade|finish |
核心词汇表
| 英文 | 中文速记 |
|---|---|
| awx-manage | Tower CLI(root/awx 用户跑) |
| inventory_import | 导入静态清单(--source/--inventory-name/--overwrite_vars) |
| group_vars / host_vars | 随清单导入的变量目录 |
| Sourced from a Project | 清单源=Project 里的文件(版本管理) |
| INVENTORY FILE / Update on Project Change | 指定清单文件 / Git 变更后自动同步 |
| dynamic inventory | 动态清单(脚本按外部源生成主机组) |
| built-in cloud source | 内置云源(EC2/GCE/Azure/vCenter/Satellite6/CloudForms/RHV/OpenStack) |
| Overwrite / Overwrite Variables / Update on Launch | 动态源三更新选项 |
| cloud icon / double-arrow | 源同步状态图标 / 手动同步按钮 |
| custom inventory script | 自定义清单脚本(awx 用户运行、需 shebang) |
| --list / --host / _meta | 脚本 JSON 契约(组/主机/变量;_meta 一次返回) |
| smart inventory | Smart 清单(对全 Tower 主机做 fact 过滤) |
| smart host filter | ansible_facts.ansible_distribution:RedHat(冒号后无空格) |
| fact cache(依赖) | Smart 清单判据来源(需定期采集填充) |
| inject_facts_as_vars | 旧式 fact 变量注入开关(默认开,subject to change) |
本章自测
- “存量清单迁进 Tower”与“清单继续放 Git”各自优缺点?分别对应哪两个机制?
- awx-manage 由谁执行?导入默认合并还是覆盖?想整体覆盖/只覆盖变量分别加什么选项?
- “清单在 Project 里”的配置步骤(Project → 清单 → SOURCES → …)?INVENTORY FILE 下拉选不到怎么办?
- 内置动态源有哪些(至少举 6 个)?配置任何内置源的通用四步是什么?
- OpenStack Credential 需要哪些字段?三个 UPDATE OPTIONS(Overwrite/Overwrite Variables/Update on Launch)各管什么?
- 自定义清单脚本的运行身份、shebang 要求、--list/--host 的 JSON 契约?_meta 优化解决什么问题?
- 怎么把自定义脚本导入 Tower 并接到清单源上?同步状态怎么判断成功?
- Smart Inventory 的判据从哪来?为什么“facts 不在缓存”会导致主机不出现?
- 写出匹配 ansible_distribution=RedHat 的 Smart 过滤器;指出三个易错点(前缀含义/新式名/冒号空格)。
- GE3 里 serverc/serverd 为什么会在跑完采集作业后“自动加入”Smart 清单?SUMMARY 四条分别对应 12.1/12.2/12.3 哪一节?
