项目实战: 基于Ansible的云平台自动化运维系统

一、项目介绍

1.项目介绍

本项目通过KVM虚拟化搭建Linux系统集群,使用 Ansible实现Linux集群下的批量部署与自动化管理,实现Web形式的自动化运维系统,集中批量控制服务器, 最终实现能支撑1000台实例的环境提供管理和自动化任务, 提高运维工程师的工作质量和效率。 项目基于HTTP实现自动化任务接受和响应接口设计,基于MySQL用作的关系型数据存取, 基于Redis的任务锁机制和消息队列, 基于MongoDB的事件日志记录, 最终实现邮件通知功能、敏感数据加密功能、日志事件记录功能。

2.项目背景

(1)互联网快速发展
网站用户规模、使用快速上升
要求庞大系统支撑能力
更加快速的运维效率应对突发流量
更加自动化的方式减少人工投入成本
更加可靠的技术手段,保障系统的稳定
(2)云时代
腾讯云、阿里云、亚马逊云、青云等云厂商的市场份额不断增加
大部分技术架构设计不再以网络设计、IDC和系统硬件等方面作为重点
运维基础的、繁琐的工作逐步减少
小公司也不再需要一个运维工程师或者系统工程师

结论: 在这样的时代背景下, 大型互联网公司为了应对市场的快速变化,就需要运维自动化

在这里插入图片描述

二、项目环境搭建

1.项目目录的配置

创建Django项目CMDB
连接并配置远程服务器
[Tools] -> [Deployment]

具体操作如下:
新建一个django项目
在这里插入图片描述
在这里插入图片描述
查看django版本
在这里插入图片描述
配置本地目录和远程服务器目录的映射(Mapping)
在这里插入图片描述
在这里插入图片描述
上述操作完成, 本地文件修改, 远程服务器文件也同时修改

2.远程服务器虚拟环境的配置

连接远程服务器
在这里插入图片描述

在这里插入图片描述
上传文件到服务器
在这里插入图片描述

  • 创建虚拟环境并激活虚拟环境
    安装virtuaenv
    在服务器上建虚拟环境
[root@docker CMDB]# virtualenv -p /usr/bin/python3 env
created virtual environment CPython3.6.8.final.0-64 in 384ms
  creator CPython3Posix(dest=/data/www/CMDB/env, clear=False, global=False)
  seeder FromAppData(download=False, pip=latest, setuptools=latest, wheel=latest, via=copy, app_data_dir=/root/.local/share/virtualenv/seed-app-data/v1.0.1)
  activators PythonActivator,FishActivator,XonshActivator,CShellActivator,PowerShellActivator,BashActivator
[root@docker CMDB]# 
[root@docker CMDB]# ls
CMDB  env  manage.py
[root@docker CMDB]# source env/bin/activate
(env) [root@docker CMDB]# pip install django==2.2 -i https://pypi.douban.com/simple

  • 出现的报错及处理方式
# sqlite版本问题 django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).

解决方式: 不使用sqlite存储数据, 使用mysql
屏蔽数据库设置

# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases

# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#     }
# }
  • 远程服务器解释器和目录映射的配置
    在这里插入图片描述
  • 在远程服务器上测试Django项目是否可以成功运行
python manage.py runserver

3.MySQL数据库配置

远程用户登录配置
连接数据库
设置用户授权

[root@docker CMDB]# systemctl start mariadb
[root@docker CMDB]# systemctl enable mariadb

[root@docker CMDB]# mysql -uroot -pdaliu

#创建数据库
MariaDB [(none)]> create database if not exists devopsProject default charset utf8;
Query OK, 1 row affected (0.00 sec)

#新建用户
MariaDB [(none)]> create user devops@'%' identified by 'devops';
Query OK, 0 rows affected (0.00 sec)

# 用户授权
MariaDB [(none)]>  grant all on devopsProject.* to devops@'%';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> Bye

  • 测试试用户授权是否成功
(env) [root@docker CMDB]# mysql -udevops -pdevops

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| devopsProject      |
+--------------------+
2 rows in set (0.00 sec)

4.django数据库配置

  • 修改配置文件的信息
ALLOWED_HOSTS = ['*']
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'devopsProject',
        'USER': 'devops',
        'PASSWORD': 'devops',
        'HOST': '39.101.175.120',
        'PORT': '3306',
    }
}
LANGUAGE_CODE = 'zh-hans' 
TIME_ZONE = 'Asia/Shanghai'
问题:

登陆root 设置了mysql数据库用户 用-hIP登陆不上,
原因:阿里云安全组吧3306端口加入

一定要上传代码到云服务器

2.runserver时
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
解决方法: pip安装mysqlclient(若安装包失败,是因为缺少开发包的原因, yum安装mariadb-devel和python-devel)

3.编码问题
在这里插入图片描述

  • 生成数据库表
(env) [root@docker CMDB]# python manage.py makemigrations # 生成迁移脚本 
(env) [root@docker CMDB]# python manage.py migrate # 写入数据库, 创建关于用户和用户组等数据表信息 
(env) [root@docker CMDB]# python manage.py createsuperuser # 创建超级用户 
# 启动项目, 访问网址http://IP:8000/admin 
(env) [root@docker CMDB]# python manage.py runserver 0.0.0.0:8000
  • 测试

在这里插入图片描述
这里如果访问39.101.175.120:8000无法访问的话
可能原因:
1.在代码setting中没有允许此IP访问
ALLOWED_HOSTS = [’*’]
2.阿里云安全组规则没有加入8000端口

  • 测试数据表是否创建?数据信息是否写入?
    连接mariadb数据库
    在这里插入图片描述
    配置数据库信息
    在这里插入图片描述
    访问数据库表和数据内容
    在这里插入图片描述
    数据库表配置结束

三、DevOPS工程

开发环境、生产环境、测试环境都有自己的数据库,不能混为一谈,否则会对造成麻烦
实现devops工程之前, 使用Pycharm编辑器工具创建devops项目。

1.Django工程多配置文件

在这里插入图片描述

  • base.py文件: 基本的配置文件,将原先seetings.py文件的内容拷贝进来.(参考第一个devops项目)
配置数据库
配置时区和语言
  • development.py文件: 开发环境的配置文件
from .base import * 
DEBUG = True

开发环境中DEBUG = True,因为我们呢需要通过报错解决问题
生产环境中一定不能开启DEBUG,因为使用者是用户或者黑客,一旦暴露报错,就给了黑客机会

  • production.py文件: 生产环境的配置文件
from .base import * 
#开发环境一定要关闭调试模式 
DEBUG = False 
#允许所有主机访问 ALLOWED_HOSTS = ['*']
  • 修改manage.py文件, 默认寻找的设置文件是当前项目中的settings文件, 如果是开发环境, 修改如下:
def main():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'CMDB.settings.develop')
	#。。。。。。
if __name__ == '__main__':
    main()

如果项目将来需要上线, 修改启动项目访问的配置文件为生产环境的配置文件即可, 如下:

def main():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'CMDB.settings.product')
	#。。。。。。
if __name__ == '__main__':
    main()
  • 启动项目
 python manage.py runserver

2.Django工程应用与模块加载

为了方便在一个大的Django项目中,管理实现不同的业务功能, 我们会在项目中创建多个APP实现功
能。为了更加方便管理APP, 项目结构更加清晰。可以专门创建apps目录存储项目应用, 专门创建extra_apps存储项目第三方APP, 项目结构如下所示:
在这里插入图片描述
但项目运行时, 不会自动寻找apps和extra_apps子目录中创建的APP, 需要手动在配置文件中配置,
修改devops/settings/base.py文件, 添加内容如下:

创建应用

(env) [root@docker apps]# python ../manage.py startapp scanhost
(env) [root@docker apps]# ls
__init__.py  scanhost

在服务器端建的,本地并没有,下载到本地

修改配置文件,手动添加应用

INSTALLED_APPS = [
    'apps.scanhost',
]

3.连接远程虚拟环境

在这里插入图片描述
在这里插入图片描述

问题

在这里插入图片描述
解决:Alt+Enter自行intall

生成公钥

(env) [root@docker ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Passphrases do not match.  Try again.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:kVqcZ6BrU58q4dY9Z/6uYa+81Sl4m0fLSEXU+i8PpSg root@docker
The key's randomart image is:
+---[RSA 2048]----+
|        .     ...|
|       o +     ..|
|      . B o   .. |
|       = = .  .. |
|      * S o   ...|
|     o + o  .o =o|
|      + o E.BoB.+|
|     . .   O.===.|
|            *O=o.|
+----[SHA256]-----+
(env) [root@docker ~]# 

(env) [root@docker ~]# cd /root/.ssh/
(env) [root@docker .ssh]# ssh-copy-id -i ~/.ssh/id_rsa.pub daliu@localhost:/mnt/
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: ERROR: ssh: Could not resolve hostname localhost:/mnt/: Name or service not known

(env) [root@docker .ssh]# ssh-copy-id -i id_rsa.pub daliu@localhost
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "id_rsa.pub"
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:qk1sSJr+ZyQU7Otnr6tLY5rX+80DGPIzKByFwYv/Mq8.
ECDSA key fingerprint is MD5:7e:de:36:5e:3a:f4:93:50:55:d0:64:60:d1:37:e7:e9.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
daliu@localhost's password: 
Permission denied, please try again.
daliu@localhost's password: 
Permission denied, please try again.
daliu@localhost's password: 
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
(env) [root@docker .ssh]# 

Logo

鸿蒙生态一站式服务平台。

更多推荐