整体流程与环境说明
整体流程如下图,请感受灵魂画师的功力:
Django:2.1.1
,阿里云服务器
Python:3.6.4
,安装方法见:https://rorschachchan.github.io/2018/07/31/获取网站title的脚本/
Django启动
由于是python3,所以直接pip install django
就安装最新的Django版本。
1
2
3
4
5django-admin startproject Kubernetes #如果提示django-admin命令不存在可以做一个软连接到/usr/local/bin/目录下
cd Kubernetes
python manage.py startapp createyaml #创建APP
python manage.py migrate
python manage.py createsuperuser
app创建完毕之后,在Kubernetes/settings.py
的INSTALLED_APPS
字段添加createyaml
,此时就创建好了项目和app。python manage.py runserver 0.0.0.0:8000
启动django,然后浏览器地址栏输入外网IP:8000
,就会看到django正常启动了,如图:
Django准备
首先我们先准备一个脚本111.sh
,这个脚本很简单,就是接收到前端传入的数值然后加工成一个yaml文件,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#用来生成对应的yaml文件
cat << EOF
=============================
=== HERE IS YOUR YAML ===
=============================
EOF
echo apiVersion: v1
echo kind: $1
echo metadata:
echo name: $2
echo labels:
echo app: web
echo spec:
echo containers:
echo -- name: front-end
echo image: $5
echo ports:
echo -- containerPort: $3
echo -- name: rss-reader
echo image: nickchase/rss-php-nginx:v1
echo ports:
echo - containerPort: $4
可以看出上面这个生成yaml脚本太粗糙了,很多地方还有待改进,但是这仅仅是一个小例子而已。再去/django/Kubernetes/createyaml/templates
里准备一个比较简单的前端页面脚本,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>创建yaml文件</title>
</head>
<body>
<h1>创建YAML文件用于K8s部署</h1>
<h2>请根据实际情况填写以下内容</h2>
<form method="post" action="/create_yaml/">
<input type="text" name="kind" placeholder="类型"><br>
<input type="text" name="name" placeholder="名称"><br>
<input type="text" name="containerPort1" placeholder="容器端口1"><br>
<input type="text" name="containerPort2" placeholder="容器端口2"><br>
<input type="text" name="mirror" placeholder="镜像"><br>
{{ error }}<br>
<button id="btn" type="submit">生成yaml</button>
{% csrf_token %}
<!-- 标签添加CSRF令牌,这是因为django针对CSRF(跨站请求伪造)有保护措施,没有这句话就是403 --!>
</form>
</body>
</html>
有了页面,还需要一个域名指向这个页面,修改一下/django/Kubernetes/Kubernetes/urls.py
,改成如下:
1
2
3
4
5
6
7
8from django.contrib import admin
from django.urls import path
from createyaml import views #将createyaml这个app的views引进
urlpatterns = [
path('admin/', admin.site.urls),
path(r'create_yaml/', views.create_yaml), #新版的这里不再是url了,把这个url指向views.py里的create_yaml函数
]
再继续,写一下views.py
里的create_yaml
函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14import subprocess #引入这个库
#创建yaml
def create_yaml(request):
if request.method == 'POST':
kind = request.POST.get('kind', '') #后面的''是默认值的意思
name = request.POST.get('name', '')
containerPort1 = request.POST.get('containerPort1', '')
containerPort2 = request.POST.get('containerPort2', '')
mirror = request.POST.get('mirror', '')
result = subprocess.Popen(args=['bash','/docker/111.sh',name,mirror,containerPort1,containerPort2],stdout = subprocess.PIPE,shell = False).stdout.read() #在这里通过subprocess去启动111.sh这个脚本
return HttpResponse(result,content_type="text/plain")
else:
return render(request,'createyaml.html')
以上函数多说几句:
- 首先判断请求的方法是否是
POST
,不是的话返回该页面; request.POST.get
方法获取前端传入的名称或者端口等值,此处的kind
、name
、mirror
和containerPort
就是html文件里form表单部分那两个input
标签的name
属性;- 获取到了变量,然后就让
subprocess
来调用111.sh来用这些变量去运行脚本,执行的结果就是result
,然后return
这个result
结果; - 使用subprocess最好不打开
shell = True
,因为这样的话,要是不小心rm -rf /
,你就gg了,但是如果shell = False
的话,就会把刚才的命令看成rm
和-rf /
两部分,也就是不能成功,这样也免去了别人恶意注入的危险;
实际操作效果
参考资料
https://blog.csdn.net/xiaoyaozizai017/article/details/72794469
http://lipeilipei.top/2018/02/07/python+django%E5%AE%9E%E7%8E%B0%E7%99%BB%E9%99%86%E5%8A%9F%E8%83%BD%EF%BC%88%E4%B8%8B%E7%AF%87%EF%BC%89/
https://blog.csdn.net/bjbz_cxy/article/details/79358718 (如果不想用django就可以看看这个cgi方法)
http://blog.51cto.com/laomomo/2163399