zoukankan      html  css  js  c++  java
  • kubernetes管理之使用yq工具截取属性

    系列目录

    前面我们讲解过使用go-template或者jsonpath格式(kubectl get 资源 --output go-tempalte(或jsonpath))来截取属性的值,并且我们比较了使用它们较使用grep,awk等字符串截取在准确获取属性值方面的优势.然而更多时候我们是查看属性,使用grep仅能定位到关键字所在行(或者前后若干行),并不能准确获取一个对象的完整属性.而使用go-template或者jsonpath来截取只能截取普通对象,如果是数组类型就会展示为map[xxx],可读性不是很强,并且内容很长的时候格式杂乱一团(即便使用linux上的tr命令进行整理,整理后的格式也不能保持原有的样式).这里推荐一款linux上的yaml命令行处理工具yq下载地址

    yq命令不但可以处理kubernetes的配置文件,还可以处理其它任意类型的yaml文件,不但可以查询,还可以修改yaml里的内容,这对于我们想要动态更改yaml里的内容非常有帮助的

    页面里介绍了在新旧ubuntu系统里如何通过snap和apt-get安装,以及在macos系统上如何通过brew来安装.对于centos系统,进入上面页面切换到release里面,下载完成后放到/usr/bin/yq目录下就可以运行了.

    下载安装完成以后在终端输入命令yq,就会出现帮助信息

    [centos@k8s-master ~]$ yq
    Usage:
      yq [flags]
      yq [command]
    
    Available Commands:
      delete      yq d [--inplace/-i] [--doc/-d index] sample.yaml a.b.c
      help        Help about any command
      merge       yq m [--inplace/-i] [--doc/-d index] [--overwrite/-x] [--append/-a] sample.yaml sample2.yaml
      new         yq n [--script/-s script_file] a.b.c newValue
      prefix      yq p [--inplace/-i] [--doc/-d index] sample.yaml a.b.c
      read        yq r [--doc/-d index] sample.yaml a.b.c
      write       yq w [--inplace/-i] [--script/-s script_file] [--doc/-d index] sample.yaml a.b.c newValue
    
    Flags:
      -h, --help      help for yq
      -t, --trim      trim yaml output (default true)
      -v, --verbose   verbose mode
      -V, --version   Print version information and quit
    
    Use "yq [command] --help" for more information about a command.
    

    yq基本语法

    读取基本语法命令格式如下

    yq r <yaml_file|json_file> <path>
    

    r是read的首字母,写入和删除格式也类似,只是r替换为w(write)或d(delete).从命令的信息中可以看到,yq不但可以处理yaml文件,还可以处理json文件.因此如果用于解析kubernetes配置文件,不论output格式是yaml或者json都可以通过它处理,但是需要注意的是,处理后展示的结果是yaml格式.

    假如我们有以下yaml文件,名称为test.yaml

    json:
    - rigid
    - better for data interchange
    yaml:
    - slim and flexible
    - better for configuration
    object:
      key: value
      array:
      - name: null
      - name: true
      - name: 24
    

    假如我们想要取键为json的数组的值,则可以通过以下命令:

    tylerzhou@DESKTOP-OE0CB8G:/mnt/d/test/jqjqtest$ yq r test.yml json
    - rigid
    - better for data interchange
    

    类似地,我们可以通过yq r test.yml object.array得到更深一层的对象

    tylerzhou@DESKTOP-OE0CB8G:/mnt/d/test/jqjqtest$ yq r test.yml object.array
    - name: null
    - name: true
    - name: 24
    

    但是我们如何拿到这些得到的键值对里面的值呢,因为它是一个数组,所以这里需要特殊处理,其实和编程语言处理方法类似,也是使用中括号索引的方式来处理

    tylerzhou@DESKTOP-OE0CB8G:/mnt/d/test/jqjqtest$ yq r test.yml object.array[*].name
    - null
    - true
    - 24
    

    以上星(*)表示所有,就可以把所有数组里的值都取出来,不像在go-template或者jsonpath里需要使用更为复杂的range函数

    如果我们想要取的是第一个,则使用索引0即可

    tylerzhou@DESKTOP-OE0CB8G:/mnt/d/test/jqjqtest$ yq r test.yml object.array[0].name
    null
    

    接收标准输入

    在查看kubernetes配置文件时,大多数时候我们仅仅是查看,并不会把它永久保存在磁盘上,因此以上方法不太适用.yq还支持使用管道从标准输入里接收yaml.我们看以下示例:

    [centos@k8s-master ~]$ kubectl get po consul-0 -ojson|yq r - status.podIP
    10.244.2.27
    

    这里把获使用kubectl get获取的信息输出为json格式(前面说过,yq支持json作为输入的),管理后面的命令基本和前面讲的一样,只是r后面不再跟具体文件名,而是一个横框(-).有了管道输入,我们就可以处理kubernetes输入的配置信息了.

  • 相关阅读:
    真理
    使用C#调用QC的接口
    如何让asp.net应用程序定时自动执行代码
    对话
    科学●哲学●艺术●恶搞
    避免asp.net程序session过期的一个另类方法
    醉翁之意不在酒
    测试团队的新兴职位:测试设计师
    1和0的世界
    名词解释:高阻态,上拉电阻
  • 原文地址:https://www.cnblogs.com/tylerzhou/p/11050954.html
Copyright © 2011-2022 走看看