Как проанализировать вывод в формате JSON "kubectl get pods" с помощью jq и создать массив - PullRequest
0 голосов
/ 02 ноября 2018

Вывод JSON вернулся после выполнения этой команды

kubectl get pods -o json | jq '.items[].spec.containers[].env'

на моем кластере kuberntes это

[
  {
    "name": "USER_NAME",
    "value": "USER_NAME_VALUE_A"
  },
  {
    "name": "USER_ADDRESS",
    "value": "USER_ADDRESS_VALUE_A"
  }
]
[
  {
    "name": "USER_NAME",
    "value": "USER_NAME_VALUE_B"
  },
  {
    "name": "USER_ADDRESS",
    "value": "USER_ADDRESS_VALUE_B"
  }
]

Я хотел бы создать единый массив / словарь (используя скрипт Bash ), который выглядит как в примере ниже, и как я могу получить значение каждого ключа?

[
  {
    "USER_NAME": "USER_NAME_VALUE_A",
    "USER_ADDRESS": "USER_ADDRESS_VALUE_A"
  },
  {
    "USER_NAME": "USER_NAME_VALUE_B",
    "USER_ADDRESS": "USER_ADDRESS_VALUE_B"
  }
]

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Это будет сделано в bash. Вы будете удивлены, сколько вы можете сделать с bash:

#!/bin/bash

NAMES=`kubectl get pods -o=jsonpath='{range .items[*]}{.spec.containers[*].env[*].name}{"\n"}' | tr -d '\011\012\015'`
VALUES=`kubectl get pods -o=jsonpath='{range .items[*]}{.spec.containers[*].env[*].value}{"\n"}' | tr -d '\011\012\015'`

IFS=' ' read -ra NAMESA <<< "$NAMES"
IFS=' ' read -ra VALUESA <<< "$VALUES"

MAXINDEX=`expr ${#NAMESA[@]} - 1`

printf "[\n"
for i in "${!NAMESA[@]}"; do
  printf "  {\n"
  printf "  \"USER_NAME\": \"${NAMESA[$i]}\",\n"
  printf "  \"USER_ADDRESS\": \"${VALUESA[$i]}\"\n"
  if [ "$i" == "${MAXINDEX}" ]; then
    printf "  }\n"
  else
    printf "  },\n"
  fi
done
printf "]\n"
0 голосов
/ 02 ноября 2018

используйте jsonpath

C02W84XMHTD5:~ iahmad$ kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{.metadata.name}{"\n"}'
coredns-c4cffd6dc-nsd2k
etcd-minikube
kube-addon-manager-minikube
kube-apiserver-minikube
kube-controller-manager-minikube
kube-dns-86f4d74b45-d5njm
kube-proxy-pg89s
kube-scheduler-minikube
kubernetes-dashboard-6f4cfc5d87-b7n7v
storage-provisioner
tiller-deploy-778f674bf5-vt4mj

https://kubernetes.io/docs/reference/kubectl/jsonpath/

также может выводить значения ключей

C02W84XMHTD5:~ iahmad$ kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.startTime}{"\n"}{end}'
coredns-c4cffd6dc-nsd2k 2018-10-16T21:44:19Z
etcd-minikube   2018-10-29T17:30:56Z
kube-addon-manager-minikube 2018-10-29T17:30:56Z
kube-apiserver-minikube 2018-10-29T17:30:56Z
kube-controller-manager-minikube    2018-10-29T17:30:56Z
kube-dns-86f4d74b45-d5njm   2018-10-16T21:44:16Z
kube-proxy-pg89s    2018-10-29T17:32:05Z
kube-scheduler-minikube 2018-10-29T17:30:56Z
kubernetes-dashboard-6f4cfc5d87-b7n7v   2018-10-16T21:44:19Z
storage-provisioner 2018-10-16T21:44:19Z
tiller-deploy-778f674bf5-vt4mj  2018-11-01T13:45:23Z

тогда вы можете разделить их по пробелам и сформировать JSON или список

...