如何在自定义Puppet fact中访问当前节点名称
在自定义Puppet fact中获取节点证书名的方法
两种可靠方案都能拿到和清单中$trusted['certname']完全一致的节点证书名:
- 读取内置
clientcert事实
这是最简便的实现方式。clientcert是Puppet agent运行时自动注入Facter上下文的核心内置事实,取值和trusted域存储的certname完全匹配。在自定义fact代码中直接通过Facter.value接口调用即可:
注意:如果你手动在命令行单独执行# 对应路径 lib/facter/my_custom_fact.rb Facter.add(:my_custom_fact) do setcode do node_certname = Facter.value(:clientcert) # 后续编写自定义fact的业务逻辑即可 end endfacter命令测试自定义fact,脱离Puppet agent运行上下文时,这个值可能回退为节点的FQDN,属于正常表现;在Puppet agent正常执行fact收集、编译catalog的标准流程中,该值始终为准确的节点证书名。 - 直接读取Puppet配置项(适用于防篡改要求高的场景)
如果你担心clientcert事实被其他自定义逻辑意外覆盖,可以直接加载Puppet配置读取certname,这种方式的取值和$trusted['certname']完全同源,不会被任何上层fact逻辑篡改:# 对应路径 lib/facter/my_custom_fact.rb require 'puppet' Facter.add(:my_custom_fact) do setcode do # 手动执行facter测试时需要初始化Puppet配置,agent正常运行时配置已预加载 Puppet.initialize_settings unless Puppet.settings.app_defaults_initialized? node_certname = Puppet.settings[:certname] # 后续编写自定义fact的业务逻辑即可 end end
你之前在Facter可用事实列表里没找到对应条目,是因为clientcert容易和hostname、fqdn这类通用主机名事实混淆,它本身就是默认存在、专门存储节点证书名的内置事实。
内容的提问来源于stack exchange,提问作者hoffmanc
相关产品推荐
相关产品推荐

