自动化运维-ansible配置文件与主机清单

前言

在使用 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。但实际使用中,更推荐将清单文件放在项目目录中统一管理。

清单文件的指定方式有多种,优先级从高到低为:

  1. 命令行指定ansible -i /path/to/inventory all -m ping
  2. 环境变量export ANSIBLE_INVENTORY=/path/to/inventory
  3. 配置文件指定 :在 ansible.cfg 中设置 inventory = /path/to/inventory
  4. 默认路径/etc/ansible/hosts

2.3 清单文件格式

Ansible 支持多种清单格式,最常用的是 INIYAML

(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 配置文件方面

  1. 项目级配置优先 :在每个 Ansible 项目根目录放置专属的 ansible.cfg,便于团队协作和版本控制。
  2. 善用环境变量:对于临时性配置调整,使用环境变量比修改配置文件更快捷。
  3. 生成配置模板 :使用 ansible-config init --disabled > ansible.cfg 生成模板,按需取消注释。
  4. 明确指定清单路径 :在 ansible.cfg 中明确指定 inventory 路径,避免依赖默认位置。

3.2 主机清单方面

  1. 按逻辑分组:建议按"是什么"(应用/服务)、"在哪里"(数据中心/区域)、"何时用"(环境阶段)三个维度来组织分组。
  2. 变量与清单分离 :对于大型项目,建议将变量放在 group_vars/host_vars/ 目录中,而非直接写在清单文件里。
  3. 善用范围匹配 :对于连续编号的主机,使用 [1:100][a:d] 语法可以减少重复。
  4. 验证清单 :使用 ansible-inventory --listansible all --list-hosts 验证清单是否正确。
  5. 考虑动态清单:当基础设施超过一定规模或频繁变化时,尽早引入动态清单。

四、常用调试命令

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.gzzip 等格式(重点解析见下文)。
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,如果你有任何问题或经验分享,欢迎在评论区留言讨论!

相关推荐
一可米2 小时前
gitHub.com Actions自动化发布
运维·自动化·github
智塑未来2 小时前
证券公司智能运维平台哪个品牌做得好?擎创科技智能运维 2.0 适配券商全场景
运维·科技·区块链
蚰蜒螟3 小时前
从内核源码看Linux启动:chroot、execve与MS_MOVE的协奏曲
linux·服务器·网络
影视飓风TIM4 小时前
Linux下C语言缓冲区原理 + Git版本控制
linux·c语言·git
来者皆善4 小时前
ZYNQ linux上使用 USB CDC ACM
linux·运维·服务器
4/5$全真龙门4 小时前
廉价易行的内网穿透
运维
缓慢更新5 小时前
企业档案管理系统迁移实录:从文件服务器到智能检索引擎
运维·服务器
小北的AI科技分享5 小时前
企业AI开发:从技术选型到落地的关键路径
运维·模型·评估
Dawn-bit5 小时前
Linux磁盘分区与Swap和磁盘故障查询
linux·运维·服务器·网络·云计算