前面我們講解過使用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輸入的配置資訊了.