官网:https://ocsinventory-ng.org/
OCS资产管理服务器由4个主要组件组成:
- 数据库服务器,用于存储库存信息(MySQL)
- 通信服务器,处理数据库服务器和代理之间的 HTTP/HTTPS 通信
- 管理控制台,允许管理员使用他们最喜欢的浏览器查询数据库服务器
- 部署服务器,存储所有包部署配置
安装服务器端
本次安装使用 docker-compose,docker-compose.yml 位于:https://github.com/OCSInventory-NG/OCSInventory-Docker-Image/blob/master/2.12.3/docker-compose.yml,安装的是当前最新版 2.12.3。
请注意,docker-compose.yml 里的 volumns 里用了当前目录 ‘./sq/l’、’./nginx/’,因此建议直接克隆源代码,再 cd 到 2.12.3 目录下去装,否则可能会出问题,具体安装过程如下:
- 第一步:克隆
https://github.com/OCSInventory-NG/OCSInventory-Docker-Image/tree/master
,解压到 Ubuntu22服务器 - 第二步:
cd /home/OCSInventory-Docker-Image/2.12.3
- 第三步:执行
docker-compose up -d
- 第四步:打开网站
http://192.168.3.226/ocsreports/
,点击“执行更新”按钮,默认登录账密是:admin/admin
目前 REST API 功能仅仅支持检索数据,这是官方原话:At the moment our REST API only support GET, so the POST / DELETE / PUT routes md files will be empty.
参考:
OCS Inventory 官方文档
GitHub地址
OCS Inventory NG 2.8 server with docker-compose!
安装客户端代理
给 Windows 系统安装代理
安装过程很简单,只需配置一个 OCS Inventory 服务器的地址。
给 Linux 系统安装代理(Ubuntu)
第一步:安装依赖
sudo apt install libmodule-install-perl dmidecode libxml-simple-perl libcompress-zlib-perl libnet-ip-perl libwww-perl libdigest-md5-perl libdata-uuid-perl
第二步:安装代理
# 下载 OCS Inventory Agent wget https://github.com/OCSInventory-NG/UnixAgent/releases/download/v2.10.0/Ocsinventory-Unix-Agent-2.10.0.tar.gz # 解压缩 tar -xzvf Ocsinventory-Unix-Agent-2.10.4.tar.gz # 进入目录 cd Ocsinventory-Unix-Agent-2.10.4 # 运行安装脚本 sudo perl Makefile.PL sudo make sudo make install
- 在执行 perl Makefile.PL 时,安装脚本会向您提问一系列配置问题,如:
- (1)Where do you want to write the configuration file? –> 推荐选2
- (2)Do you want to create the directory /etc/ocsinventory-agent? –> 输入 y 以便代理可以定期运行
- (3)Should the old unix_agent settings be imported? –> 如果是全新安装,可以选择 n。
- (4)What is the address of your ocs server? –>输入服务器地址 http://192.168.3.226/ocsinventory
- (5)Do you need credential for the server? (You probably don’t) –>输入 n
- (6)Do you want to apply an administrative tag on this machine? –>输入 y 后写一个 tag
- (7)Do yo want to install the cron task in /etc/cron.d? –>输入 y
- (8)Do you want disable SSL CA verification configuration option? –>输入 y
- (9)Do you want to set CA certificates file path? –>输入 n
- (10)Do you want disable software inventory? –>输入 n
- (11)Do you want to use OCS-Inventory software deployment feature? –>输入 y
- (12)Do you want to use OCS-Inventory SNMP scans feature? –>输入 y
- (13)Do you want to send an inventory of this machine? –>输入 y,若输入n表示跳过首次盘点,因为有计划任务,稍后服务器还会自动找到
在安装过程中,有个 Do you want to install the cron task…?
这个操作在 /etc/cron.d/ocsinventory-agent
目录下创建了一个计划任务。这个计划任务会定期自动运行 OCS 代理。默认情况下,代理会每天在一个随机的时间点运行,以避免成千上万的客户端在同一时刻冲击服务器。当这个计划任务第一次成功运行时,代理会收集计算机的硬件和软件信息,将其发送到您配置的服务器 URL。此时,OCS 服务器就会收到数据,自动创建这台新计算机的记录,然后您就能在 Web 控制台中看到它了。您不必等待计划任务自动运行。您可以随时手动强制代理运行一次,这对于测试和验证非常有用。只需在 Ubuntu 终端中执行以下命令即可:sudo ocsinventory-agent
配置文件位置
装完后,配置文件位于 /etc/ocsinventory-agent/ocsinventory-agent.cfg
,cron 任务计划的配置位于 /etc/cron.d/ocsinventory-agent
。
Cron任务计划里的 –lazy
装完代理后,在 /etc/cron.d/ocsinventory-agent
中会有一条 57 5 * * * root /usr/local/bin/ocsinventory-agent --lazy > /dev/null 2>&1
定时计划,这表示在每天凌晨 5:57,系统会执行后面的命令。 注意这里的 –lazy 参数。
--lazy
选项告诉代理程序以“懒惰”模式运行。它的工作方式如下:当 Cron 在凌晨 5:57 触发命令时,代理程序并不会立即联系服务器。相反,它会先检查自己本地的配置文件,读取一个名为 PROLOG_FREQ的值。这个值是代理上一次成功联系服务器时,从服务器那里获取到的“联系频率”(以小时为单位)。代理会计算自上次成功联系服务器以来,是否已经过去了 PROLOG_FREQ 小时。如果时间还没到,代理会什么也不做,然后安静地退出。
总结:–lazy 模式将控制权交还给了服务器。 即使您的 Cron 任务每天运行,但实际的联系频率仍然由您在 OCS 网页控制台设置的 PROLOG_FREQ (联系频率) 参数决定。这是一种非常高效的机制,可以避免不必要的网络流量。这个 PROLOG_FREQ 参数在配置的”服务器”选项卡里,不在”盘点”选项卡,默认值是24小时。
安装插件
第一步:服务器端安装
在服务器上安装一个插件,需要依次在 管理服务器 和 通信服务器 上进行操作。我这里使用的是 docker-compose,它们都在一个 ocsapplication 服务上。
管理服务器上
以安装 runningprocess 插件为例,先去官网下载,然后容器的 http://usr/share/ocsinventory-reports/ocsreports/extensions/ 目录下,由于这个目录已被映射出来了,因此直接放 ocsreportsdata 即可,记得要解压,解压后删除zip文件,如图:

接着去管理控制台安装:

装好要退出,重新登录。
通信服务器上
接下来,要让负责接收客户端数据的通信服务器也能“认识”这个新插件。官方推荐使用自动化脚本 install_plugin.py
来做这个事,只需在服务器端执行下面命令即可:
# 1. 安装 python3 和 scp 库,scp库是执行自动化安装脚本所必需的(注意:为了简单起见,这里用了 docker exec,没有去做上层镜像) docker exec -it ocsinventory-server bash -c 'apt-get update && apt-get install -y python3 python3-pip && pip3 install scp -i https://pypi.tuna.tsinghua.edu.cn/simple' # 2. 执行自动化安装脚本 docker exec -it ocsinventory-server bash -c 'cd /usr/share/ocsinventory-reports/ocsreports/tools/ && python3 install_plugin.py' # 3. 完成后务必重启通信服务器的 Apache 服务,以使配置生效(容器里没有 systemctl restart apache2,因此直接重启容器即可,已装插件不会丢) docker-compose restart ocsapplication
自动化安装脚本交互:
- 脚本会询问您插件存放的路径,直接按回车使用默认路径即可。
- 脚本会列出所有可安装的插件,输入您想安装的插件对应的数字编号,然后按回车。
- 分情况讨论:
- 如果您的通信服务器和管理服务器是同一台机器: 脚本会自动处理。
- 如果您的通信服务器是另一台独立的机器: 脚本会要求您输入该服务器的 IP地址、用户名(如root)和密码,以便通过 SSH (SCP) 将文件复制过去。
- 最后,脚本会询问通信服务器的配置目录路径,通常直接按回车使用默认值 [/etc/ocsinventory-server] 即可。
- 脚本会自动将所需文件复制到通信服务器的正确位置。
第二步:客户端安装 (Agent 端部署)
服务器端装好后,接着还需要让客户端的代理程序 (Agent) 也知道如何采集这个新插件的数据。
- 对于 Windows 客户端:
- 在您下载的插件压缩包里,找到 agent 或类似的子文件夹。
- 将这个 agent 文件夹里的所有内容重新打包成一个新的 .zip 文件。
- 登录 OCS 网页控制台,使用 “部署包 (Deploying packages)” 功能创建一个新的部署任务。
- 选择“存储 (Store)”操作。
- 将您新创建的 .zip 文件作为包上传。
- 指定客户端的目标路径为:C:\Program Files (x86)\OCS Inventory Agent\Plugins
- 将这个包部署给您想安装插件的 Windows 计算机。
- 对于 Linux/Unix 客户端:
- 在插件压缩包的 agent 子文件夹里,找到 .pm 结尾的文件(例如 Myplugin.pm)。
- 将这个 .pm 文件复制到客户端的 Perl 模块目录中。
- 常见路径:/usr/local/share/perl/{perl版本}/Ocsinventory/Agent/Modules
- 如果是用 RPM 包安装的 Agent,路径可能是:/usr/share/perl5/Ocsinventory/Agent/Modules
- 编辑客户端的模块配置文件:
vi /etc/ocsinventory-agent/modules.conf
- 在文件末尾添加一行,内容为 use Ocsinventory::Agent::Modules::Myplugin; (将 Myplugin 替换为实际的文件名)。
- 验证: 运行 perl /etc/ocsinventory-agent/modules.conf,如果没有任何错误信息输出,说明插件已正确加载。
插件装好后,就等客户端再盘点一次,进程信息就到服务器上来了(这里我装的 processes 插件,在详情页的 杂项里看进程):

常用插件
RunningProcesses
插件:盘点运行的服务或进程PostgreSQL
插件:盘点 PostgreSQL 数据库Oracle
插件:盘点Oracle主页Running Database
插件:盘点正在运行的数据库实例
插件下载地址:http://plugins.ocsinventory-ng.org/
插件安装教程:http://wiki.ocsinventory-ng.org/10.Plugin-engine/Using-plugins-installer/
分钟级别的盘点
在实现分钟级别的盘点前,先来理解下服务器上的两个与此相关的重要参数 FREQ_INVENTORY和 PROLOG_FREQ。
盘点频率(FREQ_INVENTORY)
单位是天。盘点频率属性规定了一台计算机在向服务器报到后,至少要间隔多少天才能被要求进行下一次完整的资产盘点。联系频率PROLOG_FREQ 则规定了代理应该多久联系一次服务器来“打个招呼”并请求任务。
由于最小单位限制,仅通过服务器配置,能达到的最高联系频率是每小时一次 (PROLOG_FREQ=1)。
若要以分钟为单位进行盘点,必须在客户端本地(代理上)进行设置,并配合服务器端的 FREQ_INVENTORY = 0。
联系频率(PROLOG_FREQ)
单位是“小时”,它规定了代理应该多久联系一次服务器来“打个招呼”并请求任务。例如,设置为 24 (默认值) 意味着代理每24小时联系一次服务器。在联系时,服务器会检查自上次盘点以来是否已经超过了 FREQ_INVENTORY 设定的天数,如果超过了,就命令代理开始盘点。
实现分钟级别的盘点
要实现分钟级别的判断,必须把客户端代理上定时任务的 –lazy 参数去掉,因为在 –lazy 模式下,无论您的 cron 任务运行得多频繁,最终决定联系频率的还是服务器上的 PROLOG_FREQ 设置。
对于本次演示的 Ubuntu 代理上,具体步骤是,先访问Cron任务计划,位置在 /etc/cron.d/ocsinventory-agent
,将里面的57 5 * * * root /usr/local/bin/ocsinventory-agent --lazy > /dev/null 2>&1
修改为每分钟运行一次,并删除 –lazy,然后保存(改后是自动生效的),改后内容:*/1 * * * * root /usr/local/bin/ocsinventory-agent > /dev/null 2>&1
对于 Windows 11:您需要使用 Windows 的“任务计划程序”,具体配置这里不写了。
现在客户端每分钟都会联系服务器了。但您还需要告诉服务器,每次联系都应该进行一次完整的盘点,这只要在服务器上设置 FREQ_INVENTORY = 0,的意思是:“不要使用基于时间的盘点逻辑。只要有代理联系我,就立即命令它执行一次完整的盘点。”
验证配置是否生效,可以去服务器页面,进入设备详情查看 “最后盘点日期” (Last Inventory) 或 “最后联系” (Last contact) 字段。
我在 Ubuntu22.04 上,装了个应用 atop 后再删除,2分钟内服务器上观察到了安装与删除的变化。磁盘使用量的变化也观察到了。
CPU 和内存使用情况 不可以盘点,只能盘点它们的静态信息,如CPU: 型号、主频、核心数,内存: 总容量、插槽数量等。
REST API
不使用 nginx 反向代理
目前,OCS Inventory 的 REST API 使用 Apache 提供安全身份验证,配置好认证后,若用了 nginx 做反向代理可能还是无法通过认证报401错误,因此建议不使用 nginx,直接访问 apache 服务即可。
如果一定要走 nginx,就需要在 nginx 配置中加上类似:
location /ocsapi/ { proxy_pass http://apache-container-ip:80/ocsapi/; proxy_set_header Authorization $http_authorization; }
确保 nginx 会把 Authorization
头转发给 Apache。
认证配置
最新版的 OCS Inventory 已经将新的 REST API 配置分离到了一个专门的 zz-ocsinventory-restapi.conf 文件中。这个配置所在目录已经在 docker-compose 里映射出来了:
volumes: - "httpdconfdata:/etc/apache2/conf-available"
如图:

编辑此文件后,在 <Location /ocsapi> 里加入一段:
AuthType Basic AuthName "OCS Inventory NG REST API" AuthUserFile /etc/ocsinventory-server/ocsapi.htpasswd Require valid-user

创建密码文件 (ocsapi.htpasswd)
上面的配置指定了一个密码文件 /etc/ocsinventory-server/ocsapi.htpasswd
。我们需要创建这个文件,并添加一个允许访问 API 的用户。
在容器内部,执行以下命令:
# 使用 htpasswd 命令创建文件并添加第一个用户 'apiuser' # -c 参数表示创建新文件 htpasswd -c /etc/ocsinventory-server/ocsapi.htpasswd apiuser
系统会提示您输入两次密码。这个 apiuser 和密码就是您未来调用 API 时需要使用的凭证。
【关键】 您创建的这个密码文件位于 /etc/ocsinventory-server/ 目录下,这个目录被您的 perlcomdata 卷持久化了,所以它不会因重启而丢失。
退出容器并重启服务。
执行 exit 退出容器。回到宿主机终端,执行重启命令以加载新的 Apache 配置:
docker-compose restart ocsapplication
注意:通过插件安装盘点到的数据无法通过 REST API拿到,比如运行中的进程,但是可以直接从数据库拿,对应的表是 ocsweb.hardware
。
软件信息的查询还是用 List one computer details
接口方便点,直接查数据库的话得去关联多个表。
测试
curl -v -u apiuser:password http://192.168.3.226/ocsapi/v1/computer/1
官方参考
- REST API验证:http://wiki.ocsinventory-ng.org/11.Rest-API/Authentification/
- REST API配置:http://wiki.ocsinventory-ng.org/11.Rest-API/Configuration/
- REST API GET请求:http://wiki.ocsinventory-ng.org/11.Rest-API/GET-Routes/
数据库相关表
- SELECT * FROM ocsweb.hardware;(所有的计算机)
- SELECT * FROM ocsweb.cpus;
- SELECT * FROM ocsweb.memories;
- SELECT * FROM ocsweb.drives;
- SELECT * FROM ocsweb.bios;
- SELECT * FROM ocsweb.runningprocess;
- SELECT * FROM ocsweb.software;
软件升级会换 ID
在很多Linux系统中,当使用 apt、yum 或 dnf 等包管理器升级一个软件包时,OCS Inventory 的处理方式可能并不是“在原地更新”这条记录。它很可能会执行以下操作:
- 删除旧记录:当 apt-utils 2.4.12 被移除时,OCS Agent 会上报这个软件消失了。OCS Server 可能会因此删除数据库中代表 apt-utils 2.4.12 的那条记录。
- 创建新记录:当 apt-utils 2.4.14 被安装时,OCS Agent 会上报发现了一个新软件。OCS Server 会在数据库中创建一条全新的记录来代表 apt-utils 2.4.14。
最关键的是,这条新记录会有一个全新的、与之前完全不同的 softwareId(即数据库主键 ID)。

如果您非常希望在日志中明确看到“版本号”字段的变更,那么您需要修改软件匹配的逻辑,不再依赖 softwareId,而是依赖更稳定的软件名称。
警告: 这种方式有一个风险,即无法处理同一台计算机上安装了多个同名软件的极端情况。但对于 apt-utils 这类系统包,这种情况基本不可能发生。