系列目錄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 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輸入的配置信息了.