Puppet自定义Provider参数错误 如何排查模块与Type/Provider传参
Puppet自定义Provider传参排查方案
问题背景
编写Puppet自定义Provider时运行Puppet触发如下报错:
Could not autoload puppet/provider/vault_auth/vault_auth: Function Load Error for function'vault_cert::vault_auth': wrong number of arguments (given 0, expected1) Error: Failed to apply catalog: Could not autoload puppet/type/vault_auth: Could not autoload puppet/provider/vault_auth/vault_auth: Function Load Error for function 'vault_cert::vault_auth': wrong number of arguments (given 0, expected 1)
已尝试debug/test/trace运行模式,仅能获取堆栈信息无有效排查线索;模块内部可正常打印全量变量值,但无法在Provider侧执行同类操作验证参数传递链路是否正常,因代码为内部资产不便公开,仅咨询Type/Provider与模块间传参的可行排查方案。
排查操作步骤
- 优先定位当前报错根因:报错发生在Provider自动加载阶段,此时Puppet还未进入资源实例化、参数传递的流程,是加载Provider文件本身时,文件内某段顶层执行的代码调用了
vault_cert::vault_auth函数,且调用时没有传入函数要求的1个必填参数,可先全局搜索Provider文件内所有调用该函数的位置,核对传参写法。 - Provider侧捕获入参:在Provider的
instances、prefetch或initialize方法最开头插入调试打印语句,通过Puppet.debug "Provider接收资源参数: #{@resource.to_hash}"输出全量入参,执行Puppet命令时携带--debug参数即可打印所有传入的参数键值对,该操作仅新增日志逻辑,不会影响原有业务执行。 - 导出编译后catalog核对参数:执行命令导出编译完成的catalog文件,直接检索对应
vault_auth资源块,即可确认manifest层到编译层的参数是否完整:
如果导出的catalog里资源参数齐全,问题出在Provider加载/执行逻辑;如果catalog内参数缺失,问题出在Type定义或manifest层的参数声明。# 单机apply场景 puppet apply --write_catalog=./target_catalog.json your_manifest.pp # master-agent场景 puppet master --compile <目标节点名> > ./target_catalog.json - 交互式断点调试:提前在Ruby环境安装pry依赖,在Provider代码、自定义函数代码的可疑位置插入断点语句
require 'pry'; binding.pry,运行Puppet时会自动进入交互式调试终端,可逐行执行代码、查看当前作用域下的所有变量值与完整调用栈,定位效率高于纯日志打印。 - 自定义函数入口捕获传参:在
vault_cert::vault_auth函数定义的最开头,打印传入的参数列表与调用栈信息,即可确认自动加载阶段该函数被谁调用、调用时传了什么值,直接定位漏传参数的调用位置。
内容的提问来源于stack exchange,提问作者Barry
相关产品推荐
相关产品推荐

