kubernetes管理之使用yq工具截取属性

系列目录html

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

yq命令不但能够处理kubernetes的配置文件,还能够处理其它任意类型的yaml文件,不但能够查询,还能够修改yaml里的内容,这对于咱们想要动态更改yaml里的内容很是有帮助的git

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

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

[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格式.json

假如咱们有如下yaml文件,名称为test.yamlubuntu

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

假如咱们想要取键为json的数组的值,则能够经过如下命令:centos

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

相关文章
相关标签/搜索