Edición de archivos de configuración YAML con yq
Lea y modifique directamente archivos YAML de Kubernetes y CI con yq, conservando la estructura y los comentarios.
Edición de archivos de configuración YAML con yq es una lección gratuita de DevOps Bootcamp en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de DevOps Bootcamp, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de DevOps Bootcamp incluye 4 lecciones en total.
¿Qué es yq y por qué usarlo con YAML?
yq es un procesador de YAML portátil para la línea de comandos, similar a cómo jq gestiona JSON. Permite leer, filtrar y editar archivos YAML sin escribir un script en Python o Ruby.
Hay dos herramientas populares llamadas yq:
- mikefarah/yq (Go) — se mantiene activamente y admite YAML, JSON, XML y TOML. Esta lección utiliza esta versión.
- kislyuk/yq (Python) — un envoltorio de
jqpara YAML; su sintaxis es diferente.
Instale la versión para Go:
brew install yqen macOSsnap install yqen Linux- O descargue el binario:
wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/local/bin/yq && chmod +x /usr/local/bin/yq
Verificación: yq --version debería mostrar v4.x.x. La versión 4 utiliza una sintaxis de expresiones diferente de la versión 3, por lo que la versión es importante.
# Install yq (Go version) on Linux
wget -q https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 \
-O /usr/local/bin/yq
chmod +x /usr/local/bin/yq
# Confirm version
yq --versionLeer valores de un YAML de Deployment de Kubernetes
Antes de editar nada, aprenda a leer campos YAML. Dado un Deployment de Kubernetes, puede extraer cualquier valor anidado mediante rutas con notación de puntos.
Ejemplo de deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
namespace: production
spec:
replicas: 3
template:
spec:
containers:
- name: app
image: my-app:1.0.0Comandos de lectura principales:
yq '.metadata.name' deployment.yaml— muestramy-appyq '.spec.replicas' deployment.yaml— muestra3yq '.spec.template.spec.containers[0].image' deployment.yaml— muestramy-app:1.0.0
De forma predeterminada, la salida es texto sin formato (sin comillas). Añada la opción -r o use | yq -r si necesita cadenas sin formato en scripts.
# Create a sample deployment YAML
cat > /tmp/deployment.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
namespace: production
spec:
replicas: 3
template:
spec:
containers:
- name: app
image: my-app:1.0.0
EOF
# Read individual fields
echo "App name: $(yq '.metadata.name' /tmp/deployment.yaml)"
echo "Replicas: $(yq '.spec.replicas' /tmp/deployment.yaml)"
echo "Image: $(yq '.spec.template.spec.containers[0].image' /tmp/deployment.yaml)"Edición en el propio archivo con la opción -i
La opción más importante para el uso en situaciones reales es -i (en el propio archivo). Sin ella, yq muestra los resultados en stdout y deja el archivo sin cambios.
Sintaxis:
- Solo lectura (stdout):
yq '.spec.replicas' file.yaml - Edición en el propio archivo:
yq -i '.spec.replicas = 5' file.yaml
El operador de asignación = establece un valor. La expresión es un filtro completo de yq, por lo que puede combinar la lectura y la escritura en un solo paso.
Importante: yq -i vuelve a escribir el archivo por completo. Generalmente, los comentarios colocados en la misma línea que un campo se conservan, pero los bloques de comentarios independientes pueden cambiar de posición. Confirme siempre sus archivos YAML en el control de versiones antes de ejecutar ediciones masivas en el propio archivo.
Pruebe primero sin -i y añádala cuando esté conforme con la salida.
# Start with the deployment from the previous scene
echo 'Before:' && yq '.spec.replicas' /tmp/deployment.yaml
# Edit in place: scale to 5 replicas
yq -i '.spec.replicas = 5' /tmp/deployment.yaml
echo 'After:' && yq '.spec.replicas' /tmp/deployment.yamlActualizar la etiqueta de imagen del contenedor
Una tarea muy habitual de CI consiste en actualizar la etiqueta de la imagen de Docker en un manifiesto de Kubernetes después de crear una imagen nueva. Con yq, esto se reduce a una sola línea.
El patrón es:
- Seleccione el contenedor por nombre mediante
select()para evitar codificar el índice 0 del array. - Use
|=(operador de actualización) o=para establecer el nuevo valor.
Usando el índice del array (frágil si cambia la lista de contenedores):
yq -i '.spec.template.spec.containers[0].image = "my-app:2.1.0"' deployment.yaml
Usando select() (robusto):
yq -i '(.spec.template.spec.containers[] | select(.name == "app")).image = "my-app:2.1.0"' deployment.yaml
En un pipeline de CI, pasaría la etiqueta como variable de shell:
NEW_TAG="my-app:2.1.0"
CONTAINER_NAME="app"
# Robust update: target by container name, not index
yq -i \
"(.spec.template.spec.containers[] | select(.name == \"${CONTAINER_NAME}\")).image = \"${NEW_TAG}\"" \
/tmp/deployment.yaml
# Verify
yq '.spec.template.spec.containers[0].image' /tmp/deployment.yamlAñadir y eliminar campos
Además de actualizar campos existentes, yq puede añadir claves nuevas o eliminar las existentes.
Añadir un campo:
- Asigne un valor a una ruta que no exista:
yq -i '.metadata.labels.version = "v2"' file.yaml - Si falta la clave principal (
labels), yq la crea automáticamente.
Eliminar un campo:
- Use la función
del():yq -i 'del(.metadata.annotations)' file.yaml - Elimine un elemento de un array mediante su índice:
yq -i 'del(.spec.template.spec.containers[1])' file.yaml
Añadir un elemento a un array:
yq -i '.spec.template.spec.containers += [{"name": "sidecar", "image": "envoy:latest"}]' file.yaml
# Add a label to the deployment
yq -i '.metadata.labels.version = "v2"' /tmp/deployment.yaml
yq -i '.metadata.labels.managed-by = "ci-pipeline"' /tmp/deployment.yaml
echo '--- Labels after adding ---'
yq '.metadata.labels' /tmp/deployment.yaml
# Delete one label
yq -i 'del(.metadata.labels.managed-by)' /tmp/deployment.yaml
echo '--- Labels after delete ---'
yq '.metadata.labels' /tmp/deployment.yamlTrabajar con archivos YAML de varios documentos
Los manifiestos de Kubernetes suelen agrupar varios recursos en un solo archivo, separados por ---. De forma predeterminada, yq procesa todos los documentos de ese archivo.
Técnicas principales:
- Enumere todos los tipos de documento:
yq '.[].kind' multi.yaml— observe el.[]inicial para iterar por los documentos. - Seleccione un documento concreto por su tipo:
yq 'select(.kind == "Service")' multi.yaml - Edite en el propio archivo solo los documentos que coincidan:
yq -i 'select(.kind == "Deployment").spec.replicas = 2' multi.yaml
Los documentos que no coinciden con el predicado de select() se transfieren sin cambios, por lo que Service, ConfigMap y los demás recursos permanecen intactos.
Para dividir un archivo de varios documentos en archivos individuales, puede recorrer la salida de yq o usar:
yq -s '.kind' multi.yaml— escribe un archivo por documento, con un nombre basado en su valor.kind.
cat > /tmp/multi.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 1
---
apiVersion: v1
kind: Service
metadata:
name: web-svc
spec:
port: 80
EOF
# Scale ONLY the Deployment, leave Service untouched
yq -i 'select(.kind == "Deployment").spec.replicas = 4' /tmp/multi.yaml
echo '--- Deployment replicas ---'
yq 'select(.kind == "Deployment").spec.replicas' /tmp/multi.yaml
echo '--- Service port (unchanged) ---'
yq 'select(.kind == "Service").spec.port' /tmp/multi.yamlModificar un YAML de CI de GitHub Actions
Los archivos de configuración de CI (.github/workflows/*.yml, .gitlab-ci.yml) también están en YAML. Los mismos comandos de yq funcionan, aunque las rutas pueden estar profundamente anidadas.
Tareas habituales al modificar CI:
- Fijar la versión del runner: actualice
runs-onen todos los trabajos. - Actualizar la versión de una acción: busque los pasos que utilizan una acción determinada y actualice su campo
uses. - Cambiar un indicador: active o desactive una configuración del nivel del workflow.
Ejemplo: actualizar a v4 todos los pasos que usan actions/checkout:
yq -i '(.jobs[].steps[] | select(.uses == "actions/checkout@v3")).uses = "actions/checkout@v4"' .github/workflows/ci.ymlEsta expresión — iterar con [], restringir con select() y asignar con = — es el patrón fundamental para cualquier edición de YAML estructurado.
cat > /tmp/ci.yml << 'EOF'
name: CI
on: [push]
jobs:
build:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: 18
- run: npm test
lint:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
- run: npm run lint
EOF
# Bump all checkout steps from v3 → v4
yq -i '(.jobs[].steps[] | select(.uses == "actions/checkout@v3")).uses = "actions/checkout@v4"' \
/tmp/ci.yml
# Verify both jobs were updated
yq '.jobs[].steps[] | select(.uses | test("checkout")).uses' /tmp/ci.ymlUsar variables de entorno en expresiones de yq
Codificar valores directamente en las expresiones de yq hace que los scripts sean frágiles. yq permite inyectar variables de shell mediante la función env() o la abreviatura strenv().
env(VAR_NAME)— lee la variable de entorno y la convierte al tipo YAML adecuado (un número sigue siendo un número y una cadena sigue siendo una cadena).strenv(VAR_NAME)— siempre devuelve una cadena, lo que resulta útil para las etiquetas de imágenes.
Esto evita la pesadilla de las comillas que supone interpolar variables dentro de cadenas de shell entre comillas dobles con rutas YAML incrustadas.
Patrón:
export IMAGE_TAG="my-app:3.0.0"
yq -i '.spec.template.spec.containers[0].image = strenv(IMAGE_TAG)' deployment.yamlUse env() al establecer campos numéricos como replicas para conservar el tipo YAML (entero, no una cadena entre comillas).
export APP_IMAGE="my-app:3.0.0"
export REPLICA_COUNT=6
# Set image using strenv() — result is a YAML string
yq -i '.spec.template.spec.containers[0].image = strenv(APP_IMAGE)' \
/tmp/deployment.yaml
# Set replicas using env() — result is a YAML integer
yq -i '.spec.replicas = env(REPLICA_COUNT)' \
/tmp/deployment.yaml
# Confirm types are correct in the output
yq '.spec.replicas, .spec.template.spec.containers[0].image' /tmp/deployment.yamlFusión de dos archivos YAML
A veces necesita aplicar un archivo de parche (un YAML pequeño con sobrescrituras) sobre una configuración base; por ejemplo, para aplicar sobrescrituras específicas del entorno en flujos de trabajo de estilo Kustomize.
yq puede fusionar dos archivos mediante el operador de fusión *:
yq '. *= load("patch.yaml")' base.yaml— fusiona el parche en profundidad con la base y escribe el resultado en la salida estándar.- Añada
-ipara actualizar la base directamente:yq -i '. *= load("patch.yaml")' base.yaml
Comportamiento de la fusión:
- Los valores escalares del parche sobrescriben los de la base.
- Los mapeos se fusionan en profundidad (se conservan las claves que no están en el parche).
- Las secuencias (matrices) se reemplazan de forma predeterminada, no se concatenan. Utilice
*+para añadirlas.
Este patrón sustituye los frágiles scripts de sed que se rompen cuando cambia el espaciado.
cat > /tmp/base.yaml << 'EOF'
app:
name: my-service
port: 8080
debug: false
database:
host: localhost
port: 5432
EOF
cat > /tmp/patch.yaml << 'EOF'
app:
port: 9090
debug: true
database:
host: db.production.svc
EOF
# Deep-merge patch into base (stdout preview first)
yq '. *= load("/tmp/patch.yaml")' /tmp/base.yaml
# Apply in place
yq -i '. *= load("/tmp/patch.yaml")' /tmp/base.yamlValidación de YAML y conversión a JSON
Antes de aplicar un YAML parcheado a un clúster, es recomendable validarlo y, opcionalmente, convertirlo a JSON para utilizarlo con otras herramientas.
Validar la sintaxis:
yq '.' file.yaml && echo "Valid"— yq termina con el código 1 si hay errores de análisis, por lo que esto funciona en las comprobaciones de CI.
Convertir YAML a JSON:
yq -o=json '.' file.yaml— muestra JSON con formato legible.- Envíe el resultado a
jqpara procesar más el JSON:yq -o=json '.' file.yaml | jq '.metadata.name'
Convertir JSON a YAML:
yq -P '.' file.json— la opción-Pfuerza la salida en formato YAML (con formato legible) cuando la entrada es JSON.
Estas conversiones convierten yq en un puente entre herramientas nativas de YAML (Helm, kubectl) y herramientas nativas de JSON (Terraform, AWS CLI, jq).
# Validate YAML (exits 0 on success, 1 on parse error)
if yq '.' /tmp/deployment.yaml > /dev/null 2>&1; then
echo "YAML is valid"
else
echo "YAML parse error!" >&2
exit 1
fi
# Convert to JSON and query with jq
yq -o=json '.' /tmp/deployment.yaml \
| jq '{name: .metadata.name, image: .spec.template.spec.containers[0].image}'
# Round-trip: JSON snippet back to YAML
echo '{"replicas": 7, "strategy": "RollingUpdate"}' \
| yq -P '.'Un script completo de parcheo de despliegues en CI
Reunamos todas las técnicas en un script de CI real que parchea un manifiesto de Deployment de Kubernetes como parte de un flujo de GitOps.
El script:
- Valida el YAML de entrada antes de modificarlo.
- Utiliza
env()/strenv()para todas las sustituciones de variables. - Actualiza la etiqueta de la imagen del contenedor mediante un
select()basado en el nombre. - Aumenta el número de réplicas.
- Establece una anotación
deploy-timecon la marca de tiempo actual. - Vuelve a validar la salida antes de confirmar los cambios.
Este patrón garantiza que, incluso si el flujo se ejecuta de forma simultánea, cada paso sea atómico y auditable.
#!/usr/bin/env bash
set -euo pipefail
MANIFEST="/tmp/deployment.yaml"
export NEW_IMAGE="my-app:$(date +%Y%m%d)-abc1234"
export NEW_REPLICAS=3
export DEPLOY_TIME="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
export CONTAINER="app"
# 1. Validate before patching
yq '.' "$MANIFEST" > /dev/null
# 2. Update image (by container name)
yq -i \
'(.spec.template.spec.containers[] | select(.name == strenv(CONTAINER))).image = strenv(NEW_IMAGE)' \
"$MANIFEST"
# 3. Set replicas
yq -i '.spec.replicas = env(NEW_REPLICAS)' "$MANIFEST"
# 4. Stamp annotation
yq -i '.metadata.annotations."deploy-time" = strenv(DEPLOY_TIME)' "$MANIFEST"
# 5. Validate result
yq '.' "$MANIFEST" > /dev/null && echo "Patch applied successfully"
# 6. Show diff summary
yq '{image: .spec.template.spec.containers[0].image, replicas: .spec.replicas}' "$MANIFEST"Comprobación de conocimientos: edición segura de varios documentos
Compruebe sus conocimientos sobre la edición de archivos YAML de Kubernetes con varios documentos mediante yq.
Repaso de la lección: edición de YAML con yq
Ha completado la lección sobre la edición de archivos de configuración YAML con yq. Este es un resumen conciso de todo lo tratado:
- Instalación: Utilice el binario de Go de mikefarah/yq (v4). Verifique la instalación con
yq --version. - Lectura: Rutas con notación de punto como
.spec.replicas; acceda a matrices con[0]o recórralas con[]. - Edición directa: La opción
-ireescribe el archivo. Previsualice siempre el resultado sin-iprimero. - Selección robusta: Prefiera
select(.name == "app")a los índices de matriz codificados. - Adición y eliminación: Asigne un valor a una ruta nueva para crearla; utilice
del()para eliminar campos. - Archivos con varios documentos: Utilice
select(.kind == "...")para seleccionar un recurso y dejar los demás intactos. - Variables de CI: Utilice
strenv(VAR)para cadenas yenv(VAR)para valores tipados; así evitará errores de comillas del shell. - Fusión:
. *= load("patch.yaml")fusiona en profundidad un archivo de sobrescrituras sin perder las claves que no se hayan parcheado. - Validación y conversión: Utilice
yq '.'como comprobación de lint, y-o=jsony-Ppara convertir formatos.
El patrón fundamental para cualquier parche YAML en CI es: validar → seleccionar → asignar → validar. Combínelo con strenv() y select() y no tendrá que recurrir de nuevo a frágiles comandos de una línea con sed.
Preguntas frecuentes
¿La lección «Edición de archivos de configuración YAML con yq» es gratis?
Sí — el texto completo de «Edición de archivos de configuración YAML con yq» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de DevOps Bootcamp, actualiza a CoddyKit PRO. El curso de DevOps Bootcamp incluye 4 lecciones en total.
¿Qué aprenderé en «Edición de archivos de configuración YAML con yq»?
Lea y modifique directamente archivos YAML de Kubernetes y CI con yq, conservando la estructura y los comentarios. Practicas DevOps Bootcamp con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar DevOps Bootcamp?
No se requiere experiencia previa. DevOps Bootcamp en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Edición de archivos de configuración YAML con yq»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de DevOps Bootcamp?
Sí. Cada lección de DevOps Bootcamp incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Filtrado y selección de JSON con pipelines de jq
- Transformación y construcción de objetos JSON con jq
- Consumo conjunto de API REST con curl y jq
- Edición de archivos de configuración YAML con yq