Ansible主机清单:自动化管理的核心基石
Ansible 主机清单(Inventory)是 Ansible 识别目标主机 / 设备的 “地址簿”,本质是一个配置文件(文本 / INI/YAML 格式),用于集中定义需要管理的所有节点(服务器、网络设备、虚拟机等),并支持分组、变量配置,是 Ansible 执行批量操作的基础。
一、核心定义
- 本质:存储目标节点信息的配置文件(默认路径
/etc/ansible/hosts,也可自定义路径); - 核心内容:目标节点的 IP 地址 / 主机名、SSH 连接参数(端口、用户名、密钥)、分组、变量(环境、角色、自定义参数等);
- 核心定位:Ansible 与目标节点的 “桥梁”——Ansible 所有批量操作(如执行命令、部署应用、配置管理)都必须通过清单识别目标对象。
二、核心作用(5 点关键)
1. 集中管理目标节点,避免重复指定
无需在每次执行 Ansible 命令时手动罗列目标主机(如 ansible 192.168.1.10 192.168.1.11 -m ping),只需在清单中定义所有节点,后续通过 “分组名” 或 “all”(所有节点)批量操作。
示例:清单中定义 3 台 Web 服务器,执行命令时直接用分组名 webservers:
bash
ansible webservers -m yum -a "name=nginx state=installed" # 批量安装 Nginx
2. 支持节点分组,实现差异化批量操作
按业务场景(如 Web 服务、数据库、测试环境、生产环境)对节点分组,可针对不同分组执行不同操作,适配复杂环境的管理需求。
示例清单(INI 格式):
# 按业务角色分组
[webservers]
192.168.1.10 # Web 服务器1
192.168.1.11 # Web 服务器2[databases]
192.168.1.20 # 数据库主节点
192.168.1.21 # 数据库从节点# 按环境分组(嵌套分组,用 :children 声明)
[dev:children]
webservers
databases[prod]
192.168.2.10
192.168.2.20
- 操作开发环境所有节点:
ansible dev -m ping - 仅操作数据库节点:
ansible databases -m systemd -a "name=mysql state=started"
3. 配置连接参数,简化 SSH 登录
在清单中直接定义目标节点的 SSH 连接信息(无需手动配置 ~/.ssh/config),避免每次连接时输入端口、用户名、密钥路径等。
示例:指定 SSH 端口、用户名、密钥:
[webservers]
192.168.1.10 ansible_ssh_port=2222 ansible_ssh_user=admin ansible_ssh_private_key_file=/root/.ssh/admin.key
192.168.1.11 ansible_ssh_user=root # 默认端口22,使用密码登录(执行时需输入密码)
- 核心连接变量:
ansible_ssh_port(SSH 端口)、ansible_ssh_user(登录用户)、ansible_ssh_private_key_file(密钥路径)、ansible_ssh_pass(密码,不推荐明文,建议用ansible-vault加密)。
4. 定义自定义变量,实现差异化配置
在清单中为节点 / 分组定义变量(如应用版本、资源规格、环境标识),后续在 Playbook 中直接引用变量,无需硬编码,适配多环境复用。
示例:为分组定义变量:
[webservers]
192.168.1.10
192.168.1.11# 为 webservers 分组定义变量(所有节点共享)
[webservers:vars]
nginx_version=1.24 # Nginx 安装版本
app_env=dev # 环境标识
max_workers=4 # Nginx 工作进程数[databases:vars]
mysql_version=8.0
data_dir=/data/mysql
在 Playbook 中引用变量:
- name: 安装 Nginxhosts: webserverstasks:- name: 安装指定版本 Nginxyum:name: nginx-{{ nginx_version }} # 引用清单中的变量state: installed
5. 支持动态清单,适配动态环境
对于云服务器(AWS、阿里云)、容器集群(K8s)等 “节点 IP 不固定” 的动态环境,可通过 动态清单脚本(Python/Shell 编写)实时从云厂商 API 或 K8s 集群获取节点信息,无需手动维护静态清单。
示例:动态清单脚本逻辑:
- 调用阿里云 API 获取 ECS 实例列表;
- 按实例标签(如
tag:env=prod)分组; - 输出 Ansible 可识别的 JSON 格式节点信息;
- 执行命令时指定动态清单脚本:
ansible all -i dynamic_inventory.py -m ping。
三、清单格式(2 种常用)
1. INI 格式(默认,简洁易读)
适合小型环境,结构如上述示例,核心规则:
- 分组名用
[分组名]包裹; - 节点行可直接跟变量(键值对);
- 分组变量用
[分组名:vars]包裹; - 嵌套分组用
[父分组名:children]包裹。
2. YAML 格式(推荐,支持复杂结构)
适合大型环境,支持更灵活的分组、变量嵌套,需在清单文件头部声明 ---:
四、核心总结
- 主机清单是什么:Ansible 管理目标节点的 “地址簿”,存储节点地址、连接参数、分组、变量;
- 核心作用:集中管理节点、分组批量操作、简化 SSH 连接、支持变量复用、适配动态环境;
