从0到1开发自动化运维平台 Day1

今天开始抽时间将运维平台怎么从0到1的实现分享给大家.

后端用的djangorestframework框架,今天先创建一个django项目,实现区域和IDC的管理.

1、创建目录,初始化虚拟环境,然后安装drf框架

  ~ mkdir ydevops-backend
  ~ cd ydevops-backend
  ~ python3.9 -m venv venv
  ~ source venv/bin/activate
(venv)    pip install djangorestframework
(venv)    pip list
Package             Version
------------------- --------
asgiref             3.6.0
Django              4.1.7
djangorestframework 3.14.0
pip                 22.0.4
pytz                2022.7.1
setuptools          58.1.0
sqlparse            0.4.3
WARNING: You are using pip version 22.0.4; however, version 23.0.1 is available.
You should consider upgrading via the '/home/charles/ydevops-backend/venv/bin/python3.9 -m pip install --upgrade pip' command.

2、创建工程

(venv)   django-admin startproject devops_backend .  # 注意后面有个点
(venv)   ls
devops_backend  manage.py  venv

3、创建第一个模块,cmdb模块

(venv)    django-admin startapp cmdb
(venv)    ls
cmdb  devops_backend  manage.py  venv

4、重新梳理下代码结构

(venv)    mkdir apps
(venv)    mv cmdb apps/

代码结构变化后,我们还需要修改下settings.py

import os
import sys
...
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

5、生成数据表及创建用户

(venv)    python manage.py migrate       
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK
(venv)    python manage.py createsuperuser
用户名 (leave blank to use 'charles'): admin
电子邮件地址: admin@localhost
Password: 
Password (again): 
密码长度太短。密码必须包含至少 8 个字符。
这个密码太常见了。
密码只包含数字。
Bypass password validation and create user anyway? [y/N]: y   
Superuser created successfully.

6、运行项目

(venv)    python manage.py runserver 0.0.0.0:9000           
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
March 21, 2023 - 13:43:54
Django version 4.1.7, using settings 'devops_backend.settings'
Starting development server at http://0.0.0.0:9000/
Quit the server with CONTROL-C.

此时打开浏览器,应该可以看到首页,如下图所示:

7、现在我们开始来编写区域表Region和IDC表Idc

# 创建模型、视图和序列化器
(venv)    cd apps/cmdb
(venv)    mkdir model serializer view
(venv)    touch {model,serializer,view}/__init__.py

公共模型

# model/model_assets.py
from django.db import models


class TimeAbstract(models.Model):
    update_time = models.DateTimeField(
        auto_now=True, null=True, blank=True, verbose_name='更新时间')
    created_time = models.DateTimeField(
        auto_now_add=True, null=True, blank=True, verbose_name='创建时间')

    class ExtMeta:
        related = False
        dashboard = False

    class Meta:
        abstract = True
        ordering = ['-id']


Region模型

# model/model_assets.py
class Region(TimeAbstract):
    name = models.CharField(max_length=100, unique=True, verbose_name='地域')
    alias = models.CharField(max_length=128, default='', verbose_name='地域别名')
    desc = models.TextField(verbose_name='详情描述', null=True, blank=True)
    extra = models.JSONField(default=dict, verbose_name='扩展字段')
    # {0: 禁用, 1: 启用}
    is_enable = models.SmallIntegerField(
        default=1, verbose_name='启用', help_text='状态 {0: 禁用, 1: 启用},默认值为1')

    def __str__(self) -> str:
        return self.alias

    class ExtMeta:
        related = True
        dashboard = True

    class Meta:
        verbose_name = '地域'
        verbose_name_plural = verbose_name + '管理'

Idc模型

IDC_TYPE = (
    (0, '物理机房'), (1, '公有云')
)


class Idc(TimeAbstract):
    """
    Idc模型
    """
    name = models.CharField(max_length=100, unique=True, verbose_name='名称')
    alias = models.CharField(max_length=128, unique=True, verbose_name='别名')
    region = models.ForeignKey(
        Region, blank=True, null=True, on_delete=models.PROTECT, verbose_name='区域')
    type = models.SmallIntegerField(default=0, choices=IDC_TYPE, verbose_name='机房类型',
                                    help_text=f"可选: {IDC_TYPE}")
    supplier = models.CharField(
        max_length=128, default=None, null=True, blank=True, verbose_name='服务商')
    config = models.JSONField(default=dict, verbose_name='配置信息',
                              help_text='阿里云:{"key":"key","secret":"secret","region":["cn-south-1"],"project":[]}
华为云:{"domain":"domain","user":"user","password":password","project":[{"region":"region","project_id":"project_id"}]}')
    forward = models.BooleanField(default=False, verbose_name='是否中转')
    ops = models.CharField(max_length=100, blank=True,
                           null=True, verbose_name='运维机器')
    repo = models.SmallIntegerField(default=0, verbose_name='镜像仓库')
    contact = models.JSONField(default=list, verbose_name='联系人')
    desc = models.TextField(default='', null=True,
                            blank=True, verbose_name='备注')

    def __str__(self):
        return self.name

    class ExtMeta:
        related = True
        dashboard = True
        icon = 'international'

    class Meta:
        verbose_name = 'IDC机房'
        verbose_name_plural = verbose_name + '管理'

8、创建区域和IDC表

(venv)   cd ../..
(venv)   python manage.py makemigrations
Migrations for 'cmdb':
  apps/cmdb/migrations/0001_initial.py
    - Create model Region
    - Create model Idc
(venv)   python manage.py migrate       
Operations to perform:
  Apply all migrations: admin, auth, cmdb, contenttypes, sessions
Running migrations:
  Applying cmdb.0001_initial... OK

9、编写序列化器

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@author  :   Charles Lai
@file    :   serializer_assets.py
@time    :   2023/03/21 22:18
@contact :   qqing_lai@hotmail.com
'''

# here put the import lib
from rest_framework import serializers

from cmdb.models import Region, Idc


class RegionSerializers(serializers.ModelSerializer):

    class Meta:
        model = Region
        fields = '__all__'


class IdcSerializers(serializers.ModelSerializer):

    class Meta:
        model = Idc
        fields = '__all__'

10、编写视图

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@author  :   Charles Lai
@file    :   view_assets.py
@time    :   2023/03/21 22:21
@contact :   qqing_lai@hotmail.com
'''

# here put the import lib
from rest_framework import viewsets

from cmdb.models import Region, Idc
from cmdb.serializer import RegionSerializers, IdcSerializers


class RegionViewSet(viewsets.ModelViewSet):
    """
    区域视图

    ### 区域权限
        {'*': ('env_all', '区域环境管理')},
        {'get': ('env_list', '查看区域环境')},
        {'post': ('env_create', '创建区域环境')},
        {'put': ('env_edit', '编辑区域环境')},
        {'patch': ('env_edit', '编辑区域环境')},
        {'delete': ('env_delete', '删除区域环境')}
    """
    perms_map = (
        {'*': ('admin', '管理员')},
        {'*': ('env_all', '区域环境管理')},
        {'get': ('env_list', '查看区域环境')},
        {'post': ('env_create', '创建区域环境')},
        {'put': ('env_edit', '编辑区域环境')},
        {'patch': ('env_edit', '编辑区域环境')},
        {'delete': ('env_delete', '删除区域环境')}
    )
    queryset = Region.objects.all()
    serializer_class = RegionSerializers


class IdcViewSet(viewsets.ModelViewSet):
    """
    IT资产 - IDC视图

    ### IDC权限
        {'*': ('itasset_all', 'IT资产管理')},
        {'get': ('itasset_list', '查看IT资产')},
        {'post': ('itasset_create', '创建IT资产')},
        {'put': ('itasset_edit', '编辑IT资产')},
        {'delete': ('itasset_delete', '删除IT资产')}
    """
    perms_map = (
        {'*': ('admin', '管理员')},
        {'*': ('itasset_all', 'IT资产管理')},
        {'get': ('itasset_list', '查看IT资产')},
        {'post': ('itasset_create', '创建IT资产')},
        {'put': ('itasset_edit', '编辑IT资产')},
        {'delete': ('itasset_delete', '删除IT资产')}
    )
    queryset = Idc.objects.all()
    serializer_class = IdcSerializers

11、添加路由,修改devops_backend/urls.py

"""devops_backend URL Configuration
"""
from django.contrib import admin
from django.urls import path, include

from rest_framework.routers import DefaultRouter

from cmdb.views import RegionViewSet, IdcViewSet

router = DefaultRouter()
router.register('region', RegionViewSet)
router.register('asset/idc', IdcViewSet)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include(router.urls)),
]

12、这样我们就实现了区域和IDC的管理了,此时打开http://localhost:9000/api/?format=api,应看到下图所示:

点击进入每个路由都可以进行get和post请求操作.

好了,今天就实现region和idc的管理接口,暂时先这样吧

展开阅读全文

页面更新:2024-04-13

标签:区域环境   环境管理   视图   机房   地域   模型   区域   资产   编辑   密码   平台

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top