在实现的需求如下:

同事提供了一个文本文件,内含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文件的更多相关文章

  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. ACM-ICPC 2018 南京网络赛

    题目顺序:A C E G I J L A. An Olympian Math Problem 打表,找规律,发现答案为n-1 C. GDY 题意: m张卡片,标号1-13: n个玩家,标号1-n:每个 ...

  2. 【oracle】DATE输出是什么东西

    SELECT TO_CHAR(SYSDATE) FROM DUAL;

  3. arduino (2) 浊度传感器

    z https://detail.tmall.com/item.htm?id=601391726801&spm=a1z09.2.0.0.60082e8dMiX0LM&_u=e1qf7b ...

  4. powersploit简介

    一.PowerSploit简介 PowerSploit是GitHub上面的一个安全项目,上面有很多powershell攻击脚本,它们主要被用来渗透中的信息侦察.权限提升.权限维持. Powershel ...

  5. background-size:100% 100% 和 background-size:cover的区别简述

    下面我通过给下图背景图添加background-size属性的不同属性值,更直观的显示出100%和cover的区别   下图是添加background-size:100% 100% 后的背景图效果,背 ...

  6. openssl编译安装

    最新版本可以在这个网站下载: https://www.openssl.org/source/ wget https://www.openssl.org/source/openssl-1.1.1c.ta ...

  7. Vue.js 源码分析(三十) 高级应用 函数式组件 详解

    函数式组件比较特殊,也非常的灵活,它可以根据传入该组件的内容动态的渲染成任意想要的节点,在一些比较复杂的高级组件里用到,比如Vue-router里的<router-view>组件就是一个函 ...

  8. 一个利用 Parallel.For 并行处理任务,带有进度条(ProgressBar)的 WinForm 实例(下)

    接着上一篇:一个利用 Parallel.For 并行处理任务,带有进度条(ProgressBar)的 WinForm 实例(上) 直接贴代码了: using System; using System. ...

  9. Window权限维持(三):服务

    如果未正确配置Windows环境中的服务或这些服务可以用作持久性方法,则这些服务可能导致权限提升.创建一个新的服务需要管理员级别的特权,它已经不是隐蔽的持久性技术.然而,在红队的行动中,针对那些在威胁 ...

  10. 原生PHP和MYSQL练习登陆验证和查询数据到表格

    直接上代码吧 <?php header("Content-type: text/html; charset=utf-8"); //数据量链接 $conn=mysqli_con ...