在实现的需求如下:

同事提供了一个文本文件,内含200多个host与ip的对应关系,希望能在k8s生成pod时,将这些对应关系注入到/etc/hosts中。

网上看文档,这可以通过扩充pod中的hostAliases来实现。

实现的思路如下:

一,hosts文件内容示例

  1. 192.168.0.24 bi-server-3391
  2. 192.168.0.25 bi-server-3392
  3. 192.168.0.26 bi-server-3393
  4. 192.168.0.27 bi-server-3394
  5. 192.168.0.28 bi-server-3395
  6. 192.168.0.29 bi-server-3396
  7. 192.168.0.30 bi-server-3397
  8. 192.168.0.31 bi-server-3398
  9. 192.168.0.32 bi-server-3399
  10. 192.168.0.33 bi-server-3400
  11. 192.168.0.34 bi-server-3401
  12. 192.168.0.35 bi-server-3402
  13. 192.168.0.36 bi-server-3403
  14. 192.168.0.37 bi-server-3404
  15. 192.168.0.38 bi-server-3405
  16. 192.168.0.39 bi-server-3406
  17. 192.168.0.40 bi-server-3407

二,org_dep.yaml文件内容

  1. ---
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: xxx-ai-jupyter-v2
  6. spec:
  7. replicas: 1
  8. selector:
  9. matchLabels:
  10. name: xxx-ai-jupyter-v2
  11. template:
  12. metadata:
  13. labels:
  14. name: xxx-ai-jupyter-v2
  15. spec:
  16. imagePullSecrets:
  17. - name: xxx
  18. nodeSelector:
  19. accelerator: nvidia-tesla-k80
  20. containers:
  21. - name: xxx-ai-jupyter-v2
  22. image: harbor.xxx.com.cn/3rd_part/tensorflow:xxx
  23. imagePullPolicy: IfNotPresent
  24. 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='*'"]
  25. resources:
  26. limits:
  27. nvidia.com/gpu: 4
  28. volumeMounts:
  29. - mountPath: /tf
  30. name: jupyter-data
  31. volumes:
  32. - name: jupyter-data
  33. hostPath:
  34. # directory location on host
  35. path: /docker/jupyter_data
  36. hostAliases:
  37. - ip: "127.0.0.1"
  38. hostnames:
  39. - "bar.local"
  40. - ip: "10.1.2.3"
  41. hostnames:
  42. - "bar.remote"

三,解析yaml并新增hostsAliases段的python脚本

  1. # coding:utf-8
  2.  
  3. from ruamel import yaml as ruamel_yaml
  4. import yaml
  5.  
  6. import os
  7.  
  8. cur_path = os.path.dirname(os.path.realpath(__file__))
  9. org_dep_yaml = os.path.join(cur_path, "org_dep.yaml")
  10. hosts_file = os.path.join(cur_path, "hosts")
  11.  
  12. f1 = open(org_dep_yaml)
  13. d1 = yaml.load(f1)
  14.  
  15. yaml_host = d1['spec']['template']['spec']['hostAliases']
  16. with open("hosts", 'r') as f:
  17. for i in f:
  18. if len(i.strip()) > 0:
  19. temp_list = i.split()
  20. temp_dict = dict()
  21. temp_dict['ip'] = temp_list[0]
  22. temp_dict['hostnames'] = [temp_list[1]]
  23. yaml_host.append(temp_dict)
  24.  
  25. d1['spec']['template']['spec']['hostAliases'] = yaml_host
  26.  
  27. # 如果用原生的yaml功能,yaml文件一些列表项会有引号,所以要用ruamel的yaml库。
  28. # with open("dst_dep.yaml", "w", encoding="utf-8") as f:
  29. # yaml.dump(d1, f)
  30.  
  31. # 写入到yaml文件
  32. with open("dst_dep.yaml", "w", encoding="utf-8") as f:
  33. ruamel_yaml.dump(d1, f, Dumper=ruamel_yaml.RoundTripDumper)

四,最后扩展后的Yaml.

  1. ---
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: xxx-ai-jupyter-v2
  6. spec:
  7. replicas: 1
  8. selector:
  9. matchLabels:
  10. name: xxx-ai-jupyter-v2
  11. template:
  12. metadata:
  13. labels:
  14. name: xxx-ai-jupyter-v2
  15. spec:
  16. imagePullSecrets:
  17. - name: xxx
  18. nodeSelector:
  19. accelerator: nvidia-tesla-k80
  20. containers:
  21. - name: xxx-ai-jupyter-v2
  22. image: harbor.xxx.com.cn/3rd_part/tensorflow:xxx
  23. imagePullPolicy: IfNotPresent
  24. 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='*'"]
  25. resources:
  26. limits:
  27. nvidia.com/gpu: 4
  28. volumeMounts:
  29. - mountPath: /tf
  30. name: jupyter-data
  31. volumes:
  32. - name: jupyter-data
  33. hostPath:
  34. # directory location on host
  35. path: /docker/jupyter_data
  36. hostAliases:
  37. - ip: 127.0.0.1
  38. hostnames:
  39. - bar.local
  40. - ip: 10.1.2.3
  41. hostnames:
  42. - bar.remote
  43. - ip: 192.16.0.24
  44. hostnames:
  45. - bi-server-33391
  46. - ip: 192.16.0.25
  47. hostnames:
  48. - bi-server-33392
  49. - ip: 192.16.0.26
  50. hostnames:
  51. - bi-server-33393
  52. ......

五。END.最后,将这些yaml合进其它yaml文件即可,这时,脚本就需要进一步加功能了。

使用ruamel.yaml库,解析yaml文件的更多相关文章

  1. ACEXML解析XML文件——简单示例程序

    掌握了ACMXML库解析XML文件的方法后,下面来实现一个比较完整的程序. 定义基本结构 xml文件格式如下 <?xml version="1.0"?> <roo ...

  2. c++ 解析yaml文件

    一直用c++操作ini做配置文件,想换成yaml,在全球最大的同性交友网站github上搜索,看有没有开源的库,功夫不负有心人,找到了yaml-cpp,用他解析了一个yaml的例子非常好使,分享一下如 ...

  3. python基础——python解析yaml类型文件

    一.yaml介绍 yaml全称Yet Another Markup Language(另一种标记语言).采用yaml作为配置文件,文件看起来直观.简洁.方便理解.yaml文件可以解析字典.列表和一些基 ...

  4. Java使用snakeyaml解析yaml

    YAML Yaml是一种"是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言."类似于XML但比XML更简洁,语法详见 http://www.ruan ...

  5. ACEXML解析XML文件——我是如何学习并在短时间内掌握一个库的使用方法的

    最近做的C++项目中需要使用xml文件保存一些信息,程序启动时会读取这些信息.最终经过主程的评测,决定使用ACEXML库来读取解析XML文件. 好吧,至于为什么选择ACEXML库,我就不说了.既然选择 ...

  6. Ajax实现xml文件数据插入数据库(一)--- 构建解析xml文件的js库

    Ajax实现将xml文件数据插入数据库的过程所涉及到的内容比较多,所以对于该过程的讲解本人打算根据交互的过程将其分为三个部分,第一部分为构建解析xml文件的javascript库,第二部分为ajax与 ...

  7. Java解析YAML和Android解析YAML

    一.Java解析YAML 1. API的选择 一般分两种:Jyaml和snakeYAML.(Jyaml下载地址:http://download.csdn.net/detail/dgssfgfs/847 ...

  8. 解析prototxt文件的python库 prototxt-parser(使用parsy自定义文件格式解析)

    解析prototxt文件的python库 prototxt-parser https://github.com/yogin16/prototxt_parser https://test.pypi.or ...

  9. swagger.yaml转换为swagger.json文件

    方法一 swagger-editor页面 官方的 swagger-editor Live Demo (在线直接使用,就是访问的有点慢)或者将swagger-editor Download 下载到本地然 ...

随机推荐

  1. 10.Java基础_IDEA的使用

    IDEA下项目结构: 项目->模块->包->java文件 流程图 1.创建一个空项目(JavaSE_Code) 选择Empty Project 输入项目名和路径 2.创建一个新模块 ...

  2. Html学习之四(页面布局)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. 深入了解Python

    一.Python的风格 Python在设计上坚持了清晰划一的风格,这使得Python成为一门易读.易维护,并且被大量用户所欢迎的.用途广泛的语言. 设计者开发时总的指导思想是,对于一个特定的问题,只要 ...

  4. C# git忽略文件 (.gitignore )

    # Visual Studio # User-specific files *.suo *.user *.userosscache *.sln.docstates # User-specific fi ...

  5. C实现string字符串

    在C中实现string字符串,使用typedef将string定义为char *. #include <stdio.h> #include <stdlib.h> #includ ...

  6. Vue indent eslint缩进webstorm冲突解决

    参考教程 官方回复 ESlint设置 rules: { 'no-multiple-empty-lines': [1, {max: 3}], // 控制允许的最多的空行数量 'vue/script-in ...

  7. 【2019.8.12 慈溪模拟赛 T1】钥匙(key)(暴力DP)

    暴力\(DP\) 这题做法很多,有\(O(n^2)\)的,有\(O(n^2logn)\)的,还有徐教练的\(O(nlogn)\)的,甚至还有\(bzt\)的二分+线段树优化建图的费用流. 我懒了点,反 ...

  8. (三十四)golang--接口

    golang的多态特性主要体现在接口上: 主要优势:高内聚低耦合: package main import ( "fmt" ) type usb interface { start ...

  9. 大话设计模式Python实现-备忘录模式

    备忘录模式(Memento Pattern):不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,这样已经后就可将该对象恢复到原先保存的状态 下面是一个备忘录模式的demo: #! ...

  10. 2019.11.21 做OJ题的反思

    1.利用二分法查找数组元素(适用于有序数组) #include<stdio.h> int BinarySearch(int a[],int n,int key); ]; int main( ...