事实映射是什么
配置管理里,「事实」(fact)指目标机自报的现状数据:发行版族与主版本、内核、CPU 核数与内存、网卡与地址、挂载点、已装软件包等;「配置项」指你希望它变成的目标状态。事实映射就是把前者当作条件判断与参数取值的来源去生成后者,而不是给每个环境维护一份分支配置。它回答的是同一份模板如何跨发行版、跨机房、跨硬件规格安全复用的问题。
基本信息
| 适用平台 | Ansible、Puppet、Chef、Salt、Kubernetes 等声明式配置管理 |
|---|---|
| 事实来源 | 目标机系统接口与命令采集:Ansible setup、Puppet Facter、Chef Ohai、Salt grains |
| 映射手段 | 模板变量注入、条件分支、选择器匹配、标签筛选 |
| 关键约束 | 事实是采样值,有采集开销与过期风险 |
典型使用场景
- 按发行版族选择包名与服务名:httpd 与 apache2、apt 与 yum
- 按 CPU 核数与内存推导工作进程数、连接池上限与堆大小
- 按机房或网段选择镜像源、NTP 服务与日志后端
- 按硬件型号与网卡类型决定内核参数、队列深度与模块加载
- 把事实回流到资产库与监控标签,让报表与真实环境一致
- 作为灰度分组依据:先在小规格或边缘节点试跑再全量
Ansible 中的事实映射
Ansible 中的事实映射
- name: 先采集事实,再据其分支生成配置
hosts: all
gather_facts: true
tasks:
- name: 按发行版族选择包名
ansible.builtin.package:
name: "{{ 'httpd' if ansible_os_family == 'RedHat' else 'apache2' }}"
state: present
- name: 按内存推导参数(比例需按业务压测校准)
ansible.builtin.template:
src: app.conf.j2
dest: /etc/app/app.conf
vars:
heap_mb: "{{ (ansible_memtotal_mb * 0.5) | int }}"
- name: 事实落盘留档,便于事后核对当时依据
ansible.builtin.copy:
content: "{{ ansible_facts | to_nice_json }}"
dest: /var/log/ansible-facts.json事实类别与用途对照
| 事实类别 | 常见取值 | 典型用途 | 过期后的风险 |
|---|---|---|---|
| 发行版族 | ansible_os_family、os.family | 包名与服务名分支 | 代系混用时落进错误分支 |
| 硬件规格 | 内存总量、CPU 核数、磁盘 | 进程数、堆大小、并发度 | 扩容后仍按旧规格取值 |
| 网络 | 网卡、地址、网关 | 镜像源、NTP、出口路由 | 换网后流量走错出口 |
| 软件状态 | 已装包、服务、内核模块 | 幂等判断、版本对齐 | 手工改动后与配置漂移 |
业务属性(机房、业务线、负责人)更适合做成自定义事实:Ansible 读 /etc/ansible/facts.d/ 下的 .fact 文件,Puppet 读 /etc/facter/facts.d/,Salt 写 /etc/salt/grains。具体路径、格式与加载顺序以对应官方文档为准。
不要用事实当破坏性动作的唯一开关。采集失败、值回退为空、字符串与数字类型不一致,都会让分支走错;条件里要有默认值兜底,并对最终结果回读校验。