使用python脚本自动生成K8S-YAML

1、生成 servie.yaml

1.1、yaml转json

service模板yaml

apiVersion: v1

kind: Service

metadata:

name: ${jarName}

labels:

name: ${jarName}

version: v1

spec:

ports:

- port: ${port}

targetPort: ${port}

selector:

name: ${jarName}

转成json的结构

{

"apiVersion": "v1",

"kind": "Service",

"metadata": {

"name": "${jarName}",

"labels": {

"name": "${jarName}",

"version": "v1"

}

},

"spec": {

"ports": [

{

"port": "${port}",

"targetPort": "${port}"

}

],

"selector": {

"name": "${jarName}"

}

}

}

1.2、关键代码

# 通过传入service_name及ports列表

def create_service_yaml(service_name, ports):

# 将yaml读取为json,然后修改所有需要修改的${jarName}

service_data['metadata']['name'] = service_name

service_data['metadata']['labels']['name'] = service_name

service_data['spec']['selector']['name'] = service_name

# .spec.ports 比较特殊,是一个字典列表,由于传入的ports难以确定数量,难以直接修改

# 新建一个列表,遍历传入的ports列表,将传入的每个port都生成为一个字典,添加入新列表中

new_spec_ports = []

for port in ports:

port = int(port)

new_port = {'port': port, 'targetPort': port}

new_spec_ports.append(new_port)

# 修改.spec.ports为新列表

service_data['spec']['ports'] = new_spec_ports

2、生成 deployment.yaml

2.1、yaml转json

deployment模板yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: ${jarName}

labels:

name: ${jarName}

spec:

selector:

matchLabels:

name: ${jarName}

replicas: 1

template:

metadata:

labels:

name: ${jarName}

spec:

containers:

- name: ${jarName}

image: reg.test.local/library/${jarName}:${tag}

imagePullSecrets:

- name: registry-secret

转成的json结构

{

"apiVersion": "apps/v1",

"kind": "Deployment",

"metadata": {

"name": "${jarName}",

"labels": {

"name": "${jarName}"

}

},

"spec": {

"selector": {

"matchLabels": {

"name": "${jarName}"

}

},

"replicas": 1,

"template": {

"metadata": {

"labels": {

"name": "${jarName}"

}

},

"spec": {

"containers": [

{

"name": "${jarName}",

"image": "reg.test.local/library/${jarName}:${tag}"

}

],

"imagePullSecrets": [

{

"name": "registry-secret"

}

]

}

}

}

}

2.2、关键代码

# 传入service_name及image tag

def create_deploy_yaml(service_name, tag):

# 首先修改所有的${jarName}

deploy_data['metadata']['name'] = service_name

deploy_data['metadata']['labels']['name'] = service_name

deploy_data['spec']['selector']['matchLabels']['name'] = service_name

deploy_data['spec']['template']['metadata']['labels']['name'] = service_name

# 由于.spec.template.spec.containers的特殊性,我们采用直接修改的方式

# 首先拼接image字段

image = "reg.test.local/library/" + service_name + ":" + tag

# 创建new_containers字典列表

new_containers = [{'name': service_name, 'image': image}]

deploy_data['spec']['template']['spec']['containers'] = new_containers

3、完整脚本

#!/usr/bin/python

# encoding: utf-8

"""

The Script for Auto Create Deployment Yaml.

File: auto_create_deploy_yaml

User: miaocunfa

Create Date: 2020-06-10

Create Time: 17:06

"""

import os

from ruamel.yaml import YAML

yaml = YAML()

def create_service_yaml(service_name, ports):

service_mould_file = "mould/info-service-mould.yaml"

isServiceMould = os.path.isfile(service_mould_file)

if isServiceMould:

# read Service-mould yaml convert json

with open(service_mould_file, encoding='utf-8') as yaml_obj:

service_data = yaml.load(yaml_obj)

# Update jarName

service_data['metadata']['name'] = service_name

service_data['metadata']['labels']['name'] = service_name

service_data['spec']['selector']['name'] = service_name

# Update port

new_spec_ports = []

for port in ports:

port = int(port)

portname = 'port' + str(port)

new_port = {'name': portname, 'port': port, 'targetPort': port}

new_spec_ports.append(new_port)

service_data['spec']['ports'] = new_spec_ports

# json To service yaml

save_file = tag + '/' + service_name + '_svc.yaml'

with open(save_file, mode='w', encoding='utf-8') as yaml_obj:

yaml.dump(service_data, yaml_obj)

print(save_file + ": Success!")

else:

print("Service Mould File is Not Exist!")

def create_deploy_yaml(service_name, tag):

deploy_mould_file = "mould/info-deploy-mould.yaml"

isDeployMould = os.path.isfile(deploy_mould_file)

if isDeployMould:

with open(deploy_mould_file, encoding='utf-8') as yaml_obj:

deploy_data = yaml.load(yaml_obj)

# Update jarName

deploy_data['metadata']['name'] = service_name

deploy_data['metadata']['labels']['name'] = service_name

deploy_data['spec']['selector']['matchLabels']['name'] = service_name

deploy_data['spec']['template']['metadata']['labels']['name'] = service_name

# Update containers

image = "reg.test.local/library/" + service_name + ":" + tag

new_containers = [{'name': service_name, 'image': image}]

deploy_data['spec']['template']['spec']['containers'] = new_containers

# json To service yaml

save_file = tag + '/' + service_name + '_deploy.yaml'

with open(save_file, mode='w', encoding='utf-8') as yaml_obj:

yaml.dump(deploy_data, yaml_obj)

print(save_file + ": Success!")

else:

print("Deploy Mould File is Not Exist!")

services = {

'info-gateway': ['9999'],

'info-admin': ['7777'],

'info-config': ['8888'],

'info-message-service': ['8555', '9666'],

'info-auth-service': ['8666'],

'info-scheduler-service': ['8777'],

'info-uc-service': ['8800'],

'info-ad-service': ['8801'],

'info-community-service': ['8802'],

'info-groupon-service': ['8803'],

'info-hotel-service': ['8804'],

'info-nearby-service': ['8805'],

'info-news-service': ['8806'],

'info-store-service': ['8807'],

'info-payment-service': ['8808'],

'info-agent-service': ['8809'],

'info-consumer-service': ['8090'],

}

prompt = "\n请输入要生成的tag: "

answer = input(prompt)

print("")

if os.path.isdir(answer):

raise SystemExit(answer + ': is Already exists!')

else:

tag = answer

os.makedirs(tag)

for service_name, service_ports in services.items():

create_service_yaml(service_name, service_ports)

create_deploy_yaml(service_name, tag)

4、执行效果

➜ python3 Auto_Create_K8S_YAML.py

请输入要生成的tag: 0.0.1

0.0.1/info-gateway_svc.yaml: Success!

0.0.1/info-gateway_deploy.yaml: Success!

0.0.1/info-admin_svc.yaml: Success!

0.0.1/info-admin_deploy.yaml: Success!

0.0.1/info-config_svc.yaml: Success!

0.0.1/info-config_deploy.yaml: Success!

0.0.1/info-message-service_svc.yaml: Success!

0.0.1/info-message-service_deploy.yaml: Success!

0.0.1/info-auth-service_svc.yaml: Success!

0.0.1/info-auth-service_deploy.yaml: Success!

0.0.1/info-scheduler-service_svc.yaml: Success!

0.0.1/info-scheduler-service_deploy.yaml: Success!

0.0.1/info-uc-service_svc.yaml: Success!

0.0.1/info-uc-service_deploy.yaml: Success!

0.0.1/info-ad-service_svc.yaml: Success!

0.0.1/info-ad-service_deploy.yaml: Success!

0.0.1/info-community-service_svc.yaml: Success!

0.0.1/info-community-service_deploy.yaml: Success!

0.0.1/info-groupon-service_svc.yaml: Success!

0.0.1/info-groupon-service_deploy.yaml: Success!

0.0.1/info-hotel-service_svc.yaml: Success!

0.0.1/info-hotel-service_deploy.yaml: Success!

0.0.1/info-nearby-service_svc.yaml: Success!

0.0.1/info-nearby-service_deploy.yaml: Success!

0.0.1/info-news-service_svc.yaml: Success!

0.0.1/info-news-service_deploy.yaml: Success!

0.0.1/info-store-service_svc.yaml: Success!

0.0.1/info-store-service_deploy.yaml: Success!

0.0.1/info-payment-service_svc.yaml: Success!

0.0.1/info-payment-service_deploy.yaml: Success!

0.0.1/info-agent-service_svc.yaml: Success!

0.0.1/info-agent-service_deploy.yaml: Success!

0.0.1/info-consumer-service_svc.yaml: Success!

0.0.1/info-consumer-service_deploy.yaml: Success!

➜ ll

total 12

drwxr-xr-x. 2 root root 4096 Jun 29 18:24 0.0.1

# 生成的 service yaml

➜ cat info-message-service_svc.yaml

apiVersion: v1

kind: Service

metadata:

name: info-message-service

labels:

name: info-message-service

version: v1

spec:

ports:

- name: port8555

port: 8555

targetPort: 8555

- name: port9666

port: 9666

targetPort: 9666

selector:

name: info-message-service

# 生成的 deployment yaml

➜ cat info-message-service_deploy.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: info-message-service

labels:

name: info-message-service

spec:

selector:

matchLabels:

name: info-message-service

replicas: 2

template:

metadata:

labels:

name: info-message-service

spec:

containers:

- name: info-message-service

image: reg.test.local/library/info-message-service:0.0.1

imagePullSecrets:

- name: registry-secret

python生成yaml_使用python脚本自动生成K8S-YAML相关推荐

  1. python生成yaml_使用python脚本自动生成K8S-YAML的方法示例

    1.生成 servie.yaml 1.1.yaml转json service模板yaml apiVersion: v1 kind: Service metadata: name: ${jarName} ...

  2. NSG2-一个很好用的ns2的tcl脚本自动生成软件

    NSG2-一个很好用的ns2的tcl脚本自动生成软件 来源:Linux社区 作者:fzxy002763 NSG2-一个很好用的ns2的tcl脚本自动生成软件,NSG2.rar,一个很好的java写的t ...

  3. Polyworks脚本开发学习笔记(二二)-调取视角用脚本自动生成报告

    Polyworks脚本开发学习笔记(二二)-调取视角用脚本自动生成报告 Polyworks中,3D场景的视图可用标准视角及等轴侧视角.项目视角等方式调用,也可以用txt格式保存下来调用,如果以脚本的形 ...

  4. Orcad下使用TCL脚本自动生成导线、网络标号和off page

    Orcad是一个很优秀的原理图工具,但是手工画批量导线和网络标号的时候(比如:RGB的信号线,DDR/FLASH的地址线),比较麻烦,修改也麻烦.所以这里介绍了使用TCL脚本自动生成导线.网络标号和o ...

  5. matlab之用m脚本自动生成exe文件

    matlab之用m脚本自动生成exe文件 文章目录 matlab之用m脚本自动生成exe文件 0.前言 1.生成exe文件分两种情况 2.生成文件在自己电脑上运行 3.生成文件在其他电脑上运行 0.前 ...

  6. python生成api文档_Django 自动生成api接口文档教程

    最近在写测试平台,需要实现一个节点服务器的api,正好在用django,准备使用djangorestframework插件实现. 需求 实现一个接口,在调用时,通过传递的参数,直接运行对应项目的自动化 ...

  7. 这个插件竟打通了Python和Excel,还能自动生成代码!

    作者 | 云朵君 来源丨数据STUDIO 加载一个Jupyter插件后,无需写代码就能做数据分析,还帮你生成相应代码? 没错,只需要加载这个名为Mito的小工具包,用Python做数据分析,变得和用E ...

  8. 【Python】这个插件竟打通了Python和Excel,还能自动生成代码!

    加载一个Jupyter插件后,无需写代码就能做数据分析,还帮你生成相应代码? 没错,只需要加载这个名为Mito的小工具包,用Python做数据分析,变得和用Excel一样简单: 介绍 以 Excel ...

  9. 竟可打通了Python和Excel,还能自动生成代码,这个插件绝了

    加载一个Jupyter插件后,无需写代码就能做数据分析,还帮你生成相应代码? 没错,只需要加载这个名为Mito的小工具包,用Python做数据分析,变得和用Excel一样简单: 资料专栏 绝了,这6个 ...

最新文章

  1. 针对web服务器容灾自动切换方案
  2. wxPython的API下载
  3. HQL中出现XXX is not mapped的错误
  4. 【专题介绍】用户网络模型与QoE
  5. 归并排序比较次数_归并排序「从入门到放弃」
  6. 删除oracle表里的重复记录
  7. python数据字典排序_Python自动处理数据字典(Python是3.6版本)
  8. C语言用什么 IDE 好 - 除了 Visual Studio、VSCode、CLion 还有什么其他选择?
  9. 洞态IAST检测RuoYi的sql注入漏洞
  10. Photoshop CS6 破解安装
  11. 前端过滤特殊字符、表情包
  12. opencore amr android,苹果手机amr文件用什么打开,opencore框架进行语音
  13. 在250美元5天城市
  14. 红米note3照相数据丢失
  15. Graphite简介
  16. 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/ch
  17. 星历表ASC2EPH修改且汉化
  18. matlab循环调用变量,关于循环变量的调用问题
  19. Nvidia回应Linux之父的指责 坚持不做任何让步
  20. Mysql主备恢复处理思路

热门文章

  1. 最强战队出炉,2020腾讯广告算法大赛圆满落幕
  2. html怎么加漂浮物,全面开展水面漂浮物清理专项行动
  3. java登陆拦截器_SpringBoot拦截器实现登录拦截
  4. 新手如何创建Facebook广告账户?
  5. 模块化解耦框架RxFluxArchitecture3-订阅管理绑定生命周期
  6. 【Java基本功】一文读懂final关键字的用法
  7. 传统IT正在被颠覆,下一个风口会是互联网+吗?
  8. 37. 反转一个3位整数 Java
  9. 第十七:如何搭建Pytest+Allure2环境(重点非常详细)
  10. android gradle1,android studio gradle使用-(1)