Xây Dựng và Triển Khai Hệ Thống CMDB với Django

Tổng quan về ITIL và Cấu trúc quản trị

ITIL (Information Technology Infrastructure Library - Thư viện cơ sở hạ tầng công nghệ thông tin) là một bộ tiêu chuẩn toàn cầu dành cho Quản lý Dịch vụ CNTT (ITSM). Ban đầu được phát triển bởi chính phủ Anh, ITIL cung cấp một khung lý thuyết khách quan và có thể đo lường được để tổ chức có thể tối ưu hóa các dịch vụ công nghệ. ITIL không phải là một phần mềm cụ thể, mà là một tập hợp các phương pháp luận tốt nhất (best practices) để doanh nghiệp tham khảo xây dựng quy trình nội bộ. Khi triển khai hệ thống tự động hóa, việc tham khảo mô hình 5 thành phần cốt lõi của ITIL sẽ giúp đội ngũ kỹ thuật đi đúng hướng.

Các thành phần chính trong ITIL

  • Quản lý sự cố (Incident Management): Tập trung vào việc khôi phục dịch vụ nhanh chóng nhất có thể để giảm thiểu tác động đến hoạt động kinh doanh. Quy trình này bao gồm ghi nhận, phân loại, và xử lý sự cố cho đến khi hoàn tất.
  • Quản lý vấn đề (Problem Management): Nhắm vào nguyên nhân gốc rễ của các sự cố lặp lại nhằm ngăn chặn chúng tái diễn. Thành phần này đóng vai trò như một kho kiến thức (knowledge base) hỗ trợ chẩn đoán và đưa ra giải pháp phòng ngừa.
  • Quản lý cấu hình (Configuration Management): Đây là nền tảng dữ liệu chứa thông tin chi tiết về tất cả các thành phần (cấu hình item - CI) trong hệ thống, bao gồm cả phần cứng (máy chủ, ổ cứng) và phần mềm. CMDB (Configuration Management Database) chính là hiện thực hóa của thành phần này.
  • Quản lý thay đổi (Change Management): Kiểm soát quy trình thực hiện các thay đổi đối với hạ tầng nhằm giảm thiểu rủi ro gián đoạn dịch vụ. Mọi thay đổi đều cần được đánh giá, phê duyệt và theo dõi nghiêm ngặt.
  • Quản lý phát hành (Release Management): Quản lý việc phân phối, triển khai các phiên bản phần mềm hoặc cập nhật cấu hình mới ra môi trường sản xuất thực tế.

Vai trò của CMDB trong Quản trị CNTT

CMDB là thành phần cốt lõi của ITIL, lưu trữ và quản lý thông tin về toàn bộ tài sản CNTT. Theo thống kê, khoảng 70% đến 80% các vấn đề về CNTT có liên quan trực tiếp đến các thay đổi trong môi trường hệ thống. Trong một hệ thống lớn và phức tạp (ví dụ: các hệ sinh thái của Google hay Baidu), không một cá nhân nào nắm toàn bộ kiến trúc. Nếu một đội ngũ thay đổi API dịch vụ mà không biết các dịch vụ khác đang phụ thuộc vào nó, sự cố là điều khó tránh khỏi. CMDB giải quyết vấn đề này bằng cách lưu trữ mối quan hệ ánh xạ giữa các thành phần, cho phép xác định tác động lan truyền khi có thay đổi.

Để xây dựng một hệ thống tự động hóa hiệu quả, tiêu chuẩn hóa và quy trình hóa là điều kiện tiên quyết. CMDB giúp enforce (ép buộc) các quy trình này thông qua dữ liệu tập trung. Các chức năng tối thiểu của một CMDB bao gồm:

  • Tích hợp (Integration): Gom dữ liệu từ nhiều nguồn khác nhau.
  • Đối chiếu (Reconciliation): Đảm bảo dữ liệu nhất quán, không trùng lặp giữa các nguồn.
  • Đồng bộ (Synchronization): Cập nhật dữ liệu thời gian thực dựa trên các thay đổi được phê duyệt.
  • Ánh xạ và Trực quan hóa (Mapping & Visualization): Hiển thị các mối quan hệ phụ thuộc giữa các ứng dụng và hạ tầng.

Mô hình dữ liệu và Thiết kế Database

Trước khi triển khai mã nguồn, cần xác định rõ các thực thể (Entity) và cấu trúc dữ liệu cho CMDB. Dưới đây là phác thảo sơ bộ các bảng dữ liệu cần thiết:


# Phân loại cấu hình thiết bị cần lưu trữ:

# 1. Máy chủ (Server)
#    - Thông số phần cứng: CPU, RAM, ổ cứng (Disk), RAID card
#    - Thông tin mạng: Địa chỉ MAC, tốc độ card mạng
#    - Thông số hệ thống: Hệ điều hành, hostname, số sê-ri (SN), trạng thái hoạt động

# 2. Thiết bị mạng (Network Device)
#    - Số lượng cổng, thông số cổng (Bandwidth)
#    - Địa chỉ IP quản lý, phiên bản Firmware

# 3. Thiết bị lưu trữ (Storage)
#    - Dung lượng, loại ổ cứng, model thiết bị

# 4. Tài sản phần mềm (Software Asset)
#    - Tên phần mềm, phiên bản, mục đích sử dụng, giấy phép

# 5. Địa lý (Data Center)
#    - Thông tin phòng máy, tủ rack (dung tích U, tải nguồn)
#    - Vị trí U (Unit) của thiết bị trong tủ

# 6. Quan hệ nghiệp vụ
#    - Người quản lý thiết bị (Admin)
#    - Thuộc về nhóm dịch vụ nào (Business Line - Yêu cầu cấu trúc phân cấp cây/thư mục)

Tùy chỉnh mô hình Người dùng (User Authentication) trong Django

Đối với các dự án quy mô lớn như CMDB, việc sử dụng mô hình `User` mặc định của Django thường không đáp ứng đủ nhu cầu. Có hai cách tiếp cận chính: mở rộng bằng quan hệ One-to-One hoặc kế thừa trực tiếp (AbstractBaseUser). Phương pháp kế thừa được khuyến nghị cho sự linh hoạt và hiệu suất tốt hơn.

Dưới đây là ví dụ về việc tạo một mô hình người dùng tùy chỉnh hoàn toàn:


from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin

class AccountManager(BaseUserManager):
    def create_user(self, email, full_name, password=None):
        if not email:
            raise ValueError('Người dùng phải có địa chỉ email')
        
        user = self.model(
            email=self.normalize_email(email),
            full_name=full_name,
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, full_name, password):
        user = self.create_user(
            email=email,
            full_name=full_name,
            password=password,
        )
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)
        return user

class SystemUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=255, unique=True)
    full_name = models.CharField(max_length=128)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    date_joined = models.DateTimeField(auto_now_add=True)

    objects = AccountManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['full_name']

    def __str__(self):
        return self.email

    def get_short_name(self):
        return self.full_name

Sau khi định nghĩa mô hình, cần cập nhật file `settings.py` để Django sử dụng bảng này:


AUTH_USER_MODEL = 'core.SystemUser'

Và cấu hình lại giao diện Admin để hỗ trợ đổi mật khẩu đúng cách:


from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from core.models import SystemUser

@admin.register(SystemUser)
class SystemUserAdmin(BaseUserAdmin):
    list_display = ('email', 'full_name', 'is_staff')
    list_filter = ('is_staff', 'is_superuser')
    fieldsets = (
        (None, {'fields': ('email', 'password')}),
        ('Thông tin cá nhân', {'fields': ('full_name',)}),
        ('Quyền hạn', {'fields': ('is_active', 'is_staff', 'is_superuser')}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'full_name', 'password1', 'password2'),
        }),
    )
    search_fields = ('email',)
    ordering = ('email',)

Thiết kế và Triển khai RESTful API

API đóng vai trò cầu nối giữa CMDB và các công cụ tự động hóa khác (như Ansible, SaltStack). Việc tuân thủ chuẩn RESTful giúp hệ thống dễ mở rộng và bảo trì. Nguyên tắc cốt lõi:

  • URI đại diện cho tài nguyên (Resource) - là danh từ, không chứa động từ.
  • Sử dụng các HTTP Method (GET, POST, PUT, DELETE) để thể hiện hành động.
  • Tránh đưa phiên bản vào URL (ví dụ: `/api/v1/...`), nên sử dụng Header.

Sử dụng Django REST Framework

Django REST Framework (DRF) là thư viện tiêu chuẩn để xây dựng API nhanh chóng và an toàn.

1. Cài đặt và Cấu hình:


pip install djangorestframework

Thêm `rest_framework` vào `INSTALLED_APPS` trong `settings.py`.

2. Định nghĩa Serializer:

Serializer giúp chuyển đổi dữ liệu Model sang các định dạng như JSON hoặc XML.


from rest_framework import serializers
from core.models import SystemUser

class SystemUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = SystemUser
        fields = ('id', 'email', 'full_name', 'is_active')

3. Định nghĩa ViewSet:


from rest_framework import viewsets
from core.models import SystemUser
from .serializers import SystemUserSerializer

class SystemUserViewSet(viewsets.ModelViewSet):
    queryset = SystemUser.objects.all()
    serializer_class = SystemUserSerializer

4. Cấu hình Routing:


from django.urls import path, include
from rest_framework.routers import DefaultRouter
from core.api.views import SystemUserViewSet

router = DefaultRouter()
router.register(r'users', SystemUserViewSet)

urlpatterns = [
    path('api/', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

Bảo mật cho API

Việc mở API công khai sẽ gây ra rủi ro bảo mật cao. Một cơ chế xác thực thường dùng là phương pháp Token kết hợp Timestamp và chữ ký số (Signature).

Nguyên lý hoạt động:

  1. Server cấp cho Client một SECRET_KEY bảo mật.
  2. Client khi gửi request sẽ tạo ra chuỗi dữ liệu gồm: Username + Timestamp + SECRET_KEY và mã hóa nó thành chuỗi hash (ví dụ: MD5).
  3. Client gửi request kèm theo Username, TimestampSignature (chuỗi hash vừa tạo).
  4. Server nhận request:
    • Kiểm tra Username có tồn tại không.
    • Kiểm tra Timestamp (chênh lệch thời gian so với server không quá 2 phút để tránh Replay Attack).
    • Kiểm tra Redis để đảm bảo request này chưa được xử lý trong khoảng thời gian cho phép.
    • Server thực hiện tính toán hash riêng dựa trên dữ liệu nhận được và so sánh với Signature của Client. Nếu khớp, xác thực thành công.

Thẻ: Django CMDB python ITIL RESTful API

Đăng vào ngày 16 tháng 7 lúc 17:27