You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法在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 -%>

关键说明

  1. 预加载关联:在load_hosts中添加:puppetclasses或:reported_data预加载,避免重复查询数据库,提升模板执行效率。
  2. 安全模式兼容性:代码中使用的each、any?、name等方法均属于Foreman安全模式白名单,无需关闭安全模式。
  3. 空值处理:使用&.和|| 'N/A'处理可能的空属性,避免模板报错。

内容的提问来源于stack exchange,提问作者Zeph B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:05:16