今天开始抽时间将运维平台怎么从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
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号