使用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 下载到本地然 ...
随机推荐
- Html学习之五(嵌套之简单购物界面设计)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- CodeForces 984C Finite or not?
http://codeforces.com/problemset/problem/984/C Time limit 1000 msMemory limit 262144 kB 题目 You ...
- Feign的介绍与使用(五)
一.Feign的介绍 Feign是一个声明式 WebService 客户端,使用Feign能够让编写Web Service 客户端更加简单,它的使用方法是定义一个接口,然后在上面添加注解,同时也支持J ...
- CentOS7 安装 anaconda
Anaconda是一个开源的Python发行版本,可以帮助我们更方便地配置Python环境. 如果只需要某些包,或者需要节省带宽或存储空间,也可以使用Miniconda这个较小的发行版 0. 开始前 ...
- linux常用终端命令
01. 终端命令格式 command [-options] [parameter] 说明: command:命令名,相应功能的英文单词或单词的缩写 [-options]:选项,可用来对命令进行控制,也 ...
- backbone 路由传参(可选)
因为维护公司的老项目而接触到backbone.以前是只闻其名,未见其码. 因为其他项目需要跳转到本项目的某个页面,但是需要UI改变. 考虑的方法是给路由添加一个可选参数.代码如下: 正常路由: rou ...
- [Codeforces1250E] The Coronation
[Codeforces1250E] The Coronation The Coronation 又是一道并查集...最近做的并查集咋这么多... 思路 首先,维护元素间关系的题想到并查集. 因为这里涉 ...
- nginx nginx_upstream_check_module自动踢除后端机器
nginx 1.14.0 描述: nginx自带的upstream配置,如果后端挂了,接口会慢,原因不讲述,故接入第三方的自动检测与自动踢除模式 nginx_upstream_check_module ...
- 【shell脚本】批量修改扩展名===modifyExtension.sh
前提:需切换到需要批量修改扩展名的目录下,运行脚本 [root@VM_0_10_centos shellScript]# cat modifyExtension.sh #!/bin/bash # 编写 ...
- jQuery 源码分析(四) each函数 $.each和$.fn.each方法 详解
$.each一般用来遍历一个数组或对象,$.fn.each()就是指jQuery实例可以执行的操作(因为$.fn是jQuery对象的原型) $.each用来遍历一个数组或对象,并依次执行回掉函数,最后 ...