目标选择与过滤是什么
目标选择解决的是「这批操作到底碰哪些机器」。可选维度包括分组或角色、标签、主机名通配与正则、IP 网段、环境标识,以及从云 API 或 CMDB 实时取数的动态清单。真正的差别在于默认策略:白名单(默认拒绝、只动列明的目标)比黑名单(默认允许、排除少数的危险目标)安全得多,因为新上线主机在后者会默认落进允许范围。
基本信息
| 适用平台 | Ansible patterns、Salt targeting、kubectl 标签选择器、PowerShell -ComputerName 属同一类问题 |
|---|---|
| 常见维度 | 组名、glob 通配、正则、标签表达式、IP 段、环境 |
| 核心要求 | 执行前能打印命中清单并人工或脚本复核 |
| 失败模式 | 静默不匹配:选择结果为空但不报错 |
典型使用场景
- 只对同版本主机做升级,避免版本混杂带来的兼容问题
- 只对某个机房操作,控制爆炸半径与出口带宽占用
- 从云 API 动态取清单,新扩容主机自动纳入管理
- 用排除法剔除刚交付、状态尚未稳定的机器
- 按业务线标签选择,避免误伤同一集群里的其他租户
选择表达式示例
选择表达式示例
ansible 'web:&prod:!canary' --list-hosts # 交集加重排除,只列目标不执行
ansible all --list-hosts -l 'db*' # 通配命中范围先看一眼再决定
ansible 'web' -m ping # 执行前先探活,确认目标可达
kubectl get pods -l 'app=api,tier!=cache' # 标签选择器同样支持不等与集合运算
ip -br addr | grep -c '10\.20\.' # 按网段核对实际命中的主机数过滤维度与风险
| 维度 | 示例 | 主要风险 |
|---|---|---|
| 分组角色 | web、db、redis | 组定义过时,漏选或误选 |
| 主机名通配 | web* | 通配过宽把生产一起命中 |
| 标签表达式 | env=prod,role=api | 标签缺失时默认不匹配,静默漏选 |
| IP 网段 | 10.20.0.0/16 | 网段划分与实际业务边界不一致 |
| 动态清单 | 云厂商 API 查询 | 缓存未刷新,新机器不在清单或旧机器残留 |
多数工具的清单模式支持「只列目标不执行」,这是投入产出比最高的一道保险:把命中清单落盘、统计条数、与预期对比之后再真正执行。
标签或清单项缺失时,工具通常是静默不匹配而非报错。应把「目标数为 0」和「目标数突变」都接入告警,否则最容易出现以为变更已生效、实际一台没动的情况。