ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Puppet 实战:基于 Hiera 5 与 YAML 后端的层次化数据分层与 Fact 驱动覆盖

Puppet 实战:基于 Hiera 5 与 YAML 后端的层次化数据分层与 Fact 驱动覆盖 运维DevOpsIaC【免费下载链接】puppetServer automation framework and application项目地址https://gitcode.com/gh_mirrors/pu/puppet点击查看免费下载导读本文以 Puppet 仓库中的 examples/hiera 完整示例为骨架系统讲解 Hiera 5hiera.yaml 版本 5配合 YAML 数据后端的配置方法、层级hierarchy解析顺序、模块默认值、站点级覆盖与 Fact 驱动的节点差异化配置。读完本文后你将能独立搭建一套模块默认值 → 站点公共数据 → 按 Fact 分层的环境数据的多层数据体系并理解lookup()函数、data_hash提供者与 EPP 模板在其中的实际协作方式。一、示例概览一个可直接运行的 Hiera YAML Demoexamples/hiera目录是 Puppet 官方仓库中一个可直接运行的 Hiera YAML backend 演示它由四部分构成组成位置作用NTP 模块examples/hiera/modules/ntp通过默认参数管理/tmp/ntp.conf默认使用pool.ntp.org服务器YAML 数据源examples/hiera/data站点级 YAML 数据供用户在文件中覆盖模块默认值Users 模块examples/hiera/modules/users一组仅做notify的演示类用于验证哪些类被包含进 catalogclasses 键各 YAML 数据文件用 Hiera 数据键classes决定节点上要 include 的类集合整个示例的入口清单为examples/hiera/ ├── hiera.yaml # Hiera 5 配置定义层级与数据目录 ├── site.pp # node default { include lookup(classes) } ├── data/ │ ├── common.yaml # 站点级公共数据 │ └── dc1.yaml # dc1 位置专用数据 └── modules/ ├── ntp/ # NTP 模块含模块内 hiera.yaml 与 data/common.yaml └── users/ # users::common / users::dc1 演示类所有示例均假设已安装 puppet-agent、已克隆本仓库并且以examples/hiera为当前工作目录cwd执行命令。二、Hiera 5 配置解析hierarchy 层级与 data_hash2.1 站点级 hiera.yamlexamples/hiera/hiera.yaml 是站点级配置采用 Hiera 5 格式--- version: 5 defaults: datadir: data data_hash: yaml_data hierarchy: - name: Per Location path: %{facts.location}.yaml - name: Per Environment path: %{facts.environment}.yaml - name: Common Data path: common.yaml关键点说明version: 5声明使用 Hiera 5 配置格式层级中的path支持插值interpolation这是 Hiera 5 相较旧版本的核心增强。defaults为层级统一定义默认值。datadir: data表示数据文件目录相对当前配置文件的data/子目录data_hash: yaml_data指定数据加载方式为 YAML。hierarchy顺序即查找顺序Per Location → Per Environment → Common Data自上而下第一个命中数据的层级生效first found wins。关于yaml_data在 Puppet 源码中它是注册在 lib/puppet/functions/yaml_data.rb 里的一个 Hiera 5data_hash数据提供者函数与json_data、hocon_data等同属一类。其实现逻辑为根据options中的path/paths/glob/globs/mapped_paths定位数据文件并解析为 Hash。若配置中未声明这些路径选项函数会抛出must be declared in hiera.yaml的校验错误见 yaml_data.rb 附近因此示例中datadirpath的组合是必须的。2.2 层级顺序的源码级印证Hiera 配置的解析与层级遍历由lib/puppet/pops/lookup/目录下的源码支撑例如 hiera_config.rb 负责读取并结构化 hiera.yaml而层级查找遵循第一个有数据的层级即返回的语义。也就是说层级越靠前优先级越高。在本文示例中由于data/common.yaml已经声明了ntpservers键查找ntp::config::ntpservers时 Per Location / Per Environment 层级若无数据最终必然命中 Common Data 层级模块类内默认值永远不会被搜索到详见下文查找顺序总结。三、模块默认值从 Forge 式模块到本地 Hiera3.1 NTP 模块内部的默认数据NTP 模块遵循模块自带默认数据的现代 Puppet 实践。模块内同样有一份独立的 Hiera 配置 modules/ntp/hiera.yaml--- version: 5 defaults: datadir: data data_hash: yaml_data hierarchy: - name: Common Data path: common.yaml其数据文件 modules/ntp/data/common.yaml 定义了模块级默认值--- ntp::config::ntpservers: - 1.pool.ntp.org - 2.pool.ntp.org3.2 类与模板如何消费数据modules/ntp/manifests/config.pp 定义了带参数的类class ntp::config( Array[String[1], 1] $ntpservers undef, ) { file { /tmp/ntp.conf: content epp(ntp/ntp.conf.epp) } }参数类型约束为Array[String[1], 1]至少一个非空字符串组成的数组默认值undef意味着如果 Hiera 中查不到ntp::config::ntpservers类参数会保持 undef而 EPP 模板 modules/ntp/templates/ntp.conf.epp 遍历该数组逐行生成server指令% $ntp::config::ntpservers.each |$server| { -% server % $server % % } -%说明该模板直接引用类参数$ntp::config::ntpservers类变量全局可见因此只要 Hiera 提供了该键/tmp/ntp.conf就会按数据渲染出对应服务器地址。3.3 场景 A只使用模块默认值操作注释掉 data/common.yaml 的第 6–8 行即ntp::config::ntpservers声明让站点级数据不再覆盖模块默认值$ sed -i 6,8 s/^/#/ data/common.yaml $ puppet apply site.pp --hiera_confighiera.yaml --modulepathmodules预期输出实际以你环境中的时间为准Notice: Compiled catalog for node.corp.com in environment production in 0.04 seconds Notice: Adding users::common Notice: /Stage[main]/Users::Common/Notify[Adding users::common]/message: defined message as Adding users::common Notice: /Stage[main]/Ntp::Config/File[/tmp/ntp.conf]/ensure: defined content as {sha256}949c7247dbe0870258c921418cc8b270afcc57e1aa6f9d9933f306009ede60d0 Notice: Applied catalog in 0.02 seconds $ cat /tmp/ntp.conf server 1.pool.ntp.org server 2.pool.ntp.org结果验证/tmp/ntp.conf包含pool.ntp.org的两个地址来自模块默认数据users::common类出现在 catalog 中来自common.yaml中的classes列表。关键认知即便注释了站点级ntpserversHiera 查找仍会命中模块自带的data/common.yaml——这正是模块默认值 站点覆盖两层数据模型的落地。四、站点级覆盖data/common.yaml 的优先级4.1 数据文件内容data/common.yaml 是站点级公共数据同时承担两类职责--- classes: - users::common - ntp::config ntp::config::ntpservers: - ntp1.example.com - ntp2.example.com lookup_options: classes: merge: uniqueclasses由site.pp中include lookup(classes)消费决定节点默认包含哪些类ntp::config::ntpservers站点级 NTP 服务器覆盖lookup_options声明classes键在跨层级合并时的策略为unique取并集、去重这正是下文 dc1 场景中users::common与users::dc1同时出现的原因。4.2 场景 B恢复覆盖验证生效操作恢复common.yaml第 6–8 行的注释$ sed -i 6,8 s/^#// data/common.yaml $ puppet apply site.pp --hiera_confighiera.yaml --modulepathmodules预期输出Notice: Compiled catalog for node.corp.com in environment production in 0.04 seconds Notice: Adding users::common Notice: /Stage[main]/Users::Common/Notify[Adding users::common]/message: defined message as Adding users::common Notice: /Stage[main]/Ntp::Config/File[/tmp/ntp.conf]/content: content changed {sha256}949c7247dbe0870258c921418cc8b270afcc57e1aa6f9d9933f306009ede60d0 to {sha256}28ced955a8ed9efd7514b2364fe378ba645ab947f26e8c0b4d84e8368f1257a0 Notice: Applied catalog in 0.02 seconds $ cat /tmp/ntp.conf server ntp1.example.com server ntp2.example.com结果验证内容校验和由949c72...变为28ced9.../tmp/ntp.conf更新为ntp1.example.com/ntp2.example.com站点级数据覆盖了模块默认值但users::common依然在 catalog 中。这说明模块默认值处于数据链最低优先级站点common.yaml只要声明同名键即胜出first found wins。五、Fact 驱动覆盖按 location 分流节点数据5.1 dc1 专属数据文件data/dc1.yaml 针对locationdc1的节点提供两份覆盖--- ntp::config::ntpservers: - ntp1.dc1.example.com - ntp2.dc1.example.com classes: - users::dc1配合hiera.yaml的第一层path: %{facts.location}.yaml当节点的locationfact 为dc1时dc1.yaml自动成为最高优先级数据源。5.2 场景 Cdc1 节点操作通过环境变量FACTER_locationdc1注入 fact无需修改任何 manifest$ FACTER_locationdc1 puppet apply site.pp --hiera_confighiera.yaml --modulepathmodules预期输出Notice: Compiled catalog for node.corp.com in environment production in 0.04 seconds Notice: Adding users::dc1 Notice: /Stage[main]/Users::Dc1/Notify[Adding users::dc1]/message: defined message as Adding users::dc1 Notice: Adding users::common Notice: /Stage[main]/Users::Common/Notify[Adding users::common]/message: defined message as Adding users::common Notice: /Stage[main]/Ntp::Config/File[/tmp/ntp.conf]/content: content changed {sha256}28ced955a8ed9efd7514b2364fe378ba645ab947f26e8c0b4d84e8368f1257a0 to {sha256}39227f1cf8d09623d2e66b6622af2e8db01ab26f77a5a2e6d6e058d0977f369b Notice: Applied catalog in 0.02 seconds $ cat /tmp/ntp.conf server ntp1.dc1.example.com server ntp2.dc1.example.com结果验证dc1 节点会获得类集合users::dc1users::common同时出现。因为lookup_options.classes.merge: unique两个数据层的classes列表被合并去重NTP 配置/tmp/ntp.conf更新为ntp1.dc1.example.com/ntp2.dc1.example.com。5.3 场景 Ddc2 节点回退到站点默认dc2没有专属数据文件因此 Hiera 沿层级逐级下探最终命中common.yaml$ FACTER_locationdc2 puppet apply site.pp --hiera_confighiera.yaml --modulepathmodules预期输出Notice: Compiled catalog for node.corp.com in environment production in 0.04 seconds Notice: Adding users::common Notice: /Stage[main]/Users::Common/Notify[Adding users::common]/message: defined message as Adding users::common Notice: /Stage[main]/Ntp::Config/File[/tmp/ntp.conf]/content: content changed {sha256}39227f1cf8d09623d2e66b6622af2e8db01ab26f77a5a2e6d6e058d0977f369b to {sha256}28ced955a8ed9efd7514b2364fe378ba645ab947f26e8c0b4d84e8368f1257a0 Notice: Applied catalog in 0.02 seconds $ cat /tmp/ntp.conf server ntp1.example.com server ntp2.example.com结果验证users::dc1不再出现dc2.yaml 不存在classes只来自 common.yamlNTP 配置回退为站点默认ntp1.example.com/ntp2.example.com。这就是典型的少数节点特化、多数节点共享默认的数据策略。六、查找顺序总结为 dc2 新建覆盖的三种位置原文档明确指出若要为locationdc2的机器创建覆盖数据可以在以下位置放置文件Hiera按此顺序搜索第一个有数据的层级命中data/dc2.yaml—— 按位置最高优先级data/environment.yaml—— 按环境如data/production.yamldata/common.yaml—— 站点公共数据兜底data/dc2.yaml # 1. Per Location data/environment.yaml # 2. Per Environment data/common.yaml # 3. Common Data兜底重要结论在本示例中由于common.yaml已经声明了ntpservers键类内部的默认值永远不会被搜索到——层级查找会在命中common.yaml时立即返回不会继续下探到模块数据。这解释了模块默认值只在没有任何站点数据覆盖时才生效这一 Hiera 5 的核心语义。七、从示例到生产可复用的实战要点7.1 完整命令模板在任何包含hiera.yaml的目录中均可按以下形式运行示例puppet apply site.pp --hiera_confighiera.yaml --modulepathmodules--hiera_config显式指定 Hiera 配置文件Hiera 5 格式--modulepath指定模块搜索路径此处为示例内的modules/FACTER_factvalue通过环境变量临时注入 fact用于模拟不同节点属性无需修改节点事实库。7.2 设计模式提炼模式实现方式示例位置模块自带默认值模块内hiera.yamldata/common.yamlmodules/ntp/data/common.yaml站点公共覆盖站点级data/common.yaml声明同名键data/common.yaml按 Fact 分流hierarchy 中使用%{facts.location}.yaml等插值路径hiera.yaml按环境分流hierarchy 中使用%{facts.environment}.yamlhiera.yaml键级合并策略lookup_optionsmerge: uniquedata/common.yaml数据驱动类选择site.pp中include lookup(classes)site.pp7.3 源码延伸阅读若想深入 Hiera 5 的底层实现可继续阅读lib/puppet/functions/yaml_data.rbyaml_datadata_hash 提供者实现YAML 文件加载与校验lib/puppet/pops/lookup/hiera_config.rbHiera 配置文件解析与层级结构建模lib/puppet/pops/lookup/data_provider.rb数据提供者抽象及data_hash返回值校验必须是 Hash。7.4 实践注意事项层级顺序即优先级hierarchy中越靠前的层优先级越高务必把最具体的层如 location放在最前面first found wins任何一层命中键即停止查找因此兜底层common.yaml永远放最后模块默认值是最后一道防线只要站点任一层级声明了同名键模块默认值即失效lookup_options是键级策略它本身也参与层级查找用于为classes这类聚合键声明unique合并避免多层数据互相覆盖类列表fact 插值用%{facts.xxx}语法在 Hiera 5 的path中引用 fact 时使用该形式查找时自动替换为节点实际值环境变量注入 fact 仅用于演示生产环境应依赖真实的 facter 事实或 ENC 提供的数据。结语examples/hiera用不足百行的配置、数据与模块完整演示了 Puppet Hiera 5 YAML 后端从模块默认值 → 站点公共数据 → Fact 驱动特化的三层数据协作模型。它既是学习 Hiera 层级语义的最佳入门实验也是生产环境中按位置、按环境分层管理数据的可复用样板。结合yaml_data与hiera_config等源码你可以在自己的基础设施中快速复刻这套少数特化、多数兜底的数据分层体系。赞分享运维DevOpsIaC【免费下载链接】puppetServer automation framework and application项目地址https://gitcode.com/gh_mirrors/pu/puppet点击查看免费下载相关推荐Audiobookshelf 服务端 OpenAPI 规范基于 Redocly 的分层 YAML 管理与文档生成实战Audiobookshelf 服务端 OpenAPI 规范基于 Redocly 的分层 YAML 管理与文档生成实战 本指南围绕 docs/README.md后端音视频前端NeMo Evaluator 配置深度解析基于 Hydra 的分层覆盖系统与实战配置指南NeMo Evaluator 配置深度解析基于 Hydra 的分层覆盖系统与实战配置指南 本指南系统讲解 NeMo EvaluatorNVIDIA 企业级AI 技能人工智能大模型深度学习ChatGPT Shortcut 浏览器扩展使用指南三种显示模式、语言适配与 AltShiftS 快捷键ChatGPT Shortcut 浏览器扩展使用指南三种显示模式、语言适配与 AltShiftS 快捷键 ChatGPT ShortcutAiShortAI 应用提示工程人工智能前端上一篇blendergltf 插件全场景解决方案从环境配置到引擎兼容优化下一篇5步掌握Counterfeit-V3.0AI图像生成从入门到精通创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表