从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.pyimport 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的管理接口,暂时先这样吧