首页/系统与基础设施/自动化运维速查/配置项与事实的映射方法
配置管理与编排60 条

配置项与事实的映射方法

事实映射是把自动采集的运行环境数据(发行版族、内核、CPU 与内存、网段、已装包)当作配置生成的条件与参数来源,替代为每个环境单独维护一套分支配置。它决定同一份模板能否跨发行版、跨机房、跨规格安全复用。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​‌‌​​‌‌​​‌‌​‌​​‌​‌‌​​‌‌‌​‌‌‌​‌​‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌​​‌‌​​‌‌​​​​‌​‌‌​​​‌‌​‌‌‌​‌​​​​‌​‌‌​‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​​​​​‌‌‌​​​​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

事实映射是什么

配置管理里,「事实」(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。具体路径、格式与加载顺序以对应官方文档为准。
不要用事实当破坏性动作的唯一开关。采集失败、值回退为空、字符串与数字类型不一致,都会让分支走错;条件里要有默认值兜底,并对最终结果回读校验。

易错点

  • 用事实做分支却不设默认值:采集失败返回空值时模板渲染报错,或整批主机同时落进错误分支
  • 事实缓存有效期设得太长:机器已扩容或改过网段,缓存里仍是旧值,按旧规格生成的参数会一直生效
  • 把环境差异写死在模板里而不走事实:新增一个发行版就要改模板,模板分叉后无法统一回归
  • 把未校验的事实变量拼进 shell 或路径:值为空时命令会退化成危险形式,删除类操作尤其致命
  • 只看事实不看结果:事实说的是「本来是什么」,不等于配置真的生效,收敛后需回读配置与服务状态确认

数据来源与参考

  • Ansible 官方文档:Facts 采集与自定义 Facts
  • Puppet 官方文档:Facter 与外部事实
  • Salt 官方文档:Grains

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/automation/configuration-fact-mapping.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​‌‌​​‌‌​​‌‌​‌​​‌​‌‌​​‌‌‌​‌‌‌​‌​‌​‌‌‌​​‌​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌​​‌‌​​‌‌​​​​‌​‌‌​​​‌‌​‌‌‌​‌​​​​‌​‌‌​‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​​​​​‌‌‌​​​​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​​‌‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​