19.12.5 服务台与工单体系设计

服务台与工单体系是运维流程的统一入口与执行载体,目标是实现“统一受理、标准流转、可视进度、闭环评估”。设计需兼顾用户体验与运维效率,通过规范化的分类、SLA、知识沉淀与自动化能力,形成稳定可扩展的交付模式。以下给出架构草图、部署示例、流程状态机、接口示例、排错与练习。

文章图片

工单类型建议按服务请求、事件、问题、变更、访问权限、资产申请等维度分类,并为每类定义必填字段、审批路径与处理时限。状态机建议:已提交、待受理、处理中、待用户确认、已解决、已关闭、已撤销;结合角色设置受理人、处理人、协作人、审批人、升级责任人,并在SLA超时或卡点时自动升级与通知。

下面以开源工单系统 Zammad 为例(可替换为 osTicket、GLPI 等)给出可执行安装与入口对接示例,便于快速验证流程与自动化能力。

安装示例(Docker 方式)

# 1) 准备目录
mkdir -p /opt/zammad && cd /opt/zammad

# 2) 创建 docker-compose.yml
cat > /opt/zammad/docker-compose.yml <<'EOF'
version: '3'
services:
  zammad:
    image: zammad/zammad:latest
    container_name: zammad
    ports:
      - "8080:8080"
    environment:
      - TZ=Asia/Shanghai
      - ZAMMAD_SESSION_STORE=filesystem
    volumes:
      - zammad-data:/opt/zammad
      - zammad-postgresql:/var/lib/postgresql
      - zammad-redis:/var/lib/redis
volumes:
  zammad-data:
  zammad-postgresql:
  zammad-redis:
EOF

# 3) 启动并查看状态
docker compose -f /opt/zammad/docker-compose.yml up -d
docker ps | grep zammad

# 预期:容器运行中,访问 http://<server_ip>:8080 完成初始化向导

入口对接示例(API 创建工单)

# 1) 创建 API Token(在系统后台创建后替换)
TOKEN="replace_with_api_token"
BASE="http://127.0.0.1:8080/api/v1"

# 2) 创建用户(若不存在)
curl -s -X POST "$BASE/users" \
  -H "Authorization: Token token=$TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "firstname": "Ops",
    "lastname": "User",
    "email": "ops.user@example.com",
    "active": true
  }'

# 3) 创建工单(事件类:服务不可用)
curl -s -X POST "$BASE/tickets" \
  -H "Authorization: Token token=$TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "生产Nginx 502",
    "group": "运维一线",
    "customer_id": "ops.user@example.com",
    "article": {
      "subject": "页面502",
      "body": "xx系统访问出现502,开始时间 10:05,影响区域:华北",
      "type": "note"
    },
    "priority": "2 high",
    "state": "new"
  }'

# 预期:返回 ticket_id,可用于后续状态更新与关联变更

SLA 与状态流转示例(概念配置)

# /opt/itsm/sla.yaml
priorities:
  - name: P1
    response: 10m
    resolve: 2h
  - name: P2
    response: 30m
    resolve: 4h
  - name: P3
    response: 2h
    resolve: 24h

states:
  - new
  - open
  - pending_customer
  - pending_internal
  - solved
  - closed

escalation:
  - if: "response_overdue"
    action: "notify_oncall"
  - if: "resolve_overdue"
    action: "auto_escalate_to_manager"

自动化与标准化示例(脚本回填工单)

# /opt/itsm/auto_fix_nginx_502.sh
#!/usr/bin/env bash
# 目的:检测Nginx状态并重启,结果回填工单
TICKET_ID="$1"
TOKEN="replace_with_api_token"
BASE="http://127.0.0.1:8080/api/v1"

systemctl is-active nginx
if [ $? -ne 0 ]; then
  systemctl restart nginx
  RESULT="nginx已重启"
else
  RESULT="nginx运行正常,无需重启"
fi

curl -s -X POST "$BASE/ticket_articles" \
  -H "Authorization: Token token=$TOKEN" \
  -H "Content-Type: application/json" \
  -d "{
    \"ticket_id\": $TICKET_ID,
    \"subject\": \"自动化处理结果\",
    \"body\": \"$RESULT\",
    \"type\": \"note\"
  }"

# 用法:/opt/itsm/auto_fix_nginx_502.sh 123

排错与诊断(示例命令与说明)

# 1) 端口未监听
ss -lntp | grep 8080
# 预期:zammad 监听 8080

# 2) 容器健康检查
docker logs -f zammad | tail -n 50
# 预期:无连续错误,初始化完成

# 3) API 401/403
# 检查 Token 是否有效,确认 API 权限
curl -I -H "Authorization: Token token=$TOKEN" "$BASE/users"
# 预期:HTTP/1.1 200 OK

# 4) 邮件入口不收信
# 检查邮件拉取配置与端口连通
nc -vz imap.example.com 993
# 预期:succeeded

度量与报表示例(从工单导出到度量)

# 导出工单列表(示意),再用脚本计算平均响应/解决时间
curl -s -H "Authorization: Token token=$TOKEN" \
  "$BASE/tickets?per_page=50" > /tmp/tickets.json

# 使用 jq 统计(需要 jq)
jq '[.[] | .created_at] | length' /tmp/tickets.json
# 预期:返回工单数量

练习

  1. 使用上述 Docker 安装一套工单系统,并创建“服务请求/事件/变更”三类模板,分别设置必填字段与审批人。
  2. 通过 API 创建一张“事件类”工单,并模拟状态流转(new → open → solved → closed),记录每一步的回填内容。
  3. 编写一个自动化脚本:检测磁盘使用率超过 80% 时自动创建工单并回填清理结果。
  4. 配置一条 SLA:P1 响应 10 分钟、解决 2 小时,并触发超时升级通知,验证通知是否生效。

通过以上设计与实践,服务台与工单体系可与监控、CMDB、发布系统、权限系统形成闭环:告警自动建单、变更自动关联影响、资产信息辅助处理、自动化回填结果,最终形成可度量、可审计、可持续改进的运维交付体系。