快速接入任意脚本输出)
Facter外部Facts指南4种格式JSON/YAML/TXT/可执行文件快速接入任意脚本输出【免费下载链接】facterCollect and display system facts项目地址: https://gitcode.com/gh_mirrors/fa/facterFacter 是一款跨平台的系统信息采集工具自动收集硬件、网络、操作系统等节点信息。通过Facter外部Facts外部事实机制你可以把任意脚本或文件的输出变成标准 fact支持JSON、YAML、TXT、可执行文件4 种格式——无需修改 Facter 一行代码。 什么是 Facter外部FactsFacter 内置了os、networking、processors等核心事实但每个环境总有它采集不到的信息比如业务版本号、部署批次号内部 CMDB 系统登记的资产编号自建监控脚本探测出的健康状态外部 Facts 就是 Facter 的外挂数据通道你把数据写成约定格式的文件放进特定目录Facter 运行时会自动读取并合并进输出结果。数据可以是静态文件JSON/YAML/TXT也可以是动态脚本每次运行实时执行。核心实现见lib/facter/framework/core/fact/external/external_fact_manager.rb外部事实解析入口和lib/facter/framework/core/fact_loaders/external_fact_loader.rb事实加载器整体数据流向可参考docs/data-flow.md。 外部Facts默认目录在哪Facter 按运行用户自动确定外部 facts 目录运行环境默认外部 facts 目录Linux / macOS / Solaris / AIXroot 用户/etc/facter/facts.dLinux / macOS / Solaris / AIX非 root 用户~/.facter/facts.dWindowsC:\ProgramData\facter\facts.d目录不存在时 Facter 会静默跳过不会报错。项目根目录的external_facts/my_external_fact.txt就是一个最小示例内容为my_external_fact123。 目录名可自由取但文件名扩展名决定解析格式见下文且目录中应只放外部事实文件。 4种外部Facts格式详解Facter 按文件扩展名自动选择解析器全部逻辑集中在 parser.rb 中注册TXT →TextParser、JSON →JsonParser、YAML →YamlParser、可执行文件 →ScriptParser。格式一TXT 文本文件最轻量扩展名.txt每行一个事实名值键值对deployment_envproduction asset_idSRV-20260823-001适合少量、扁平的键值对是上手最快的方式。格式二JSON 文件结构化首选扩展名.json顶层为键值对映射支持嵌套能产出结构化事实{ deploy: { version: 1.4.2, channel: stable }, asset_id: SRV-20260823-001 }嵌套键会形成结构化事实deploy.version、deploy.channel在 Puppet 中可按层级取值比 TXT 更强大。格式三YAML 文件多行与注释友好扩展名.yaml语义与 JSON 相同同样支持嵌套但支持注释和更宽松的多行写法适合手工维护deploy: version: 1.4.2 # 由发布流程写入 channel: stable asset_id: SRV-20260823-001⚠️ 小提示YAML 中的时间格式字符串会被 Facter 当作普通字符串处理源码中YamlParser会为其自动加引号避免被误解析成日期对象。格式四可执行文件动态采集神器任何可执行的文件Unix 脚本、批处理等Windows 下支持.bat/.cmd/.ps1都会被 Facter 自动执行。脚本的标准输出支持 3 种形式按优先级自动识别见parser.rb中的parse_executable_outputYAML→ 解析为结构化事实JSON→ 解析为结构化事实keyvalue键值对文本→ 逐行解析为扁平事实一个 bash 脚本示例#!/bin/bash echo build_commit$(git -C /opt/app rev-parse HEAD) echo app_health$(curl -s -o /dev/null -w %{http_code} localhost:8080/health)执行权限记得加chmod x。脚本的stderr 会作为警告输出到 Facter 的 stderr不会污染事实数据方便排查问题。⚙️ 常用命令行选项选项作用facter --external-dir 路径额外指定一个外部 facts 目录可多次使用优先级高于默认目录facter --no-external-facts完全禁用外部 factsfacter 事实名只查询某个事实例如facter deploy.version验证效果只需一条命令facter --yaml查看全部输出或facter my_external_fact单独验证某个事实。 目录优先级与覆盖规则新手最常困惑的问题同名事实到底谁生效 规则如下环境变量事实 外部/自定义 facts同名时环境变量优先外部 fact 同名自定义Rubyfact外部数据天然具有更高权重--external-dir指定目录 默认 facts.d 目录同目录内按文件名字典序加载后加载的会覆盖先加载的同名键以上规则在acceptance/tests/external_facts/下有完整的验收测试用例如fact_directory_precedence.rb、files_containing_external_facts_are_loaded_in_lexicographical_order.rb可作为行为参照。️ 常见坑与最佳实践JSON 解析失败会静默降级若系统缺少 json 库JsonParser只给警告不中断建议统一用 JSON 时确认gem list json脚本要有 shebang 且可执行无执行权限的文件不会被识别为脚本而是被NothingParser忽略事实名建议用小写下划线外部 fact 名即文件中的键名命名风格要和团队规范一致不要把大文件放进去外部 facts 每次运行都会解析可执行脚本每次都会执行保持输出精简需要点号结构化默认.是事实名的一部分而非层级分隔符如需转换可在 facter.conf 中启用force-dot-resolution见Extensibility.md 关键源码与文档速查内容路径4 种格式解析器核心lib/facter/custom_facts/util/parser.rb外部事实解析管理器lib/facter/framework/core/fact/external/external_fact_manager.rb外部事实加载器lib/facter/framework/core/fact_loaders/external_fact_loader.rb官方扩展性说明Extensibility.md整体数据流图docs/data-flow.md外部 facts 验收测试acceptance/tests/external_facts/总结静态数据选 JSON/YAML结构化或 TXT轻量动态数据选可执行文件——四种格式覆盖 99% 的接入场景把文件放进facts.d目录Facter 立刻为你所用。【免费下载链接】facterCollect and display system facts项目地址: https://gitcode.com/gh_mirrors/fa/facter创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考