JSON und YAML sehen harmlos aus, bis du sie mit grep, cut und drei verzweifelten awk-Einzeilern bearbeiten willst. Dann wird aus DevOps schnell DevOops. Wir haben uns deshalb mal wieder jq und yq auf die Shell gelegt – zwei Werkzeuge, die strukturierte Daten nicht wie Text behandeln, sondern wie das, was sie sind: strukturierte Daten.
jq ist der Klassiker für JSON. Installation ist meistens unspektakulär:
apt install jq
brew install jqTestobjekt:
{
"services": [
{"name": "web", "port": 443, "enabled": true},
{"name": "db", "port": 5432, "enabled": false},
{"name": "api", "port": 8080, "enabled": true}
]
}Speichern wir als services.json. Der erste Reflex:
jq '.' services.jsonDas formatiert JSON lesbar. Schon nett. Aber wir wollen ja nicht nur hübsch anschauen, sondern Daten aus dem Gebüsch ziehen:
jq '.services[].name' services.jsonGibt alle Namen aus. Mit -r ohne Anführungszeichen, also pipeline-freundlich:
jq -r '.services[].name' services.jsonFiltern? Klar:
jq -r '.services[] | select(.enabled == true) | .name' services.jsonErgebnis:
web
apiDas ist der Moment, in dem grep leise den Raum verlässt.
Auch Transformationen sind angenehm. Aus JSON wird eine kleine TSV-Liste:
jq -r '.services[] | [.name, .port, .enabled] | @tsv' services.jsonPraktisch für Reports, Monitoring-Gefrickel oder schnelle Inventuren:
jq -r '.services[] | select(.port >= 1000) | "\(.name):\(.port)"' services.jsonJetzt YAML. Da kommt yq ins Spiel. Achtung: Es gibt mehrere yq-Varianten. Wir meinen hier die Go-Version von Mike Farah, die sich auf der Shell sehr angenehm benimmt:
apt install yq
brew install yqOder direkt von GitHub, falls deine Distribution noch im Museum wohnt.
Beispiel deployment.yaml:
app:
name: plutex-api
replicas: 3
image: registry.example.com/api:1.4.2
env:
- name: LOG_LEVEL
value: debug
- name: FEATURE_X
value: "true"Auslesen:
yq '.app.name' deployment.yamlReplikas ändern, direkt auf stdout:
yq '.app.replicas = 5' deployment.yamlOder in-place, mit Sicherheitsgurt im Kopf:
yq -i '.app.replicas = 5' deployment.yamlEnvironment-Variable filtern:
yq '.app.env[] | select(.name == "LOG_LEVEL") | .value' deployment.yamlSehr nützlich: YAML nach JSON kippen und mit jq weiterverarbeiten:
yq -o=json '.' deployment.yaml | jq -r '.app.image'Oder andersrum JSON nach YAML:
jq '.services[] | select(.enabled)' services.json | yq -PIn Pipelines spielen die beiden richtig ihre Stärken aus. Beispiel: Alle aktivierten Services nehmen und daraus curl-Checks bauen:
jq -r '.services[] | select(.enabled) | "https://localhost:\(.port)/health"' services.json \
| while read url; do
echo "Checke $url"
curl -fsS "$url" >/dev/null || echo "Aua: $url kaputt"
doneKleine Sysadmin-Regel: Wenn du strukturierte Daten hast, benutze strukturierte Werkzeuge. grep ist super für Logs. Für JSON und YAML ist es aber ungefähr so präzise wie ein Vorschlaghammer im Uhrmacherladen.
Unser Fazit nach dem Selbstversuch: jq und yq gehören auf jede Admin-Kiste, in jedes CI/CD-Image und in jeden Werkzeugkasten, der regelmäßig mit APIs, Kubernetes-Manifests, Configs oder Terraform-Outputs spricht. Weniger Regex-Voodoo, mehr reproduzierbare Pipelines. Genau so mögen wir das.