作业地址
http://39.104.202.12:8000/monitor/cpu
自动化监控与报警
自动监控CPU,内存使用率
安装wechatpy、cryptography模块
import psutil, time, datetime
class Monitor():
cpu_data = []
@classmethod
def mem(cls, mem_max=90):
"""内存使用监控"""
val = psutil.virtual_memory().percent
# print(val)
if val > mem_max:
cls.send_msg('内存使用率为{:1f}%,超过{}%,请关注!!!'.format(val, mem_max))
@classmethod
def cpu(cls, cpu_max=90):
"""CPU使用监控"""
val = psutil.cpu_percent(1)
cls.cpu_data.append(val)
print(cls.cpu_data)
if len(cls.cpu_data) >= 3:
avg = sum(cls.cpu_data)/len(cls.cpu_data)
if val > cpu_max:
# cls.send_msg('CPU使用率为{:1f}%,超过{}%,请关注!!!'.format(avg, cpu_max))
# cls.email('CPU使用率为{:1f}%,超过{}%,请关注!!!'.format(avg, cpu_max))
cls.weChat('CPU使用率为{:1f}%,超过{}%,请关注!!!'.format(avg, cpu_max))
print('已向微信发送警告消息')
cls.cpu_data.pop(0)
@classmethod
def send_msg(cls, content):
"""发送报警信息"""
print(content)
@classmethod
def email(cls, content):
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
nickname = '监控程序'
sender = '295844041@qq.com'
password = 'wkezvmukjgqjbhjb'
reciever = 'zhengshucheng@idataway.com'
msg = MIMEText(content, 'html', 'utf-8')
msg['From'] = formataddr([nickname, sender])
msg['Subject'] = '自动报警' # 邮件主题
server = smtplib.SMTP_SSL('smtp.qq.com', 465)
try:
server.login(sender, password)
server.sendmail(sender, [reciever], msg.as_string())
except Exception as err:
print(er)
finally:
server.quit()
@classmethod
def weChat(cls, content):
"""发送微信提醒"""
from wechatpy import WeChatClient
client = WeChatClient('wxfe4f8777c09bd3fe', '71a2f3afbc44cfd56585dbe4e63dbbe8')
template_id = 'XJ-ezE5udUqsPg6XlC_O7y9nX5Ttu3sxwgKp6MUmYF4'
openid = 'oUyaM1Ra-KKjHRaiyNepr1ju1sZI'
data = {
'msg':{'value': content,'color': '#173177'},
'time': {'value': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'color': '#173177'},
}
client.message.send_template(openid, template_id, data)
"""
mem_max = 25
Monitor.mem(mem_max)
"""
cpu_max = 1
while True:
Monitor.cpu(cpu_max)
time.sleep(2)
自动化安装与配置——以ngix为例
自动化安装-以源码编译方式
去niginx官网查看文档:http://nginx.org/en/docs/configure.html,查看所需参数
自动化配置
自动化部署
分布式版本工具git的使用
-
为git仓库创造一个用户
useradd -m git #创建一个git的用户
-
为git用户设置密码
passwd git
-
切换到git用户
su - git
-
初始化仓库
git init --bare <projectname>.git # --bare表示创建的是空的仓库
使用Fabric批量部署项目
Docker
docker安装
步骤参见官方文档https://docs.docker.com
service docker stop/start/restart
docker info # 查看当前docker更多信息
docker --help # 查看相应帮助文档
镜像管理
-
docker hub : http://hub.docker.com
-
docker pull alpine # 拉取未指定标签的alpine
使用docker image 查看相关命令
docker image
docker image ls 或docker images # 当前已拉取的镜像
docker image rm <imageName> # 删除镜像
不要死记硬背命令,要善于查看帮助
容器管理
输入docker 查看相关命令
docker
查看管理命令
docker run alpine echo "hello docker"
docker container ls 或docker ps # 查看正在运行的镜像
docker container ls -a # 查看容器
docker container <containerID> # 删除容器
docker run -d alpine ping www.baidu.com # 后台使用alpine 去ping百度
docker stop <containerID> # 停止容器运行
docker run --rm <image> <cmd> # 容器停止运行后会自动删除容器,同时数据也会被删除
数据卷
将物理机中的目录映射到容器中
docker run --rm -v /root:/data alpine touch /data/test.txt # 将物理机中root目录映射到容器data中去,在容器data中创建一个文件test.txt,这个
docker run --rm -v "$(pwd):/data" alpine touch /data/test.txt # 将物理机中 **当前目录** 映射到容器data中去
docker run --rm -v "$(pwd):/data:ro" alpine touch /data/test.txt # 加上ro表明只进行**只读**映射
在docker中运行web服务
从docker hub中获取nginx镜像
docker pull nginx:alpine # 下载标签为alpine的nginx镜像
docker run --rm nginx:alpine # 运行nginx服务,但会卡在界面中
docker run -d --rm nginx:alpine
docker ps # 查看当前运行的容器
docker kill <CONTAINER ID > # 关闭容器
后台运行nginx后,还不能访问端口,可以(1)
docker run --rm -d -P nginx:alpine #
此时PORTS显示 0.0.0.0:32768->80/tcp,表明物理机中的32768端口映射到了容器中的80端口,这种端口是随机绑定映射的
(2)第(1)种方法物理机端口随机,无法提供稳定的服务,因此需要重新指定端口
docker run --rm -d -p 8080:80 nginx:alpine
查看所有运行中的docker 容器id
docker ps -q
docker kill -$(docker ps -q) # 关闭所有运行中的容器
构建镜像 docker build
构建镜像之前需要先编写Dockerfile
docker官方文档中reference:
- FROM: 指定基础镜像
- RUN:
- CMD: 指定容器启动时执行的命令
- LABLE: 用于添加扩展信息到容器中
- COPY:用于将文件拷贝到容器中
- WORKDIR:设置工作目录
利用vi Dockerfile 进入编辑页面
FROM alpine (也可以使用ubuntu:16.04)
LABEL version = '1.0'
LABEL description = 'my first image'
RUN apk update && apk add python3 #(如果使用ubuntu系统,则RUN apt update && apt -y install python3)
COPY . /code # 将当前目录下的文件拷贝到code目录中。此方式下修改原来目录中的文件,运行容器时结果仍然不变
WORKDIR /code # 指定容器运行后的工作目录
CMD ['<python3>', '<app.py>'] #
编辑完Dockerfile后
docker build -t myapp . # 在当前目录(.)中构建一个tag为myapp的镜像
docker inspect redis:alpine # 查看镜像
综合实战
python程序,将数据存放在redis中,并且
-
创建目录存放数据
mkdir /redis-data docker run -d --name redis -v /redis-data:/data redis:alpine # 为容器指定一个名字 --name <ContainerName>
-
创建python文件
mkdir myweb cd myweb/ vi app.py
编辑app.py 文件
# 使用flask创建一个web服务 from flask import Flask import redis app = Flask(__name__) # 连接redis r = redis.Redis(host='redis', port=6379) @app.route('/') def hello(): count = r.incr('clicks') return "ZSC love CS! {}".format(count) if __name__ == '__main__': app.run('0.0.0.0', port=5000)
-
编辑Dockerfile
FROM python:alpine # docker 提供了python镜像 COPY . /code RUN pip install flask redis #不用使用pip3 WORKDIR /code EXPOSE 5000 # 开放5000的端口 CMD ['python', 'app.py']
-
构建镜像
docker build -t myweb .
-
启动运行app
docker run --rm -d -p 80:5000 myweb
访问地址后,显示Internal Server Error,但是虽然80已经映射到了myweb容器的5000端口,而redis和pythonl两个容器之间是隔离的。 -
连接redis后启用镜像
docker run --rm --link redis -p 80:5000 myweb
网友评论