使用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列表
defcreate_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=[]
forportinports:
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及imagetag
defcreate_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
"""
TheScriptforAutoCreateDeploymentYaml.
File:auto_create_deploy_yaml
User:miaocunfa
CreateDate:2020-06-10
CreateTime:17:06
"""
importos
fromruamel.yamlimportYAML
yaml=YAML()
defcreate_service_yaml(service_name,ports):
service_mould_file="mould/info-service-mould.yaml"
isServiceMould=os.path.isfile(service_mould_file)
ifisServiceMould:
#readService-mouldyamlconvertjson
withopen(service_mould_file,encoding='utf-8')asyaml_obj:
service_data=yaml.load(yaml_obj)
#UpdatejarName
service_data['metadata']['name']=service_name
service_data['metadata']['labels']['name']=service_name
service_data['spec']['selector']['name']=service_name
#Updateport
new_spec_ports=[]
forportinports:
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
#jsonToserviceyaml
save_file=tag+'/'+service_name+'_svc.yaml'
withopen(save_file,mode='w',encoding='utf-8')asyaml_obj:
yaml.dump(service_data,yaml_obj)
print(save_file+":Success!")
else:
print("ServiceMouldFileisNotExist!")
defcreate_deploy_yaml(service_name,tag):
deploy_mould_file="mould/info-deploy-mould.yaml"
isDeployMould=os.path.isfile(deploy_mould_file)
ifisDeployMould:
withopen(deploy_mould_file,encoding='utf-8')asyaml_obj:
deploy_data=yaml.load(yaml_obj)
#UpdatejarName
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
#Updatecontainers
image="reg.test.local/library/"+service_name+":"+tag
new_containers=[{'name':service_name,'image':image}]
deploy_data['spec']['template']['spec']['containers']=new_containers
#jsonToserviceyaml
save_file=tag+'/'+service_name+'_deploy.yaml'
withopen(save_file,mode='w',encoding='utf-8')asyaml_obj:
yaml.dump(deploy_data,yaml_obj)
print(save_file+":Success!")
else:
print("DeployMouldFileisNotExist!")
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("")
ifos.path.isdir(answer):
raiseSystemExit(answer+':isAlreadyexists!')
else:
tag=answer
os.makedirs(tag)
forservice_name,service_portsinservices.items():
create_service_yaml(service_name,service_ports)
create_deploy_yaml(service_name,tag)
4、执行效果
➜python3Auto_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 total12 drwxr-xr-x.2rootroot4096Jun2918:240.0.1 #生成的serviceyaml ➜catinfo-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 #生成的deploymentyaml ➜catinfo-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脚本自动生成K8S-YAML的方法示例的文章就介绍到这了,更多相关python自动生成K8S-YAML内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!