资讯中心

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

📅 2026/8/23 9:26:43
自动化运维-ansible配置文件与主机清单
前言在使用 Ansible 的过程中有两个基础概念贯穿始终——配置文件ansible.cfg和主机清单Inventory。前者决定了 Ansible 自身的行为方式后者则定义了 Ansible 要管理哪些机器。理解并掌握这两个概念是高效使用 Ansible 的第一步。一、Ansible 配置文件ansible.cfg1.1 什么是 ansible.cfgansible.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命令生成模板# 生成一个包含所有默认配置已注释掉的模板ansible-config init--disabledansible.cfg# 生成一个包含所有插件配置的完整模板ansible-config init--disabled-tallansible.cfg1.4 配置文件的典型结构ansible.cfg由多个段组成常见的有[defaults]通用默认设置如清单文件位置、日志路径、模块路径、并发数等[inventory]清单相关设置如启用的清单插件[privilege_escalation]权限提升如 sudo相关设置[colors]输出颜色设置以下是一个实用的配置文件示例基于默认的配置模板进行修改放置在默认的目录之下[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 以提高速度gatheringimplicit# SSH 连接超时时间秒timeout10# 并行执行的主机数量默认 5forks5[inventory]# 启用的清单插件enable_pluginshost_list, yaml, ini[privilege_escalation]# 是否启用权限提升becomeTrue# 权限提升方法become_methodsudo# 执行权限提升的用户become_userroot[ssh_connection]# SSH 连接超时timeout30# 是否使用 SSH 管道加速pipeliningTrue很多时候我们有多个项目需要管理管理的目标主机也可能不相同要求也不一样每个项目执行时都需要去修改配置、主机清档等会显得较为麻烦且容易出错。所以最佳实践是每个项目可以新建一个文件夹在对应的文件家中新建ansible配置文件ansible.cfg主机清单角色目录存放角色、collection目录存放collection项目project1的配置文件内容如下vimansible.cfg[defaults]#清单文件inventory/data/project1/inventory#角色目录roles_path/data/project1/roles#collection目录多个目录冒号:分隔collections_paths/data/project1/collections#远程用户remote_useralbert#适当的调大forks的值可以提高任务的执行效率但是会消耗更多的cpu资源。forks10#host_key_checking 是控制 SSH 连接时是否验证远程主机密钥Host Key的关键参数。默认情况下该选项为 True即开启检查这能防止中间人攻击但在批量自动化运维如新节点首次接入时会因无法自动确认指纹而阻塞执行,所以一般将该值配置为False。host_key_checkingFalse[privilege_escalation]becomeTrue#sudo提权become_methodsudo#提权方式become_userroot#提权用户become_ask_passFalse#是否需要密码1.5 通过环境变量覆盖配置除了配置文件Ansible 还支持通过环境变量来覆盖配置项且环境变量的优先级高于配置文件。规则很简单将配置项的名称转为大写并加上ANSIBLE_前缀。例如# 覆盖 inventory 配置exportANSIBLE_INVENTORY/path/to/my/inventory# 覆盖 forks 配置exportANSIBLE_FORKS20# 覆盖 timeout 配置exportANSIBLE_TIMEOUT60# 然后运行 ansible 命令ansible all-mping二、主机清单Inventory2.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/hosts2.3 清单文件格式Ansible 支持多种清单格式最常用的是INI和YAML。1INI 格式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注意没有分组的独立主机必须写在所有组定义之前否则会被误判为组内主机。2YAML 格式YAML 格式更加结构化适合复杂的清单场景---all:children:webservers:hosts:web01:ansible_host:192.168.1.11web02:ansible_host:192.168.1.12dbservers:hosts:db01:ansible_host:192.168.1.21db02:ansible_host:192.168.1.22allservers:children:webservers:dbservers:2.4 主机组与变量1组的概念主机组是 Ansible 批量管理的核心。通过将主机按业务属性分组如 Web 服务器组、数据库服务器组可以实现对不同类型主机的差异化管理和批量操作。一个主机可以同时属于多个组。2清单变量在清单中你可以为主机或组定义变量从而避免在每次运行命令时重复指定连接参数。常用的连接变量包括变量名含义默认值ansible_host连接目标主机的 IP 或域名清单中定义的主机名ansible_portSSH 连接端口22ansible_userSSH 连接用户名执行 ansible 命令的用户ansible_passwordSSH 连接密码无推荐使用密钥ansible_ssh_private_key_fileSSH 私钥文件路径默认密钥变量可以在主机级别或组级别定义# 主机级别变量INl 格式 [webservers] web01 ansible_host192.168.1.11 ansible_userdeploy web02 ansible_host192.168.1.12 ansible_port2222 # 组级别变量 [webservers:vars] ansible_userdeploy ansible_ssh_private_key_file/home/user/.ssh/deploy_key [dbservers:vars] ansible_userroot ansible_port2222变量的优先级为主机变量 组变量 全局变量。3主机清单与变量演示ansible主机清单ini格式yaml格式主机清单2.5 动态清单当基础设施规模较大或频繁变化时如云环境手动维护静态清单会变得非常困难。这时就需要动态清单——通过脚本或插件从外部数据源实时获取主机列表。动态清单脚本需要返回 JSON 格式的数据{webservers:{hosts:[web01,web02],vars:{ansible_user:deploy}},dbservers:{hosts:[db01,db02]}}使用方式与静态清单相同ansible-i/path/to/dynamic_inventory.py all-mping常见的动态清单来源包括 AWS EC2、OpenStack、VMware vCenter 以及各类 CMDB 系统。2.6 多清单文件与清单目录当项目复杂时可以将清单拆分为多个文件甚至使用整个目录来组织清单# 目录结构inventories/ ├── production/ │ ├── hosts.ini │ └── group_vars/ ├── staging/ │ ├── hosts.ini │ └── group_vars/ └── common/ └── hosts.yml使用目录作为清单源ansible-iinventories/production/ all-mping也可以同时指定多个清单源ansible-iproduction/hosts.ini-istaging/hosts.ini all-mping三、最佳实践建议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验证清单是否正确。考虑动态清单当基础设施超过一定规模或频繁变化时尽早引入动态清单。四、常用调试命令# 查看当前生效的配置ansible-config dump# 查看某个配置项的值及来源ansible-config dump|grepINVENTORY# 列出清单中的所有主机和组ansible-inventory--list# 以图形化方式展示清单结构ansible-inventory--graph# 测试匹配哪些主机ansible webservers --list-hosts# 测试连通性ansible all-mping五、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注入风险。例hostnameshell执行复杂Shell命令支持管道、重定向、逻辑运算符。通过/bin/sh执行。例ps -ef | grep javascript传输并执行本地脚本无需提前拷贝脚本到远程执行后自动清理临时文件。例执行本地的巡检脚本ping测试SSH连通性非ICMP Ping而是测试Ansible能否通过SSH认证并执行Python。file管理文件/目录/链接的属性创建(directory)、删除(absent)、修改权限(mode)、属主(owner)。copy复制静态文件到远程从控制节点拷贝到远程支持备份(backupyes)。适合分发固定内容。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)、停止、重启并设置开机自启(enabledyes)。cron管理周期性计划任务添加/删除 crontab 任务。user管理用户账户创建/删除用户设置家目录、Shell、附加组。group管理用户组创建/删除用户组。结语配置文件ansible.cfg和主机清单Inventory是 Ansible 自动化运维的两大基石。理解它们的查找顺序、配置方式和最佳实践能够帮助你更高效、更安全地管理基础设施。无论你是刚接触 Ansible 的新手还是正在优化大规模自动化流程的资深工程师扎实掌握这两个基础概念都将让你事半功倍。希望这篇文章能帮助你更好地理解和使用 Ansible如果你有任何问题或经验分享欢迎在评论区留言讨论