目录
[一、Ansible 清单概述](#一、Ansible 清单概述)
[1. 最简单的清单格式](#1. 最简单的清单格式)
[2. 使用主机组组织管理](#2. 使用主机组组织管理)
[1. 主机可以属于多个组](#1. 主机可以属于多个组)
[2. 两个特殊的默认组](#2. 两个特殊的默认组)
[3. 嵌套组(父组与子组)](#3. 嵌套组(父组与子组))
[1. 查看特定主机信息](#1. 查看特定主机信息)
[2. 列出所有主机和组](#2. 列出所有主机和组)
[3. 查看组的层次结构](#3. 查看组的层次结构)
[4. 交互式浏览清单](#4. 交互式浏览清单)
[1. 默认位置](#1. 默认位置)
[2. 自定义清单位置](#2. 自定义清单位置)
一、Ansible 清单概述
Ansible 清单是定义 Ansible 管理的主机集合的配置文件。它类似于一个"地址簿",告诉 Ansible 需要管理哪些服务器以及如何对这些服务器进行分组。
清单的两种类型:
-
静态清单:通过文本文件定义(INI 或 YAML 格式)
-
动态清单:通过插件从外部系统(如云平台、CMDB)动态生成
本文将重点介绍最常用的静态清单。
二、静态清单文件格式
1. 最简单的清单格式
最简单的清单文件就是主机名或 IP 地址的列表:
bash
web01.company.com
web02.company.com
db01.company.com
192.168.1.100
2. 使用主机组组织管理
更实用的方式是将主机分组管理,使用方括号 [] 定义组名:
bash
# 定义两个主机组:web_servers 和 db_servers
[web_servers]
web01.company.com
web02.company.com
[db_servers]
db01.company.com
db02.company.com
三、主机分组的高级用法
1. 主机可以属于多个组
一个主机可以同时属于多个组,这为不同维度的管理提供了便利:
bash
[frontend]
app01.company.com
app02.company.com
[backend]
db01.company.com
db02.company.com
# app01 同时属于 frontend 和 beijing 组
[beijing]
app01.company.com
db01.company.com
[shanghai]
app02.company.com
db02.company.com
2. 两个特殊的默认组
Ansible 自动维护两个特殊组:
-
all:包含清单中的所有主机
-
ungrouped:包含不属于任何其他组的主机
3. 嵌套组(父组与子组)
通过创建父组来组织多个相关子组:
bash
# 子组定义
[east_region]
server01.company.com
server02.company.com
[west_region]
server03.company.com
server04.company.com
# 父组定义:包含两个子组
[china:children]
east_region
west_region
# 父组也可以有自己的成员
[china]
server05.company.com # 这个主机不属于任何子组,但属于父组
四、使用范围简化主机定义
当主机名有规律时,可以使用范围模式简化定义:
bash
# 数字范围
[app_servers]
app[01:05].company.com # 匹配 app01 到 app05
# 字母范围
[test_servers]
test-[a:d].company.com # 匹配 test-a 到 test-d
# 带前导零的数字范围
[db_servers]
db[001:010].company.com # 匹配 db001 到 db010
五、验证清单内容
1. 查看特定主机信息
bash
ansible-navigator inventory -m stdout --host app01.company.com
2. 列出所有主机和组
bash
ansible-navigator inventory -m stdout --list
3. 查看组的层次结构
bash
# 以图形方式显示组结构
ansible-navigator inventory -m stdout --graph china
输出示例:
bash
@china:
|--@east_region:
| |--server01.company.com
| |--server02.company.com
|--@west_region:
| |--server03.company.com
| |--server04.company.com
|--server05.company.com
4. 交互式浏览清单
bash
ansible-navigator inventory
使用交互式界面可以更方便地浏览所有组和主机。
六、指定清单文件位置
1. 默认位置
Ansible 默认在以下位置查找清单文件:
-
/etc/ansible/hosts(系统默认) -
当前目录下的
inventory或hosts文件
2. 自定义清单位置
bash
# 使用 -i 参数指定清单文件
ansible-playbook -i /path/to/my_inventory playbook.yml
ansible-navigator run -i /path/to/my_inventory playbook.yml
# 或在 ansible.cfg 中配置默认清单
[defaults]
inventory = /path/to/my_inventory
七、动态清单简介
除了静态文件,Ansible 还支持动态清单,可以从外部系统自动获取主机信息:
bash
# 使用动态清单插件(示例:AWS EC2)
ansible-playbook -i aws_ec2.yml playbook.yml
常见的动态清单来源:
-
云平台(AWS、Azure、GCP)
-
配置管理数据库(CMDB)
-
虚拟化平台(VMware、OpenStack)
-
容器编排平台(Kubernetes、OpenShift)
八、最佳实践建议
-
有意义的组名:使用清晰、一致的命名约定
-
避免组名与主机名冲突:确保组名不与任何主机名相同
-
逻辑分层:使用父组和子组创建层次结构
-
环境分离:将开发、测试、生产环境的主机分开管理
-
版本控制:将清单文件纳入版本控制系统
-
变量管理:可以在清单中为主机或组设置变量
九、总结
Ansible 清单是自动化运维的基础,合理设计清单结构可以大大提高管理效率。通过静态清单文件,我们可以清晰地定义主机之间的关系和组织结构,为后续的 Playbook 执行提供目标主机集合。
无论是简单的单机部署还是复杂的大型集群管理,良好的清单设计都是成功实施 Ansible 自动化的第一步。