前言
在使用 Ansible 的过程中,有两个基础概念贯穿始终------配置文件(ansible.cfg) 和主机清单(Inventory)。前者决定了 Ansible 自身的行为方式,后者则定义了 Ansible 要管理哪些机器。理解并掌握这两个概念,是高效使用 Ansible 的第一步。
一、Ansible 配置文件(ansible.cfg)
1.1 什么是 ansible.cfg?
ansible.cfg 是 Ansible 的主配置文件,用于控制 Ansible 的各种行为和默认设置。它采用 INI 格式编写,包含多个配置段(section),每个段下面定义相应的配置项。
安装 Ansible 后,系统会生成一个默认配置文件,通常位于 /etc/ansible/ansible.cfg。这个默认配置对大多数用户来说已经足够,但当你有特殊需求时(如修改 SSH 超时时间、调整并发数、指定自定义插件路径等),就需要编辑或创建自己的配置文件。
1.2 配置文件的查找优先级
Ansible 会按照以下顺序查找配置文件,使用第一个找到的文件,忽略其他所有文件:
| 优先级 | 路径 | 说明 |
|---|---|---|
| 1(最高) | ANSIBLE_CONFIG 环境变量指定的路径 |
可通过 export ANSIBLE_CONFIG=/path/to/ansible.cfg 设置 |
| 2 | 当前目录下的 ./ansible.cfg |
项目级别的配置,推荐使用 |
| 3 | 用户主目录下的 ~/.ansible.cfg |
用户级别的配置 |
| 4(最低) | /etc/ansible/ansible.cfg |
系统级别的默认配置 |
⚠️ 安全提示 :如果当前工作目录是全局可写 的,Ansible 不会自动加载该目录下的 ansible.cfg,以防止恶意用户放置配置文件执行危险代码。
1.3 如何生成配置文件模板
cat /etc/ansible/ansible.cfg显示如下图中内容

从图中可以看出,从2.12以后得版本,不提供包含配置配置样例的ansible.cfg,如果你不想从头编写配置文件,可以使用 Ansible 自带的 ansible-config 命令生成模板:
bash
# 生成一个包含所有默认配置(已注释掉)的模板
ansible-config init --disabled > ansible.cfg
# 生成一个包含所有插件配置的完整模板
ansible-config init --disabled -t all > ansible.cfg
1.4 配置文件的典型结构
ansible.cfg 由多个段组成,常见的有:
[defaults]:通用默认设置,如清单文件位置、日志路径、模块路径、并发数等[inventory]:清单相关设置,如启用的清单插件[privilege_escalation]:权限提升(如 sudo)相关设置[colors]:输出颜色设置
以下是一个实用的配置文件示例,基于默认的配置模板进行修改,放置在默认的目录之下:
bash
[defaults]
# 指定主机清单文件的位置
inventory=/etc/ansible/hosts
# 日志文件路径
log_path=/var/log/ansible.log
# 自定义模块路径
library=/usr/share/my_modules/
# 角色路径
roles_path=/etc/ansible/roles
#collection路径
collections_paths=/etc/ansible/collections
# 是否默认收集 facts(建议生产环境设为 explicit 以提高速度)
gathering=implicit
# SSH 连接超时时间(秒)
timeout=10
# 并行执行的主机数量(默认 5)
forks=5
[inventory]
# 启用的清单插件
enable_plugins=host_list, yaml, ini
[privilege_escalation]
# 是否启用权限提升
become=True
# 权限提升方法
become_method=sudo
# 执行权限提升的用户
become_user=root
[ssh_connection]
# SSH 连接超时
timeout=30
# 是否使用 SSH 管道加速
pipelining=True
很多时候,我们有多个项目需要管理,管理的目标主机也可能不相同,要求也不一样,每个项目执行时都需要去修改配置、主机清档等会显得较为麻烦且容易出错。所以最佳实践是每个项目可以新建一个文件夹,在对应的文件家中新建ansible配置文件ansible.cfg,主机清单,角色目录(存放角色)、collection目录(存放collection)

项目project1的配置文件内容如下:
bash
vim ansible.cfg
[defaults]
#清单文件
inventory=/data/project1/inventory
#角色目录
roles_path=/data/project1/roles
#collection目录,多个目录冒号:分隔
collections_paths=/data/project1/collections
#远程用户
remote_user=albert
#适当的调大forks的值可以提高任务的执行效率,但是会消耗更多的cpu资源。
forks=10
#host_key_checking 是控制 SSH 连接时是否验证远程主机密钥(Host Key)的关键参数。默认情况下该选项为 True,即开启检查,这能防止中间人攻击,但在批量自动化运维(如新节点首次接入)时,会因无法自动确认指纹而阻塞执行,所以一般将该值配置为False。
host_key_checking=False
[privilege_escalation]
become=True #sudo提权
become_method=sudo #提权方式
become_user=root #提权用户
become_ask_pass=False #是否需要密码
1.5 通过环境变量覆盖配置
除了配置文件,Ansible 还支持通过环境变量来覆盖配置项,且环境变量的优先级高于配置文件 。
规则很简单:将配置项的名称转为大写,并加上 ANSIBLE_ 前缀。例如:
bash
# 覆盖 inventory 配置
export ANSIBLE_INVENTORY=/path/to/my/inventory
# 覆盖 forks 配置
export ANSIBLE_FORKS=20
# 覆盖 timeout 配置
export ANSIBLE_TIMEOUT=60
# 然后运行 ansible 命令
ansible all -m ping
二、主机清单(Inventory)
2.1 什么是主机清单?
主机清单(Inventory)是 Ansible 中定义被管理主机的配置文件,它回答了 Ansible 两个核心问题:要管理哪些服务器 ,以及这些服务器属于什么角色。
主机清单可以分为两类:
- 静态清单:以文本文件形式固定定义主机和组,适用于主机数量稳定、拓扑变化少的场景
- 动态清单:通过脚本或插件从外部数据源(如云平台 API、CMDB 系统)实时生成主机列表,适用于云环境、容器集群等动态场景
2.2 清单位置与指定方式
默认的静态主机清单文件位于 /etc/ansible/hosts。但实际使用中,更推荐将清单文件放在项目目录中统一管理。
清单文件的指定方式有多种,优先级从高到低为:
- 命令行指定 :
ansible -i /path/to/inventory all -m ping - 环境变量 :
export ANSIBLE_INVENTORY=/path/to/inventory - 配置文件指定 :在
ansible.cfg中设置inventory = /path/to/inventory - 默认路径 :
/etc/ansible/hosts
2.3 清单文件格式
Ansible 支持多种清单格式,最常用的是 INI 和 YAML。
(1)INI 格式
INI 格式是最传统、最直观的写法:
ini
# 1. 单主机定义(支持主机名或 IP)
mail.example.com
192.168.1.10
# 2. 范围匹配(批量定义连续主机)
172.17.0.[1:100] # 匹配 172.17.0.1 到 172.17.0.100
db[a:d].example.com # 匹配 dba、dbb、dbc、dbd
# 3. 主机组定义
[webservers]
web01.example.com
web02.example.com
192.168.1.11
[dbservers]
db01.example.com
db02.example.com
# 4. 嵌套组(组包含组)
[allservers:children]
webservers
dbservers
注意:没有分组的独立主机必须写在所有组定义之前,否则会被误判为组内主机。
(2)YAML 格式
YAML 格式更加结构化,适合复杂的清单场景:
yaml
---
all:
children:
webservers:
hosts:
web01:
ansible_host: 192.168.1.11
web02:
ansible_host: 192.168.1.12
dbservers:
hosts:
db01:
ansible_host: 192.168.1.21
db02:
ansible_host: 192.168.1.22
allservers:
children:
webservers:
dbservers:
2.4 主机组与变量
(1)组的概念
主机组是 Ansible 批量管理的核心。通过将主机按业务属性分组(如 Web 服务器组、数据库服务器组),可以实现对不同类型主机的差异化管理和批量操作。一个主机可以同时属于多个组。
(2)清单变量
在清单中,你可以为主机或组定义变量,从而避免在每次运行命令时重复指定连接参数。
常用的连接变量包括:
| 变量名 | 含义 | 默认值 |
|---|---|---|
ansible_host |
连接目标主机的 IP 或域名 | 清单中定义的主机名 |
ansible_port |
SSH 连接端口 | 22 |
ansible_user |
SSH 连接用户名 | 执行 ansible 命令的用户 |
ansible_password |
SSH 连接密码 | 无(推荐使用密钥) |
ansible_ssh_private_key_file |
SSH 私钥文件路径 | 默认密钥 |
变量可以在主机级别或组级别定义:
ini
# 主机级别变量(INl 格式)
[webservers]
web01 ansible_host=192.168.1.11 ansible_user=deploy
web02 ansible_host=192.168.1.12 ansible_port=2222
# 组级别变量
[webservers:vars]
ansible_user=deploy
ansible_ssh_private_key_file=/home/user/.ssh/deploy_key
[dbservers:vars]
ansible_user=root
ansible_port=2222
变量的优先级为:主机变量 > 组变量 > 全局变量。
(3)主机清单与变量演示
ansible主机清单(ini格式):
yaml格式主机清单:

2.5 动态清单
当基础设施规模较大或频繁变化时(如云环境),手动维护静态清单会变得非常困难。这时就需要动态清单------通过脚本或插件从外部数据源实时获取主机列表。
动态清单脚本需要返回 JSON 格式的数据:
json
{
"webservers": {
"hosts": ["web01", "web02"],
"vars": {
"ansible_user": "deploy"
}
},
"dbservers": {
"hosts": ["db01", "db02"]
}
}
使用方式与静态清单相同:
bash
ansible -i /path/to/dynamic_inventory.py all -m ping
常见的动态清单来源包括 AWS EC2、OpenStack、VMware vCenter 以及各类 CMDB 系统。
2.6 多清单文件与清单目录
当项目复杂时,可以将清单拆分为多个文件,甚至使用整个目录来组织清单:
bash
# 目录结构
inventories/
├── production/
│ ├── hosts.ini
│ └── group_vars/
├── staging/
│ ├── hosts.ini
│ └── group_vars/
└── common/
└── hosts.yml
使用目录作为清单源:
bash
ansible -i inventories/production/ all -m ping
也可以同时指定多个清单源:
bash
ansible -i production/hosts.ini -i staging/hosts.ini all -m ping
三、最佳实践建议
3.1 配置文件方面
- 项目级配置优先 :在每个 Ansible 项目根目录放置专属的
ansible.cfg,便于团队协作和版本控制。 - 善用环境变量:对于临时性配置调整,使用环境变量比修改配置文件更快捷。
- 生成配置模板 :使用
ansible-config init --disabled > ansible.cfg生成模板,按需取消注释。 - 明确指定清单路径 :在
ansible.cfg中明确指定inventory路径,避免依赖默认位置。
3.2 主机清单方面
- 按逻辑分组:建议按"是什么"(应用/服务)、"在哪里"(数据中心/区域)、"何时用"(环境阶段)三个维度来组织分组。
- 变量与清单分离 :对于大型项目,建议将变量放在
group_vars/和host_vars/目录中,而非直接写在清单文件里。 - 善用范围匹配 :对于连续编号的主机,使用
[1:100]或[a:d]语法可以减少重复。 - 验证清单 :使用
ansible-inventory --list或ansible all --list-hosts验证清单是否正确。 - 考虑动态清单:当基础设施超过一定规模或频繁变化时,尽早引入动态清单。
四、常用调试命令
bash
# 查看当前生效的配置
ansible-config dump
# 查看某个配置项的值及来源
ansible-config dump | grep INVENTORY
# 列出清单中的所有主机和组
ansible-inventory --list
# 以图形化方式展示清单结构
ansible-inventory --graph
# 测试匹配哪些主机
ansible webservers --list-hosts
# 测试连通性
ansible all -m ping
五、ansible常用模块
ansible有非常多的模块,可以支持完成丰富的功能。如下ansible 2.14.18版本,支持7738个模块。

ansible常用模块有command、ping、shell、script、template、copy、file、yum、service、cron、yum_repository、user、group等等。
ansible模块的作用与使用场景:
| 模块 | 一句话作用 | 关键特性与场景 |
|---|---|---|
command |
执行简单系统命令 | 默认模块 ,不支持管道(` |
shell |
执行复杂Shell命令 | 支持管道、重定向、逻辑运算符。通过 /bin/sh 执行。例:`ps -ef |
script |
传输并执行本地脚本 | 无需提前拷贝脚本到远程,执行后自动清理临时文件。例:执行本地的巡检脚本 |
ping |
测试SSH连通性 | 非ICMP Ping,而是测试Ansible能否通过SSH认证并执行Python。 |
file |
管理文件/目录/链接的属性 | 创建(directory)、删除(absent)、修改权限(mode)、属主(owner)。 |
copy |
复制静态文件到远程 | 从控制节点拷贝到远程,支持备份(backup=yes)。适合分发固定内容。 |
template |
渲染Jinja2模板后复制 | 支持变量替换、循环、条件判断。适合生成动态配置文件(如nginx.conf)。 |
archive |
在远程主机上创建压缩包 | 将指定路径打包为 tar.gz、zip 等格式(重点解析见下文)。 |
unarchive |
在远程主机上解压压缩包 | 从本地、URL或远程路径获取压缩包并解压(archive 的好搭档)。 |
yum |
管理RPM软件包(RHEL/CentOS) | 安装(present)、升级(latest)、卸载(absent)。 |
yum_repository |
管理YUM仓库配置文件 | 添加/删除 /etc/yum.repos.d/*.repo。 |
service |
管理系统服务状态 | 启动(started)、停止、重启,并设置开机自启(enabled=yes)。 |
cron |
管理周期性计划任务 | 添加/删除 crontab 任务。 |
user |
管理用户账户 | 创建/删除用户,设置家目录、Shell、附加组。 |
group |
管理用户组 | 创建/删除用户组。 |
结语
配置文件(ansible.cfg)和主机清单(Inventory)是 Ansible 自动化运维的两大基石。理解它们的查找顺序、配置方式和最佳实践,能够帮助你更高效、更安全地管理基础设施。无论你是刚接触 Ansible 的新手,还是正在优化大规模自动化流程的资深工程师,扎实掌握这两个基础概念都将让你事半功倍。
希望这篇文章能帮助你更好地理解和使用 Ansible,如果你有任何问题或经验分享,欢迎在评论区留言讨论!