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输入的配置信息了.

  • 相关阅读:
    (网页)中的简单的遮罩层
    (后端)shiro:Wildcard string cannot be null or empty. Make sure permission strings are properly formatted.
    (网页)jQuery的时间datetime控件在AngularJs中使用实例
    Maven Myeclipse 搭建项目
    MyBatis 环境搭建 (一)
    java 常用方法
    XML 基础
    JS BOM
    js 事件
    js 的使用原则
  • 原文地址:https://www.cnblogs.com/tylerzhou/p/11050954.html
Copyright © 2011-2022 走看看