什么是Ansible 清单 - 详解

news/2025/11/6 19:32:18/文章来源:https://www.cnblogs.com/yxysuanfa/p/19197566

Ansible 清单构建

在 Ansible 自动化流程中,清单(Inventory) 是连接控制节点与受管主机的 “桥梁”—— 它定义了 Ansible 需要管理的主机集合,支持将主机分组、嵌套,并灵活适配不同环境的管理需求。无论是静态维护固定主机列表,还是动态同步外部数据源的主机信息,掌握清单构建方法都是实现高效自动化的第一步。本文基于红帽 RH294 课程内容,详细拆解 Ansible 清单的核心概念、静态清单构建方法、验证技巧及最佳实践,帮助读者快速上手清单配置。

一、Ansible 清单核心概念

Ansible 清单本质是 “受管主机的配置文件”,主要功能包括:

  1. 定义受管主机:明确 Ansible 需要操作的目标主机(通过主机名或 IP 地址);
  2. 主机分组管理:将主机按角色(如 Web 服务器、数据库服务器)、位置(如北京机房、上海机房)或环境(开发、测试、生产)分组,实现批量操作;
  3. 变量关联:为特定主机或主机组绑定变量(如远程登录用户、端口号),简化 Playbook 配置;
  4. 支持动态更新:从外部系统(如红帽卫星、AWS EC2)动态拉取主机信息,适配弹性基础设施。

清单分为静态清单动态清单两类:

  • 静态清单:以文本文件形式固定定义主机和组,适用于主机数量稳定、拓扑变化少的场景(如物理机、固定虚拟机);
  • 动态清单:通过脚本或插件从外部数据源(如云平台 API、CMDB 系统)实时生成主机列表,适用于云环境、容器集群等动态拓扑场景。

本文重点讲解静态清单的构建(动态清单将在后续进阶内容中展开),同时介绍清单验证与常用操作技巧。

二、静态清单的核心格式与构建方法

静态清单支持多种格式(如 INI、YAML),其中INI 样式是最常用的格式(红帽 RH294 课程默认推荐),具有简洁直观、易于维护的特点。以下从基础到复杂场景,逐步讲解静态清单的构建方法。

1. 基础:简单主机列表(无分组)

最简化的静态清单是 “一行一个主机” 的纯列表,适用于临时管理少量无分组主机。例如:

# 静态清单:无分组的主机列表
web1.lab.example.com
web2.lab.example.com
192.168.1.100
172.25.250.10  # 服务器A的IP地址
  • 主机标识支持主机名(需 DNS 可解析) 或IP 地址
  • 注释以#开头,可用于标注主机用途(如 “服务器 A 的 IP 地址”)。

2. 进阶:主机组配置(核心场景)

当受管主机数量增多时,通过主机组实现批量管理是关键。INI 格式中,主机组以[组名]开头,后续行列出该组包含的主机。

(1)基础分组:按角色分组

例如,将 Web 服务器和数据库服务器分别分组:

# 按角色分组的静态清单
[webservers]  # Web服务器组
web1.lab.example.com
web2.lab.example.com
192.168.1.100  # 额外的Web服务器IP
[db_servers]   # 数据库服务器组
db1.lab.example.com
db2.lab.example.com
172.25.250.11  # 数据库服务器IP
  • 作用:运行 Playbook 时,可通过hosts: webservers指定 “仅对 Web 服务器组执行任务”,避免逐个指定主机;
  • 特性:主机可属于多个组。例如,一台主机既属于 “webservers” 组,也属于 “production” 组(按环境分组)。
(2)高级分组:嵌套组(组包含组)

对于复杂环境(如跨地域、多层级拓扑),可通过嵌套组(子组)简化管理。嵌套组需在组名后添加:children标识,示例如下:

# 嵌套组示例:北美区域包含美国和加拿大子组
[usa]  # 美国子组
washington1.lab.example.com
washington2.lab.example.com
[canada]  # 加拿大子组
ontario1.lab.example.com
ontario2.lab.example.com
[north_america:children]  # 北美区域组(嵌套usa和canada子组)
usa
canada
# 北美区域组可直接包含主机(与子组主机合并)
[north_america]
newyork.lab.example.com  # 额外的北美主机
  • 作用:通过hosts: north_america可对 “美国 + 加拿大 + 纽约” 的所有主机执行任务,无需逐个列出子组;
  • 注意:嵌套组仅包含子组的主机,自身可额外添加独立主机,最终组内主机为 “子组主机 + 自身主机” 的合集。

3. 高效技巧:通过范围简化主机规格

当主机名或 IP 地址具有规律(如server01server20192.168.1.1192.168.1.255)时,可通过范围语法[START:END]简化清单配置,避免重复编写。

常见范围场景示例:
场景范围语法匹配结果(示例)
数字范围(带前置零)server[01:05].lab.example.comserver01、server02、server03、server04、server05
IP 地址范围192.168.[1:3].[1:2]192.168.1.1、192.168.1.2、192.168.2.1、192.168.2.2、192.168.3.1、192.168.3.2
字母范围[a:c].dns.lab.example.coma.dns、b.dns、c.dns(均属于lab.example.com域)
IPv6 地址范围2001:db8::[a:f]2001:db8::a、2001:db8::b、…、2001:db8::f
实战案例:简化 Web 服务器组配置

原清单(重复编写 10 台主机):

[webservers]
web01.lab.example.com
web02.lab.example.com
...
web10.lab.example.com

通过范围语法简化后:

[webservers]
web[01:10].lab.example.com  # 一行匹配10台主机

4. 隐藏特性:默认内置组

Ansible 自动创建两个内置组,无需手动定义:

  • all:包含清单中所有受管主机,运行hosts: all可对所有主机执行任务;
  • ungrouped:包含清单中明确列出、但未归属任何自定义组的主机(常用于清理 “无组主机”)。

三、清单验证与常用操作

构建清单后,需通过 Ansible 工具验证配置正确性,避免因主机名错误、组嵌套异常导致自动化失败。红帽 RH294 课程推荐使用ansible-navigator inventory命令(基于红帽 Ansible 自动化平台),以下是核心验证场景。

1. 验证清单文件路径

默认情况下,Ansible 读取/etc/ansible/hosts作为静态清单,但实际项目中推荐使用自定义清单文件(避免修改系统默认配置),通过-i选项指定清单路径:

# 语法:ansible-navigator inventory -i 清单文件路径 [其他选项]
ansible-navigator inventory -i ./my_inventory  # 读取当前目录的my_inventory清单

2. 列出清单中所有主机

通过--list选项查看清单中所有主机及组结构(JSON 格式输出),验证主机是否正确归属到目标组:

# 示例:查看my_inventory清单的所有主机和组
ansible-navigator inventory -i ./my_inventory -m stdout --list

输出示例(关键片段):

{"_meta": {"hostvars": {}},"all": {"children": ["webservers", "db_servers", "ungrouped"]  # all组包含的子组},"webservers": {"hosts": ["web01.lab.example.com", "web02.lab.example.com"]  # Web组主机},"db_servers": {"hosts": ["db01.lab.example.com", "db02.lab.example.com"]  # 数据库组主机}
}

3. 查看特定组的主机

通过--graph 组名选项以 “树形结构” 查看特定组的主机,直观验证组内主机是否正确:

# 示例:查看webservers组的主机
ansible-navigator inventory -i ./my_inventory -m stdout --graph webservers

输出示例:

@webservers:|--web01.lab.example.com|--web02.lab.example.com|--192.168.1.100

4. 交互模式浏览清单

直接运行ansible-navigator inventory -i 清单文件进入交互模式,可通过菜单浏览所有组和主机:

ansible-navigator inventory -i ./my_inventory
  • 输入0:浏览所有组(Groups);
  • 输入1:浏览所有主机(Hosts);
  • Esc退出交互模式。

5. 关键警告:避免主机与组同名

若清单中存在 “主机名与组名相同” 的情况(如主机web和组web),ansible-navigator inventory会输出警告,且可能导致任务执行异常。最佳实践:主机名和组名需唯一,例如组web_servers,主机用web01

四、总结

Ansible 清单是自动化的 “基础蓝图”,其核心价值在于 “统一管理受管主机拓扑”。本文通过 RH294 课程内容,拆解了静态清单的构建方法(基础列表、分组、嵌套组、范围语法)、验证技巧(ansible-navigator inventory命令)及最佳实践(目录式变量管理、版本控制)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/958040.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

完整教程:如何用开源软件

完整教程:如何用开源软件pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &…

第一次团队项目作业

软件工程团队项目第一次作业 - VALORANT 智能战术助手(第一部分) 作业信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering/这个作业要求在哪里 https://edu.cnblogs.com/campu…

隨機變量本質之最終闡述

懷特博士: 我的理智所剩無幾,必須儘快警告您——切勿觸碰概率的本質!那个不可名狀的存在堂而皇之地通過霍爾教授的死宣誓著自己的主宰。Kl-mghrov——我無法準確發音,這個名字本身就讓燈光閃爍、指針顫動。我是如此…

足式机器人适应多地形的方案

基于视觉的感知运动 两阶段方法:流程:首先在完全可观测的马尔可夫决策过程(MDP) 中,利用特权信息训练一个强大的教师策略。然后,通过知识蒸馏,将教师策略的知识迁移给一个仅能使用真实传感器数据的学生策略。优…

使用vLLM实测3090和4090的大模型推理性能

使用`vLLM`测试下大模型并发推理场景下3090和4090两张显卡的性能表现,看下4090是否在高并发场景下具备更高的扩展性。 3090显卡和4090显卡在模型推理过程中的显存和GPU使用率都比较接近,1~8并发度场景下,3090和409…

CF1700F Puzzle

考虑如果是 \(1 \times n\) 怎么做。 显然是前缀和的差的绝对值的和,因为每次移动改变一位前缀和。 考虑上下交换的本质是什么,就是给第一行减 \(1\),第二行加 \(1\),反过来同理,那么在前缀和异号时显然交换是不劣…

Redis高可用与高并发探险之旅:从单机到集群的完美进化【第三部分】

可以结合之前的文章融合起来一起理解学习:分布式缓存-Redis集群在一个名为"数据大陆"的世界里,Redis王国正面临着前所未有的挑战。随着用户流量的激增,单机Redis服务器已经不堪重负。今天,就让我们跟随年…

UE:论运行时动画录制的关键-正确获取骨骼数据与保存

© mengzhishanghun 原创文章 首发于 博客园 禁止未经授权转载核心问题 在 UE5.4 中实现运行时动画录制,最关键的两个问题是:如何获取正确的骨骼数据 - 避免崩溃和数据不匹配如何正确保存 AnimSequence - 使用…

a-menu 当设置折叠状态如何穿透悬浮菜单样式

效果antReset.css .ant-menu-submenu .ant-menu-submenu-popup .ant-menu .ant-menu-light {border: 1px solid #173808 !important; }/* 直接针对 popup 整体背景 */ .ant-menu-submenu-popup {background-color: #17…

attention论文及Transformer工作原理概述

attention论文及Transformer工作原理概述Posted on 2025-11-06 19:09 wsg_blog 阅读(0) 评论(0) 收藏 举报attention论文及Transformer工作原理概述

kamailio+rtpengine对sdp的处理

概述 使用kamailio+rtpengine的过程中,默认会使用rtpengine处理sdp信息,同时又需要对sdp信息定制,就需要对cfg配置流程中做特殊处理才能实现。 环境 CentOS 7.9 kamailio:5.8.3-bullseye docker rtpengine:mr13.1.1…

软工团队项目第一次作业

软工团队项目第一次作业作业所属课程 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering/作业要求 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering/homework/13573作业的目标 团队展示+选…

低代码权限管理安全合规指南:守住数据安全的 “最后一道防线”

随着数据安全法、个人信息保护法的落地,企业对系统权限管理的合规要求越来越高。低代码平台作为企业数字化的核心工具,其权限管理不仅要保障数据不泄露、操作不越权,还要满足行业监管和法律法规的要求。 很多企业误…

2025-11-06

2025-11-06CF补题 Problem - 515C - Codeforces(1400)(string+a little factorial) 这题妙在把各个数字阶乘转换成仅含有2 3 5 7 数字,然后直接求解 要对每个数的阶乘进行换算[!tip]9 is 7!*8*9=7!*3!*3!*2!8 is …

低代码权限管理常见场景解决方案:精准适配不同业务需求

低代码平台的核心优势是 “快速适配多元业务”,而权限管理作为保障业务安全的关键,必须跟着场景走。很多企业在设置权限时,容易陷入 “一刀切” 的误区 —— 用一套权限配置应对所有业务场景,结果要么出现 “权限不…

不适用模型的简易ai交互页面

不适用模型的简易ai交互页面 一.形式import streamlit as st st.title("测试标题") st.divider() prompt=st.chat_input("请输入你的问题") if prompt:#如果问题不为空才输出答案st.chat_message(…

关于waybar状态栏颜文字乱码问题

也就差个字体的事: sudo pacman -S nerd-fonts

自己的火印

/*** Modified by Noivelist,* Luogu:https://www.luogu.com.cn/user/700335* Marsoj:http://marsoj.com/user/252* “倘若梦境醒来,执念破去,我们再谈救赎”* Working on Project: [ ]**/