使用ruamel.yaml库,解析yaml文件
在实现的需求如下:
同事提供了一个文本文件,内含200多个host与ip的对应关系,希望能在k8s生成pod时,将这些对应关系注入到/etc/hosts中。
网上看文档,这可以通过扩充pod中的hostAliases来实现。
实现的思路如下:
一,hosts文件内容示例
192.168.0.24 bi-server-3391 192.168.0.25 bi-server-3392 192.168.0.26 bi-server-3393 192.168.0.27 bi-server-3394 192.168.0.28 bi-server-3395 192.168.0.29 bi-server-3396 192.168.0.30 bi-server-3397 192.168.0.31 bi-server-3398 192.168.0.32 bi-server-3399 192.168.0.33 bi-server-3400 192.168.0.34 bi-server-3401 192.168.0.35 bi-server-3402 192.168.0.36 bi-server-3403 192.168.0.37 bi-server-3404 192.168.0.38 bi-server-3405 192.168.0.39 bi-server-3406 192.168.0.40 bi-server-3407
二,org_dep.yaml文件内容
--- apiVersion: apps/v1 kind: Deployment metadata: name: xxx-ai-jupyter-v2 spec: replicas: 1 selector: matchLabels: name: xxx-ai-jupyter-v2 template: metadata: labels: name: xxx-ai-jupyter-v2 spec: imagePullSecrets: - name: xxx nodeSelector: accelerator: nvidia-tesla-k80 containers: - name: xxx-ai-jupyter-v2 image: harbor.xxx.com.cn/3rd_part/tensorflow:xxx imagePullPolicy: IfNotPresent command: ["bash", "-c", "jupyter notebook --notebook-dir=/tf --ip 0.0.0.0 --no-browser --allow-root --NotebookApp.allow_remote_access=True --NotebookApp.disable_check_xsrf=True --NotebookApp.token='' --NotebookApp.password='' --NotebookApp.allow_origin='*' --NotebookApp.allow_origin='*'"] resources: limits: nvidia.com/gpu: 4 volumeMounts: - mountPath: /tf name: jupyter-data volumes: - name: jupyter-data hostPath: # directory location on host path: /docker/jupyter_data hostAliases: - ip: "127.0.0.1" hostnames: - "bar.local" - ip: "10.1.2.3" hostnames: - "bar.remote"
三,解析yaml并新增hostsAliases段的python脚本
# coding:utf-8 from ruamel import yaml as ruamel_yaml import yaml import os cur_path = os.path.dirname(os.path.realpath(__file__)) org_dep_yaml = os.path.join(cur_path, "org_dep.yaml") hosts_file = os.path.join(cur_path, "hosts") f1 = open(org_dep_yaml) d1 = yaml.load(f1) yaml_host = d1['spec']['template']['spec']['hostAliases'] with open("hosts", 'r') as f: for i in f: if len(i.strip()) > 0: temp_list = i.split() temp_dict = dict() temp_dict['ip'] = temp_list[0] temp_dict['hostnames'] = [temp_list[1]] yaml_host.append(temp_dict) d1['spec']['template']['spec']['hostAliases'] = yaml_host # 如果用原生的yaml功能,yaml文件一些列表项会有引号,所以要用ruamel的yaml库。 # with open("dst_dep.yaml", "w", encoding="utf-8") as f: # yaml.dump(d1, f) # 写入到yaml文件 with open("dst_dep.yaml", "w", encoding="utf-8") as f: ruamel_yaml.dump(d1, f, Dumper=ruamel_yaml.RoundTripDumper)
四,最后扩展后的Yaml.
--- apiVersion: apps/v1 kind: Deployment metadata: name: xxx-ai-jupyter-v2 spec: replicas: 1 selector: matchLabels: name: xxx-ai-jupyter-v2 template: metadata: labels: name: xxx-ai-jupyter-v2 spec: imagePullSecrets: - name: xxx nodeSelector: accelerator: nvidia-tesla-k80 containers: - name: xxx-ai-jupyter-v2 image: harbor.xxx.com.cn/3rd_part/tensorflow:xxx imagePullPolicy: IfNotPresent command: ["bash", "-c", "jupyter notebook --notebook-dir=/tf --ip 0.0.0.0 --no-browser --allow-root --NotebookApp.allow_remote_access=True --NotebookApp.disable_check_xsrf=True --NotebookApp.token='' --NotebookApp.password='' --NotebookApp.allow_origin='*' --NotebookApp.allow_origin='*'"] resources: limits: nvidia.com/gpu: 4 volumeMounts: - mountPath: /tf name: jupyter-data volumes: - name: jupyter-data hostPath: # directory location on host path: /docker/jupyter_data hostAliases: - ip: 127.0.0.1 hostnames: - bar.local - ip: 10.1.2.3 hostnames: - bar.remote - ip: 192.16.0.24 hostnames: - bi-server-33391 - ip: 192.16.0.25 hostnames: - bi-server-33392 - ip: 192.16.0.26 hostnames: - bi-server-33393 ......
五。END.最后,将这些yaml合进其它yaml文件即可,这时,脚本就需要进一步加功能了。
使用ruamel.yaml库,解析yaml文件的更多相关文章
- ACEXML解析XML文件——简单示例程序
掌握了ACMXML库解析XML文件的方法后,下面来实现一个比较完整的程序. 定义基本结构 xml文件格式如下 <?xml version="1.0"?> <roo ...
- c++ 解析yaml文件
一直用c++操作ini做配置文件,想换成yaml,在全球最大的同性交友网站github上搜索,看有没有开源的库,功夫不负有心人,找到了yaml-cpp,用他解析了一个yaml的例子非常好使,分享一下如 ...
- python基础——python解析yaml类型文件
一.yaml介绍 yaml全称Yet Another Markup Language(另一种标记语言).采用yaml作为配置文件,文件看起来直观.简洁.方便理解.yaml文件可以解析字典.列表和一些基 ...
- Java使用snakeyaml解析yaml
YAML Yaml是一种"是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言."类似于XML但比XML更简洁,语法详见 http://www.ruan ...
- ACEXML解析XML文件——我是如何学习并在短时间内掌握一个库的使用方法的
最近做的C++项目中需要使用xml文件保存一些信息,程序启动时会读取这些信息.最终经过主程的评测,决定使用ACEXML库来读取解析XML文件. 好吧,至于为什么选择ACEXML库,我就不说了.既然选择 ...
- Ajax实现xml文件数据插入数据库(一)--- 构建解析xml文件的js库
Ajax实现将xml文件数据插入数据库的过程所涉及到的内容比较多,所以对于该过程的讲解本人打算根据交互的过程将其分为三个部分,第一部分为构建解析xml文件的javascript库,第二部分为ajax与 ...
- Java解析YAML和Android解析YAML
一.Java解析YAML 1. API的选择 一般分两种:Jyaml和snakeYAML.(Jyaml下载地址:http://download.csdn.net/detail/dgssfgfs/847 ...
- 解析prototxt文件的python库 prototxt-parser(使用parsy自定义文件格式解析)
解析prototxt文件的python库 prototxt-parser https://github.com/yogin16/prototxt_parser https://test.pypi.or ...
- swagger.yaml转换为swagger.json文件
方法一 swagger-editor页面 官方的 swagger-editor Live Demo (在线直接使用,就是访问的有点慢)或者将swagger-editor Download 下载到本地然 ...
随机推荐
- requests的请求机制
库结构: 工作机制: api.py get.post.put.delete等请求方式都在api文件中,另外,api文件中还有个request方法,使用任何一种请求方式都是调用request方法,只是传 ...
- JAVA字符串转换整数
public class compint { /** * @param args */ public static void main(String[] args) { // TODO Auto-ge ...
- tensorboard运行使用(排坑)记录一
首先运行如下代码(路径根据你自己的要求更改) writer = tf.summary.FileWriter("G:/tensorflow/graph", tf.get_defaul ...
- mysql里的insert
insert不跟where 比如 insert into table (name) value('******')where id =1 肯定不行的 insert 语句 是插入语句,不跟条件的. 如果 ...
- 设计模式-抽象工厂模式(AbstractFactory)(创建型模式)
//以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Product.h #pragma once class AbstractProductA { public: vir ...
- golang--单元测试综合实例
实例说明: (1)一个Monster结构体,字段Name,Age,Skill (2)Monster有一个Store方法,可以将一个Monster对象序列化后保存在文件中: (3)Monster有一个R ...
- Theano 报错:No suitable SharedVariable constructor could be found. Are you sure all kwargs are supported? We do not support the parameter dtype or type
当Theano报错:No suitable SharedVariable constructor could be found. Are you sure all kwargs are support ...
- 使用 PDBDownloader 解决 IDA 加载 ntoskrnl.exe 时符号不完全问题
解决 IDA 加载 ntoskrnl.exe 时符号不完全问题 1. 问题:IDA加载xp系统的 ntoskrnl.exe 加载不完全. 2. 尝试过但未成功的解决方案: 1)配置好的IDA的 pdb ...
- C# if else-if 语句
一.作用 用来处理多条件的区间性的判断. 二.语法 if(判断条件) { 要执行的代码; } else if(判断条件) { 要执行的代码; } else if(判断条件) { 要执行的代码; } e ...
- Devexpress treelist两张表父子节点设置、筛选、分页、排序、页面跳转demo
效果图 网上查了很多例子自己结合和修改了一下.最下方的分页跳转是dev的datapager控件.控件的属性事件自己研究一下. 代码如下 public partial class MMDefinitio ...