无法在Foreman中创建正确报告模板以获取各主机模块列表
Foreman报告模板提取Puppet ENC模块列表(安全模式兼容)
核心思路
在安全模式下,Foreman允许访问host.puppetclasses(主机通过ENC分配的Puppet类/模块)或host.reported_data(Puppet报告中的实际运行模块状态)这两个白名单属性,通过它们可提取模块列表并生成yes/no状态输出。
修改后的报告模板代码
方案1:提取主机已分配的所有Puppet模块
直接输出主机通过ENC分配的所有模块,标记为yes:
<%- load_hosts(search: input('Hosts filter'), preload: [:operatingsystem, :architecture, :organization, :location, :primary_interface, :puppetclasses]).each_record do |host| -%> Hostname: <%= host.name %> FQDN: <%= host.primary_interface&.fqdn || 'N/A' %> IP: <%= host.ip %> OS: <%= host.os&.name || 'N/A' %> Primary Interface: <%= host.primary_interface&.identifier || 'N/A' %> <%# 输出已分配的Puppet模块 %> <% if host.puppetclasses.any? %> <% host.puppetclasses.each do |pclass| -%> <%= pclass.name %>: yes <% end -%> <% else %> No Puppet modules assigned <% end %> <% end -%>
方案2:针对指定模块列表检查状态
预定义需要检查的模块列表,逐个判断主机是否启用并输出yes/no:
<%- load_hosts(search: input('Hosts filter'), preload: [:operatingsystem, :architecture, :organization, :location, :primary_interface, :puppetclasses]).each_record do |host| -%> Hostname: <%= host.name %> FQDN: <%= host.primary_interface&.fqdn || 'N/A' %> IP: <%= host.ip %> OS: <%= host.os&.name || 'N/A' %> Primary Interface: <%= host.primary_interface&.identifier || 'N/A' %> <%# 定义需要检查的模块列表 %> <%- desired_modules = ['apache', 'nginx', 'mysql', 'redis'] -%> <% desired_modules.each do |mod| -%> <%= mod %>: <%= host.puppetclasses.any? { |pc| pc.name == mod } ? 'yes' : 'no' %> <% end -%> <% end -%>
方案3:从Puppet报告提取实际运行的模块状态
获取模块实际运行的成功/失败状态,从reported_data中提取:
<%- load_hosts(search: input('Hosts filter'), preload: [:operatingsystem, :architecture, :organization, :location, :primary_interface, :reported_data]).each_record do |host| -%> Hostname: <%= host.name %> FQDN: <%= host.primary_interface&.fqdn || 'N/A' %> IP: <%= host.ip %> OS: <%= host.os&.name || 'N/A' %> Primary Interface: <%= host.primary_interface&.identifier || 'N/A' %> <%# 从Puppet报告中提取模块运行状态 %> <% if host.reported_data && host.reported_data['resources'] && host.reported_data['resources']['classes'] %> <% host.reported_data['resources']['classes'].each do |class_name, status| -%> <%= class_name %>: <%= status == 'success' ? 'yes' : 'no' %> <% end -%> <% else %> No Puppet report data available <% end %> <% end -%>
关键说明
- 预加载关联:在
load_hosts中添加:puppetclasses或:reported_data预加载,避免重复查询数据库,提升模板执行效率。 - 安全模式兼容性:代码中使用的
each、any?、name等方法均属于Foreman安全模式白名单,无需关闭安全模式。 - 空值处理:使用
&.和|| 'N/A'处理可能的空属性,避免模板报错。
内容的提问来源于stack exchange,提问作者Zeph B
相关产品推荐
相关产品推荐

