GLPI部署、运维和管理使用手册

作者建议

我将文档发布到了多个平台,不同的平台阅读体验不同,排版也可能有区别,本人强烈建议直接点击下面的链接查看原始文档,因为下面的链接是原始文档,阅读体验极佳,排版美观,有目录结构,您可以很容易找到您想要阅读的章节。另外,文档一直持续更新,不断完善,内容更加准确且与时俱进。原始文档始终是最新版本的,其它平台中的文档可能已经过时了。

单击查看原始文档:《GLPI部署、运维和管理使用手册》

原创不易,如果对您有帮助,还请您一键三连[抱拳]

有任何问题都可以联系作者,文末有作者联系方式,欢迎交流。

以下是正文

什么是GLPI

GLPI(Gestionnaire Libre de Parc Informatique 法语)是一款基于PHP/MySQL的开源IT服务管理平台,遵循GNU GPL协议。其核心功能覆盖IT资产全生命周期管理、服务台工单系统、网络设备发现及远程维护,并支持通过插件扩展CMDB配置管理、合同生命周期追踪等专业模块。系统采用RBAC角色权限模型,可适配多分支机构的分布式IT架构,同时内置的自动化报表引擎能生成符合ITIL标准的运维分析数据。因其高度可定制性,广泛应用于政府机构、教育单位及中大型企业,既满足基础运维需求,亦可通过二次开发实现与现有OA、财务系统的深度集成。

官方网站和官方文档

https://glpi-project.org/

glpi-project/glpi: GLPI is a Free Asset and IT Management Software package, Data center management, ITIL Service Desk, licenses tracking and software auditing.

image.png

部署GLPI

截至本人写作本文时,最新版本的GLPI版本号为10.0.18

部署在k8s上

支持通过helm部署,具体操作请参考此文glpi 0.1.0 · vdiogov/glpi-conteiner

注意:glpi官方并没有发布容器镜像,上面的链接是第三方制作的容器镜像

官方教程中的部署方法

官方的部署方法比较麻烦,各种依赖需要手工安装,新手通常都会卡在这一步,建议通过helm部署在k8s上,更快更便捷

请查看官方文档:GLPI installation — GLPI documentation

访问GLPI

部署成功后,即可通过浏览器访问GLPI

本人是通过helm部署的,并且通过ingress暴露端口,第一次打开网站,提示登录,默认的glpi管理员用户名为glpi,密码一样

image.png

image.png

创建用户

可以直接创建本地glpi用户,也可以将LDAP(如Microsoft AD)中的用户批量导入glpi中

glpi本地用户

如果是创建glpi本地用户,则直接按照下图所示操作即可

image.png

image.png

域用户(从Microsoft AD中导入用户)

参考资料:Command line tools — GLPI documentation

LDAP directories — Documentation GLPI 10.0

image.png

调整用户权限

创建用户后可以更改权限,一个用户可以属于多个配置文件

image.png

编辑看板(dashboard)

进入看板,单击下图箭头所示的按钮即可编辑看板,看板中的组件是非常丰富的

image.png

安装glpi客户端

glpi客户端支持Windows、Linux和macos系统

一般部署好glpi后,首先是要安装glpi客户端,大家使用glpi,多数情况下是为了进行资产管理,如PC、网络设备、服务器、各种办公设备(如打印机、投影仪等),那如何批量安装glpi客户端呢?

如果企业部署了Microsoft活动目录域服务,则可以通过组策略批量安装。有些企业可能部署了终端管理软件,例如ipguard、sccm或者VMware workspaceOne,也可以利用这些终端管理软件自带的批量安装软件功能实现。

获取官方glpi客户端安装程序

参考资料:Windows installer — GLPI Agent 1.14 documentation

glpi-project/glpi-agent: GLPI Agent

glpi客户端安装程序下载网址:glpi-project/glpi-agent: GLPI Agent

从下图可以看到github上提供了多种类型的安装程序

image.png

本节介绍下载Windows版本的glpi客户端安装程序

直接单击此链接下载1.14版本的客户端安装程序https://github.com/glpi-project/glpi-agent/releases/download/1.14/GLPI-Agent-1.14-x64.msi   请始终下载最新版本

找到glpi应用程序的URL地址

image.png

手工安装glpi客户端

以管理身份运行Powershell,然后运行下行命令

#注意:<URL>要替换为实际的glpi服务器url,本教程的url为http://10.65.37.239:31763
#RUNNOW=1指的是安装完成后立即收集资产信息并发送到glpi服务器
GLPI-Agent-1.14-x64.msi /quiet RUNNOW=1 SERVER=<URL>

通过组策略(软件安装策略)批量安装glpi客户端

通组策略批量安装glpi客户端也有多种方式,本小节介绍的是利用软件安装策略批量化无感安装

使用组策略中的软件安装策略

这种方法,编辑组策略很方便,但是要先修改官方的msi程序包,这是因为软件安装策略并不支持添加命令行参数,而我们必须要指定glpi服务器的url才行,关于如何修改msi程序包,请继续往下看。

修改官方的msi安装包

修改msi包的软件有很多,例如微软开发的免费软件orca,本文使用的是Advanced installer,这是一款非常强大的程序包创建工具,也可以直观地修改msi包,例如更改默认安装目录,更改属性值等等。

Advanced installer安装就不介绍了,直接讲述如何修改msi包,本文以修改1.14版本的安装包为例,官方下载的安装包文件名为:GLPI-Agent-1.14-x64.msi

打开Advanced installer软件,然后单击“文件”–open,再选择需要修改的msi安装包,打开后就可以进行各种更改了,本文修改的项有:

设置参数server和runnow的值,这两个参数默认值分别是empty和0;server参数指定glpi服务器的地址,runnow参数设置为1表示安装完glpi agent后立即开始资产盘点并将资产信息发给glpi服务器端。

默认情况下,安装包只添加"feat_DEPLOY,feat_COLLECT"这两个功能(注意feat_AGENT默认也是添加的,这是最基础的功能),我改为添加所有功能,也就是以下5个功能都添加:

feat_AGENT: to restrict to the minimum installation with agent and Inventory task

feat_NETINV: to select NetDiscovery and NetInventory tasks for installation

feat_DEPLOY: to select Deploy task for installation

feat_COLLECT: to select Collect task for installation

feat_WOL: to select WakeOnLan task for installation

具体修改方法如下图

image.png

image.png

接下来说明如何更改msi包,使得默认添加所有功能,这个修改并不在properties页面,而是在table editor页面,下图红框中选中的feature的level值默认并不是3,改为3就意味着默认安装此项功能,如果仔细分析,会发现原始msi包中,默认安装的功能的level值为3,所以可以推导出level值为3则表示默认安装此项功能。(有些包不仅要修改level值,还需要修改attribute值)

关于这个feature,具体可以参考这篇文章功能表 - Win32 apps | Microsoft Learn

image.png

更改完成后,单击“文件”–“Save as”另存为一个msi包,这样可以不用覆盖原始msi包,我命名为GLPI-Agent-1.14-x64._Custom_V1.1.msi

将修改后的msi安装程序放入共享文件夹

需要先搭建文件服务器,并创建共享文件夹,将之前下载的glpi客户端安装程序放入共享文件夹中。具体操作就不赘述了,下图是我准备好的共享文件夹

image.png

接下来创建组策略对象(GPO),打开组策略管理器,右击“组策略对象”,选择“新建”,然后给新建的GPO命名

image.png

编辑刚刚新建的GPO,然后按照下图所示操作

image.png

image.pngimage.png

如此,就完成了组策略对象的创建和编辑,接下来还要应用给计算机才能生效,如果要应用给域内所有计算机,可以直接将此GPO链接到域中,如下图所示:

特别提示:建议先找一两台电脑测试,确保无误后,再应用于域内所有计算机

image.pngimage.png

验证

加入域的计算机过一段时间(默认情况下是0值180分钟中的随机值)会自动更新组策略,如果想立即更新组策略,可以在相应计算机上运行下行命令

gpupdate /force

上述命令执行成功后,Windows系统会自动安装glpi客户端,成功安装后,就可以在glpi管理网页中查看到此计算机的详细资产和状态信息了,也可以在计算机已安装软件类别中发现glpi客户端

image.png

image.png

image.png

扩展阅读:组策略中的软件安装策略的两种部署类型(已分配和已发布)有什么区别呢?

区别点****​ **已分配(Assigned)** **已发布(Published)**
安装性质 强制 可选
应用对象 用户或计算机 仅用户
触发时机 登录/启动时预装,或首次使用触发 用户手动安装或文件关联触发
卸载权限 用户通常不可卸载 用户可自行卸载
适用场景 必需软件(如Office、杀毒软件、glpi客户端、准入认证客户端等) 可选工具(如PDF阅读器、办公辅助工具等)

通过组策略中的计划任务批量安装glpi客户端

本小节介绍的是利用计划任务策略批量化无感安装,这种方式的好处是无需修改官方的msi安装包,而且对于未使用域账户登录计算机的情况也没有影响,当然了,为了使下载msi安装包更顺利,建议先搭建一个web服务器,将此web服务器作为一个下载站

准备好web服务器

首先要将官方的msi安装包放入web服务器中,然后验证是否能正常通过url下载

Start-BitsTransfer -Source http://<此处填写实际的web服务器ip地址或域名>/GLPI-Agent-1.14-x64.msi

如果能正常下载说明web服务器配置正常

image.png

创建并编辑组策略

如下图所示,我这边还用到了项目级目标,查询计算机是否已经安装了glpi客户端,如果已安装,则不执行相应的计划任务,这里需要输入产品代码,关于如何查询msi安装包的产品代码,可以看我写的另外一篇文章:《查看或修改msi包》

image.png

验证

验证的步骤与上一节是一样的。

image.png

从glpi中筛选所需的信息

这一小节的内容非常实用,大家用glpi主要就是为了便于进行资产管理,比如想要查询哪些电脑安装了盗版软件,哪些电脑的配置偏低等等。如果直接从glpi导出的话,格式很乱,所有的数据都是在一个单元格中的,很难处理,为了解决这个问题,我特地编写了Powershell脚本,可以实现一键查询安装了特定软件的计算机清单

筛选安装了特定软件的电脑清单Powershell脚本

如果你部署glpi时,mysql的版本是8.0或者更高,则用下面的脚本

<#
.SYNOPSIS
    查询GLPI数据库中安装了指定软件(ABAQUS/SIMPACK)的计算机清单

.DESCRIPTION
    此脚本用于:
    1. 连接GLPI MySQL数据库(仅支持MySQL 8和更高的版本)
    2. 查询所有安装了ABAQUS或SIMPACK软件的计算机
    3. 将查询结果导出为Excel文件(包含自动换行和边框格式)
    4. 输出文件保存路径

.NOTES
    此脚本仅适用于MySQL 8和更高版本的数据库,低版本可能无法正常运行

.OUTPUTS
    生成Excel文件: D:\所有安装了特定软件(ABQUES、SIMPACK)的计算机清单_YYYYMMDD-HHMMSS.xlsx
#>

# 导入所需的模块
Import-Module ImportExcel

$date = Get-Date -Format "yyyyMMdd-HHmmss" # 获取当前时间,按照指定格式
$softwarename = "ABAQUS、SIMPACK" #这里指定想要查询的软件的名称,不用完全匹配,只要软件名称包含其中的字符即可
# 设置输出路径
$Download_Path_xlsx = "D:\所有安装了特定软件($softwarename)的计算机清单_$date.xlsx"
$Download_Path_csv = "D:\所有安装了特定软件($softwarename)的计算机清单_$date.csv"

# 打开 MySQL 连接
Open-MySqlConnection -ConnectionName glpidatabase -ConnectionString "server=<次此处输入实际的mysql服务器ip地址>;database=<此处输入实际的glpi数据库名称>;uid=<glpi数据库的用户名>;pwd=<数据库密码>;"

# 执行 SQL 查询
#下发的sql语句中,where语句是最为关键的,要将OR gs1.name LIKE后面的值换成你想要查询的软件名称(不用完全匹配),这里我查询的是两个软件,可以再加,可以同时查询多个软件
$results = Invoke-SqlQuery -ConnectionName glpidatabase -Query "WITH st AS (
    SELECT
        s1.items_id,
        GROUP_CONCAT(gs1.name SEPARATOR 'CHAR(10)') AS software_name
    FROM
        (
            SELECT
                *
            FROM
                glpi_items_softwareversions
            WHERE
                itemtype = 'Computer'
        ) s1
        LEFT JOIN glpi_softwareversions gs ON s1.softwareversions_id = gs.id
        LEFT JOIN glpi_softwares gs1 ON gs.softwares_id = gs1.id
    WHERE
        gs1.name LIKE '%'
        OR gs1.name LIKE '%SIMPACK%'
        OR gs1.name LIKE '%ABAQUS%'
    GROUP BY
        s1.items_id
)
SELECT
    gc.id,
    gc.name AS hostname,
    gc.users_id,
    gc.serial,
    gc.contact,
    gc.date_creation,
    gc.last_inventory_update,
    gc.last_boot,
    st.software_name
FROM
    glpi_computers gc
    JOIN st ON gc.id = st.items_id
"


# 替换 CHAR(10) 为实际的换行符
$results | ForEach-Object {
    $_.software_name = $_.software_name -replace 'CHAR\(10\)', "`n"
}

# 导出到 Excel
$excel = $results | Export-Excel -Path $Download_Path_xlsx -AutoSize -AutoFilter -WorksheetName "安装了特定软件的计算机清单" -PassThru

# 获取工作表
$worksheet = $excel.Workbook.Worksheets["安装了特定软件的计算机清单"]

# 设置自动换行
$worksheet.Cells["A1:I1000"].Style.WrapText = $true

# 设置边框
$borderStyle = [OfficeOpenXml.Style.ExcelBorderStyle]::Thin
$borderColor = [System.Drawing.Color]::Black

# 遍历单元格,只对有值的单元格设置边框
foreach ($row in 1..1000) {
    foreach ($col in 1..9) {  # A 到 I 列
        $cell = $worksheet.Cells[$row, $col]
        if (-not [string]::IsNullOrEmpty($cell.Text)) {
            $cell.Style.Border.Top.Style = $borderStyle
            $cell.Style.Border.Top.Color.SetColor($borderColor)
            $cell.Style.Border.Bottom.Style = $borderStyle
            $cell.Style.Border.Bottom.Color.SetColor($borderColor)
            $cell.Style.Border.Left.Style = $borderStyle
            $cell.Style.Border.Left.Color.SetColor($borderColor)
            $cell.Style.Border.Right.Style = $borderStyle
            $cell.Style.Border.Right.Color.SetColor($borderColor)
        }
    }
}

# 保存 Excel 文件
$excel.Save()

# 关闭 MySQL 连接
Close-SqlConnection -ConnectionName glpidatabase
# 打印导出的 xlsx 文件的具体路径
Write-Output "导出的 xlsx 文件路径: $Download_Path_xlsx"

导出的Excel文件是这样的,可以看到,排版是很清晰的,有些电脑同时安装了那两个软件,也是在同一行中显示了,很直观

image.png

如果mysql的版本为5.0或更低,则使用下面的Powershell脚本

<#
.SYNOPSIS
    查询GLPI数据库中安装了指定软件(ABAQUS/SIMPACK)的计算机清单

.DESCRIPTION
    此脚本用于:
    1. 连接GLPI MySQL数据库(仅支持MySQL 5版本)
    2. 查询所有安装了ABAQUS或SIMPACK软件的计算机
    3. 将查询结果导出为Excel文件(包含自动换行和边框格式)
    4. 输出文件保存路径

.NOTES
    此脚本仅适用于MySQL 5版本的数据库,其他版本可能无法正常运行

.OUTPUTS
    生成Excel文件: D:\所有安装了特定软件(ABQUES、SIMPACK)的计算机清单_YYYYMMDD-HHMMSS.xlsx
#>

# 导入所需的模块
Import-Module ImportExcel

$date = Get-Date -Format "yyyyMMdd-HHmmss" # 获取当前时间,按照指定格式
$softwarename = "ABAQUS、SIMPACK"
# 设置输出路径
$Download_Path_xlsx = "D:\所有安装了特定软件($softwarename)的计算机清单_$date.xlsx"
$Download_Path_csv = "D:\所有安装了特定软件($softwarename)的计算机清单_$date.csv"

# 打开 MySQL 连接
Open-MySqlConnection -ConnectionName glpidatabase -ConnectionString "server=<次此处输入实际的mysql服务器ip地址>;database=<此处输入实际的glpi数据库名称>;uid=<glpi数据库的用户名>;pwd=<数据库密码>;"

# 执行 SQL 查询
$results = Invoke-SqlQuery -ConnectionName glpidatabase -Query "
SELECT
    gc.id,
    gc.name AS hostname,
    gc.users_id,
    gc.serial,
    gc.contact,
    gc.date_creation,
    gc.last_inventory_update,
    gc.last_boot,
    (
        SELECT GROUP_CONCAT(gs1.name SEPARATOR '\n')
        FROM glpi_items_softwareversions s1
        LEFT JOIN glpi_softwareversions gs ON s1.softwareversions_id = gs.id
        LEFT JOIN glpi_softwares gs1 ON gs.softwares_id = gs1.id
        WHERE s1.itemtype = 'Computer'
        AND s1.items_id = gc.id
        AND (
           -- gs1.name LIKE '%'
            gs1.name LIKE '%SIMPACK%'
            OR gs1.name LIKE '%ABAQUS%'
        )
    ) AS software_name
FROM
    glpi_computers gc
WHERE EXISTS (
    SELECT 1
    FROM glpi_items_softwareversions s1
    LEFT JOIN glpi_softwareversions gs ON s1.softwareversions_id = gs.id
    LEFT JOIN glpi_softwares gs1 ON gs.softwares_id = gs1.id
    WHERE s1.itemtype = 'Computer'
    AND s1.items_id = gc.id
    AND (
        -- gs1.name LIKE '%'
        gs1.name LIKE '%SIMPACK%'
        OR gs1.name LIKE '%ABAQUS%'
    )
)"


# 替换 CHAR(10) 为实际的换行符
$results | ForEach-Object {
    $_.software_name = $_.software_name -replace 'CHAR\(10\)', "`n"
}

# 导出到 Excel
$excel = $results | Export-Excel -Path $Download_Path_xlsx -AutoSize -AutoFilter -WorksheetName "安装了特定软件的计算机清单" -PassThru

# 获取工作表
$worksheet = $excel.Workbook.Worksheets["安装了特定软件的计算机清单"]

# 设置自动换行
$worksheet.Cells["A1:I1000"].Style.WrapText = $true

# 设置边框
$borderStyle = [OfficeOpenXml.Style.ExcelBorderStyle]::Thin
$borderColor = [System.Drawing.Color]::Black

# 遍历单元格,只对有值的单元格设置边框
foreach ($row in 1..1000) {
    foreach ($col in 1..9) {  # A 到 I 列
        $cell = $worksheet.Cells[$row, $col]
        if (-not [string]::IsNullOrEmpty($cell.Text)) {
            $cell.Style.Border.Top.Style = $borderStyle
            $cell.Style.Border.Top.Color.SetColor($borderColor)
            $cell.Style.Border.Bottom.Style = $borderStyle
            $cell.Style.Border.Bottom.Color.SetColor($borderColor)
            $cell.Style.Border.Left.Style = $borderStyle
            $cell.Style.Border.Left.Color.SetColor($borderColor)
            $cell.Style.Border.Right.Style = $borderStyle
            $cell.Style.Border.Right.Color.SetColor($borderColor)
        }
    }
}

# 保存 Excel 文件
$excel.Save()

# 关闭 MySQL 连接
Close-SqlConnection -ConnectionName glpidatabase
# 打印导出的 xlsx 文件的具体路径
Write-Output "导出的 xlsx 文件路径: $Download_Path_xlsx"

如何将AI聊天机器人集成至glpi中

可以将ragflow、dify等工具创建的AI助理集成至glpi中,我为此专门开发了一个glpi插件,详情请查看此文:《ragflow与glpi无缝集成的开源插件》

受欢迎的glpi插件

glpi是支持插件的,可以通过插件扩展glpi的功能,glpi插件市场上有很多社区开发的插件,比较常用的是下面这些,详细的插件使用说明请查看各插件的手册。

image.png

数据中心资产管理

glpi提供了毕竟直观的数据中心视图,可以利用这个功能直观了解有多少个数据中心,每个数据中心有哪些机房(房间),每个机房有多少机柜(能直接展示机房俯视图视图),以及每个机柜安装了哪些设备,这些设备的详细信息都可以查询到,十分便利。

image.png

image.png

glpi与zabbix集成

参考资料:Source of README.md - Zabbix - ZABBIX GIT

4 Webhook

glpi对于ITIL很专业,用它来创建处理工单是很合适的。zabbix十分擅长监控。能不能将两者结合,取长补短呢?比如zabbix发现某台服务器挂了,自动通知glpi,然后glpi自动创建合适的工单,发给相关的IT工程师处理。这个是可以实现的,当然方法有很多,比较简单的方法是直接用zabbix内置的webhook功能,zabbix本身就能与glpi实现一定程度的集成。具体实现可以参考上面的官方文档

关注我们,获取更多IT开发运维实用工具与技巧!

github用户名: iamtornado

github个人首页: https://github.com/iamtornado

电子邮箱: 1426693102@qq.com

个人微信:tornadoami(也可以通过下面的二维码加我,之后我将您邀请进入AI技术交流群)

lQLPJwkTm2qaAEvNBcDNBDawOy5xMLUjK4AH5hR9heXzAA_1078_1472.png

QQ群: 715152187

微信公众号: AI发烧友

AI发烧友公众号宣传图片.pngimage.png

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐