分组为什么要有层级
扁平的分组很快就会失控:环境、业务、角色、机房混在一起,组名越来越长,一个变更往往要同时列出多个组。引入层级后,可以按维度分层:底层是按角色或业务划分的组,中间层按环境或机房聚合,顶层用一个总组囊括全部。这样同一台主机可以在角色的组里,同时通过嵌套属于所属环境,执行时既可以按角色选取,也可以按环境限制范围。
基本信息
| 分组维度 | 环境、业务、角色、机房或区域 |
|---|---|
| 嵌套写法 | INI 用 children 段,YAML 用 children 键 |
| 变量位置 | 与组对应的变量目录,按层级覆盖 |
| 作用 | 让执行范围可用组合表达,而不是长列表 |
设计要点
- 一个维度一层:环境层与角色层分开,不要混在同一层命名里。
- 组名表达含义:用 env-prod、role-web 这类可读前缀,而不是缩写。
- 嵌套关系单一:同一主机尽量只通过一条路径进入某个父组,便于理解生效变量。
- 变量放对层级:分组共有的差异放在组变量目录,个别主机的特例才写主机变量。
- 保留兜底组:留一个全部主机组,便于巡检类任务统一执行。
- 定期清理空组:主机下线后及时移除,避免执行到已不存在的目标。
分层嵌套示例
分层嵌套示例
; 角色层:按用途分组
[role_web]
web01.example.com
web02.example.com
; 环境层:把角色组嵌套进环境组
[env_prod:children]
role_web
role_db
; 机房层:再往上聚合
[machines:children]
env_prod
test_env分组设计对照
| 做法 | 效果 | 问题 |
|---|---|---|
| 按维度分层 | 范围可用组合表达 | 需要约定命名规则 |
| 扁平大组 | 选取简单 | 组名冗长,语义重叠 |
| 多重路径嵌套 | 灵活 | 变量来源难以判断 |
| 空组长期保留 | 结构看似完整 | 执行命中零主机仍然成功 |
| 主机变量过多 | 个别定制方便 | 差异分散,难以统一变更 |
| 组名使用缩写 | 文件短 | 新人需要额外对照表 |
判断分组设计是否合理,可以用一次典型变更来检验:能否用两个组名的组合精确表达目标范围。若必须列出十几个组才能表达,说明层级维度没有分好。
同一主机同时属于多个同层级的组时,变量的合并顺序需要明确约定,否则同一变量在多处定义会导致取值不确定。