如何管理Puppet自定义fact与其依赖的gem模块的依赖关系
Puppet自定义fact依赖gem的最优管理方案
问题根因
你遇到的报错本质是两个问题:
- 你在fact中用
require_relative加载rbvmomi属于用法错误,rbvmomi是Ruby gem模块,不是你自定义的同目录工具文件,应该用require从gem搜索路径加载 - Puppet Agent使用自带的独立Ruby环境,系统安装的gem不会被Puppet识别,且你没有提前在Agent的Puppet Ruby环境中安装rbvmomi、optimist等依赖
最优实现方案
- 第一步:使用Puppet官方的puppet_gem包提供者安装依赖gem
直接在配置Agent的Manifest中添加如下资源,确保依赖安装到Puppet内嵌的Ruby环境中,不要用系统gem命令安装:
package { ['rbvmomi', 'optimist']: ensure => 'installed', provider => 'puppet_gem', }
如果需要固定版本,把ensure值改成对应的版本号即可。
- 第二步:调整自定义fact代码,增加容错逻辑和加载优先级
修改fact代码,把依赖加载逻辑放到异常捕获块中,避免依赖缺失导致整个Fact解析失败,同时提高fact权重确保依赖安装完成后再执行解析:
# frozen_string_literal: true require 'pathname' Facter.add('custom_attributes') do # 权重越高执行越晚,确保依赖安装完成后再解析 has_weight 100 setcode do begin # 加载自定义工具类(需同步到同目录) require_relative 'vm_tag_utility' # 从gem路径加载第三方依赖 require 'rbvmomi' require 'rbvmomi/optimist' require 'optimist' rescue LoadError # 依赖缺失时返回空值,不抛出异常影响其他Fact运行 {} else hostname = Facter.value('hostname') VmTagUtility.get_vm_custom_attributes(hostname) end end end
第三步:同步自定义工具类到Agent
你用到的vm_tag_utility.rb属于自定义工具文件,需要放到你编写Fact的模块的lib/facter/目录下,这样Puppet的pluginsync机制会自动把该文件和Fact一起同步到Agent的缓存目录,确保require_relative可以正常加载。第四步:调整执行顺序避免首次运行报错
如果需要首次运行就正常解析Fact,可以通过Puppet的run_stage功能把gem安装的执行阶段放到主配置运行阶段之前,确保gem安装完成后才会执行Fact解析逻辑。
注意事项
- Windows节点需要确保Puppet服务运行账号有写入Puppet内嵌Ruby库目录的权限,否则gem会安装失败
- 内网环境需要提前配置puppet_gem的源地址,避免无法访问公网gem源导致安装失败
内容的提问来源于stack exchange,提问作者Jeremy Sylvis
相关产品推荐
相关产品推荐

