
简介iTop是一款基于CMDB与ITIL最佳实践的开源IT服务管理工具面向企业IT运维人员、系统管理员及希望搭建服务台与资产管理系统技术团队帮助解决IT资源分散、服务流程不规范、故障响应效率低等问题。资源包共约2000个文件以2128个php源码、313个png图片、256个js脚本、115个xml配置、82个css样式及twig模板、json、yml等为主涵盖Web应用前端、后端逻辑、安装说明与开源许可证文件压缩包整体约11.44MB。目前已有1974人学习下载。通过该资源可获取完整的iTop部署包理解CMDB资产关系建模、服务请求与变更管理流程、自动化工作流引擎及报表分析模块的实现方式并借助INSTALL安装指南与LICENSE许可说明完成环境搭建与合规使用适合用于企业内部ITSM平台搭建、二次开发学习与ITIL流程落地参考。1. 从一张Excel台账到CMDBiTop到底解决什么问题很多团队第一次接触ITSM是因为运维台账已经彻底失控。服务器清单在Excel里变更记录在聊天记录里密码在某个离职同事的加密压缩包里出了故障只能靠老员工回忆“这台机器三年前是谁装的”。这时候你搜到iTop看到“开源IT服务管理工具”几个字第一反应往往是又一个要填一堆表单的重型系统。iTop的定位其实很明确——它是一套基于Web的IT服务管理平台核心能力围绕CMDB配置管理数据库展开把资产、关系、变更、工单、服务级别这些东西串成一条线。它用PHP写成底层MySQL部署在标准LAMP或LNMP环境上就能跑。适合谁适合那些运维规模到了二三十台设备以上、开始出现“改了一台机器不知道影响谁”的团队也适合想用开源方案搭一套轻量ITIL流程、但不想被商业套件绑死的技术负责人。它不解决监控告警也不做自动化部署它解决的是“东西在哪、谁负责、改了什么、影响了谁”这四个问题。2. 部署选型与初始化从零把iTop跑起来2.1 环境选型为什么我优先推荐LNMP而不是LAMPiTop官方文档给的环境要求看起来不挑PHP 7.4到8.1、MySQL 5.7或8.0、Apache或Nginx都行。但实际部署下来我一般会选Nginx PHP-FPM MySQL 8.0这个组合。原因不复杂iTop的页面请求里静态资源占比不高但CMDB查询和工单列表的并发响应对PHP-FPM进程管理更敏感Nginx的fastcgi配置比Apache的mod_php更容易调优。另外MySQL 8.0的窗口函数和JSON字段支持在后续做自定义报表时能省不少事。PHP扩展这块有几个是硬性的mysqli、gd、ldap如果接AD认证、soap如果对接外部系统、mbstring、curl。少一个安装向导那一步就会卡住而且报错信息不一定直白。我见过有人卡在“检查环境”页面反复刷新最后发现是gd没装图片验证码生成不了。提示PHP的memory_limit建议调到256M以上iTop在同步大量CI配置项时内存占用会明显上升128M在批量导入场景下容易白屏。2.2 安装步骤从下载到进入后台假设你已经有一台干净的Linux机器下面是从零开始的命令序列。我用的是Ubuntu 22.04做示例其他发行版替换包管理命令即可。# 安装基础环境 sudo apt update sudo apt install nginx php8.1-fpm php8.1-mysql php8.1-gd php8.1-mbstring \ php8.1-curl php8.1-soap php8.1-ldap php8.1-xml mysql-server unzip -y # 下载iTop以3.1.x为例实际以官方发布为准 wget https://sourceforge.net/projects/itop/files/itop/3.1.0/itop-3.1.0.zip unzip itop-3.1.0.zip -d /var/www/ sudo chown -R www-data:www-data /var/www/web/解压后目录里会有一个web文件夹这就是站点根目录。接下来配置Nginxserver { listen 80; server_name itsm.example.local; root /var/www/web; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.1-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } location ~ /conf/ { deny all; } }这段配置里有两个点值得说。一是try_files那行iTop的URL重写依赖它不写的话登录后跳转可能404。二是deny all把conf目录挡掉iTop安装完成后会把数据库密码写在conf/production/config-itop.php里这个文件绝对不能通过Web访问到。数据库这边先建库建用户CREATE DATABASE itop CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER itopuserlocalhost IDENTIFIED BY 换成你的强密码; GRANT ALL PRIVILEGES ON itop.* TO itopuserlocalhost; FLUSH PRIVILEGES;然后浏览器访问站点会进入安装向导。向导里会让你填数据库连接信息、设置管理员账号、选择要安装的模块。模块选择这一步新手容易贪多我的建议是第一遍只勾“ITSM核心”和“配置管理”其他像服务目录、变更管理可以后面在后台按需启用。装多了菜单栏会非常臃肿反而找不到常用功能。2.3 初始化后的第一件事建组织、建联系人、建资产模型安装完进入后台不要急着导数据。iTop的数据模型是“组织-联系人-资产”三层结构顺序反了后面要返工。先在“组织”里建一个根节点比如“运维部”然后在“联系人”里把团队成员录进去最后才是建CI。CI的类型服务器、网络设备、应用系统在“配置项”菜单下每种类型有自己的属性字段可以按需增删。这里有个参数值得注意每个CI都有一个“组织”字段它决定了谁能看到这条记录。如果组织没建好就导资产后面改归属会非常痛苦尤其是CI之间已经建了关系之后。3. CMDB建模与数据导入把Excel台账变成关系图3.1 理解iTop的数据模型CI、关系与影响分析iTop的CMDB不是一张平表它是一张图。每个CI是一个节点CI之间的连接叫“关系”Relation比如“服务器A 运行 应用B”“应用B 依赖 数据库C”。这些关系不是装饰它们是影响分析的基础。当你发一个变更工单要重启服务器A时iTop能顺着关系图告诉你哪些应用会受影响。这个模型的价值在故障排查时特别明显。以前出了故障大家靠记忆猜“这台机器上跑了什么”现在打开CI详情页上下游关系一目了然。代价是初始建模要花时间关系数据要维护。我的经验是先建核心关系别追求一步到位。服务器到应用、应用到数据库、网络设备到链路这三类关系覆盖了八成场景剩下的可以后面补。3.2 用CSV批量导入CI字段映射与常见报错手工建几十台服务器还能忍上百台就必须走导入了。iTop支持CSV导入入口在“配置项”菜单下的“导入”功能。操作路径是先下载对应CI类型的CSV模板填好数据上传做字段映射预览确认导入。模板里的字段名是英文的比如name、org_id、serialnumber、location_id。其中org_id和location_id这类外键字段填的不是名称而是ID。获取ID的方法是在对应列表页看URL里的数字或者导出一次现有数据看格式。name,org_id,serialnumber,location_id,brand_id,model_id web-server-01,1,SN123456,2,3,5 db-server-01,1,SN789012,2,3,6导入时最常见的报错是“外键值不存在”原因就是ID填错了或者对应记录还没建。另一个坑是日期格式iTop默认接受YYYY-MM-DD如果你从Excel直接导出日期可能变成2024/1/5这种导入会失败。解决办法是在Excel里先把日期列格式化成文本或者用脚本统一转换。注意导入前先做一次小批量测试比如只导3条确认字段映射和值都对了再全量导。iTop的导入没有“撤销”按钮导错了只能手动删或者从备份恢复。3.3 关系数据的导入比CI本身更容易翻车CI导完了关系怎么导iTop的关系导入稍微绕一点它不在CI导入的同一个入口。你需要先导出一次现有关系数据作为模板或者手动建一条关系然后导出看格式。关系CSV通常包含key关系类型、source_id源CI的ID、dest_id目标CI的ID三列。key,source_id,dest_id depends_on,101,205 runs_on,102,101这里的key值取决于你启用的关系类型常见的有depends_on、runs_on、connects_to。填错key的后果是导入报错或者建出一条无意义的关系。我一般会先在后台手动建一条关系然后导出看系统生成的key是什么照着填。关系导入的另一个坑是循环依赖。比如A依赖B、B依赖C、C又依赖AiTop不会阻止你建这种关系但影响分析时会陷入循环。建关系前最好在纸上画一遍拓扑确认没有环。4. 工单流程与自动化让ITIL落地而不是挂在墙上4.1 工单生命周期从用户请求到关闭的完整链路iTop的工单分几种类型用户请求User Request、事件Incident、变更Change、问题Problem。每种类型的生命周期不一样但核心逻辑都是“新建→分配→处理→解决→关闭”。用户请求通常来自服务台事件来自监控或用户报障变更需要审批问题用于根因分析。工单的字段可以自定义但有几个关键字段建议保留caller报障人、agent处理人、team处理团队、priority优先级、impact影响范围。优先级和影响范围可以配成自动计算比如影响范围大且紧急度高时优先级自动升为“严重”。工单流转靠的是“触发器”和“动作”。比如工单创建后自动发给服务台团队解决后自动通知报障人。这些在“通知”和“触发器”菜单里配。新手容易把通知配得太频繁结果处理人邮箱被轰炸最后大家把通知规则全关了。我的建议是只配关键节点创建、分配、解决、关闭。4.2 用触发器做自动分配规则怎么写才不打架自动分配的核心是“如果满足条件X则执行动作Y”。iTop的触发器支持基于字段值的条件判断比如“如果工单类型是事件且服务是核心业务则分配给高级支持组”。配置路径在“管理”菜单下的“触发器”里。新建一个触发器选择触发时机比如“工单创建后”然后写条件。条件语法是iTop自己的表达式类似SELECT Incident WHERE priority 1这种。动作可以是发邮件、改字段值、分配团队。这里有个血泪经验多个触发器同时命中同一条工单时执行顺序按触发器的排列顺序来。如果你有两个规则都改team字段后面的会覆盖前面的。所以规则要排好优先级或者把条件写得更精确避免重叠。4.3 服务级别管理SLA怎么配才不会被业务方挑战SLA在iTop里是通过“服务”和“SLA”两个模块配合实现的。先建服务比如“邮件系统”然后给服务绑SLA定义响应时间和解决时间。工单关联到服务后iTop会自动计算截止时间超时会在列表里标红。配置SLA时有两个参数要特别注意一个是“工作时间日历”它决定了SLA计时是按7x24还是按工作日算另一个是“暂停条件”比如工单状态变为“等待用户反馈”时是否暂停计时。这两个不配清楚SLA数字就是假的业务方一算就穿帮。我一般会先跟业务方确认三个问题故障等级怎么分、响应时间要求是多少、非工作时间算不算。确认完再动手配配完拿几条历史工单跑一遍验证。5. 避坑与排查那些文档里不会写的翻车现场5.1 安装向导卡在环境检查现象浏览器打开安装页面环境检查那一列全是红叉但PHP明明装了。 原因iTop检查的是PHP CLI和Web两个层面的扩展有时候CLI装了但FPM没加载或者扩展装了但没在php.ini里启用。 解决用php -m看CLI加载了哪些再建一个?php phpinfo(); ?页面看Web端加载了哪些对比缺哪个。缺的扩展在/etc/php/8.1/fpm/php.ini里把注释去掉重启php-fpm。5.2 导入CSV时中文乱码现象导入后CI名称变成问号或方块。 原因CSV文件编码不是UTF-8或者Excel保存时带了BOM头。 解决用file -i yourfile.csv看编码不是UTF-8就用iconv转。BOM头可以用sed -i 1s/^\xEF\xBB\xBF// yourfile.csv去掉。iTop对BOM比较敏感带BOM的文件第一列字段名会识别失败。5.3 工单通知邮件发不出去现象触发器配了工单也创建了但收件人没收到邮件。 原因iTop的邮件发送依赖PHP的mail()函数或者SMTP配置。默认走mail()很多服务器没配sendmail邮件就静默失败了。 解决在后台“邮件设置”里改成SMTP模式填SMTP服务器地址、端口、账号密码。改完用“发送测试邮件”验证。如果SMTP用了自签名证书还要在配置里关掉证书验证否则连接会失败。5.4 页面加载越来越慢现象用了几个月后工单列表和CI查询明显变慢。 原因iTop的日志表和审计表会持续增长尤其是开启了详细审计之后。另外MySQL的默认配置对iTop的查询模式不友好缓冲池太小。 解决定期清理priv_audit和priv_event表的历史数据保留最近三个月即可。MySQL的innodb_buffer_pool_size调到物理内存的50%到70%。如果工单量很大给priv_changeop表的created字段加索引。5.5 升级后自定义字段丢失现象从旧版本升级到新版本之前加的自定义字段不见了。 原因iTop的升级流程会重建数据模型自定义字段如果没在升级前导出成扩展包升级后不会自动保留。 解决升级前用“数据模型导出”功能把自定义字段导出成XML升级后在“扩展”里重新导入。养成习惯任何改数据模型的操作之前先导出一份。6. 进阶技巧用REST API把iTop接进现有运维链路iTop自带REST API入口在/webservices/rest.php。它支持对CI和工单做增删改查返回JSON。这个接口的价值在于把iTop从“一个要手动填的系统”变成“能被其他系统写入的数据中心”。比如你的监控系统发现一台服务器下线可以自动调API在iTop里创建一个事件工单你的自动化部署脚本完成上线后可以自动更新CI的版本字段。调用前需要在后台建一个API用户并授予对应对象的读写权限。认证方式用HTTP Basic Auth把用户名密码放在请求头里。import requests import json url http://itsm.example.local/webservices/rest.php?version1.3 auth (apiuser, apipassword) # 查询所有类型为Server的CI payload { operation: core/get, class: Server, key: SELECT Server, output_fields: name,serialnumber,org_id } resp requests.post(url, authauth, data{json_data: json.dumps(payload)}) result resp.json() for obj in result.get(objects, {}).values(): print(obj[fields][name], obj[fields][serialnumber])这段代码的逻辑是构造一个JSON请求体operation指定操作类型class指定对象类key是查询条件output_fields控制返回哪些字段。返回结果里objects是一个字典key是对象IDvalue里包含fields字段。参数方面version1.3是API版本不同iTop版本支持的版本号不同用之前先确认。创建工单的调用类似把operation改成core/createclass改成UserRequestkey换成字段值字典。注意工单的必填字段比CI多caller_id、title、description这几个不填会报错。提示API调用频率高的话建议在iTop前面加一层缓存或者消息队列直接把请求打到iTop上并发一高PHP-FPM进程会被占满前台页面会跟着卡。我现在的习惯是任何要批量写入iTop的操作先在测试环境用API跑一遍确认字段和权限都没问题再切到生产。有一次我直接在生产环境用脚本批量改CI归属结果组织ID填错两百多条记录全挂到错误的组织下花了半天才回滚。从那以后我每次调API都强制走一遍测试环境验证希望这个习惯也能帮到你。本文还有配套的精品资源点击获取