Modifier des fichiers de configuration YAML avec yq
Lisez et modifiez sur place des fichiers YAML Kubernetes et CI avec yq, tout en préservant leur structure et leurs commentaires.
Modifier des fichiers de configuration YAML avec yq est une leçon DevOps Bootcamp gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage DevOps Bootcamp, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours DevOps Bootcamp comprend 4 leçons au total.
Qu’est-ce que yq et pourquoi l’utiliser pour YAML ?
yq est un processeur YAML portable en ligne de commande, comparable à la manière dont jq traite JSON. Il vous permet de lire, filtrer et modifier des fichiers YAML sans écrire de script en Python ou en Ruby.
Deux outils populaires portent le nom yq :
- mikefarah/yq (Go) — activement maintenu, il prend en charge YAML, JSON, XML et TOML. Cette leçon utilise cette version.
- kislyuk/yq (Python) — un adaptateur de
jqpour YAML ; sa syntaxe est différente.
Installez la version Go :
brew install yqsur macOSsnap install yqsur Linux- Ou téléchargez le binaire :
wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/local/bin/yq && chmod +x /usr/local/bin/yq
Vérifiez l’installation : yq --version doit afficher v4.x.x. La version 4 utilise une syntaxe d’expression différente de celle de v3 ; la version est donc 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 --versionLire des valeurs dans un fichier YAML de déploiement Kubernetes
Avant de modifier quoi que ce soit, apprenez à lire les champs YAML. À partir d’un déploiement Kubernetes, vous pouvez extraire toute valeur imbriquée à l’aide de chemins en notation pointée.
Exemple 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.0Principales commandes de lecture :
yq '.metadata.name' deployment.yaml— affichemy-appyq '.spec.replicas' deployment.yaml— affiche3yq '.spec.template.spec.containers[0].image' deployment.yaml— affichemy-app:1.0.0
Par défaut, la sortie est du texte brut (sans guillemets). Ajoutez l’option -r ou utilisez | yq -r si vous avez besoin de chaînes brutes dans vos 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)"Modifier sur place avec l’option -i
L’option la plus importante pour une utilisation réelle est -i (sur place). Sans elle, yq affiche les résultats dans la sortie standard et laisse le fichier inchangé.
Syntaxe :
- Lecture seule (sortie standard) :
yq '.spec.replicas' file.yaml - Modification sur place :
yq -i '.spec.replicas = 5' file.yaml
L’opérateur d’affectation = définit une valeur. L’expression est un filtre yq complet ; vous pouvez donc combiner lecture et écriture en un seul passage.
Important : yq -i réécrit entièrement le fichier. Les commentaires placés sur la même ligne qu’un champ sont généralement conservés, mais les blocs de commentaires autonomes peuvent être déplacés. Validez toujours votre YAML dans le système de contrôle de version avant d’effectuer des modifications sur place en grand nombre.
Faites d’abord un essai sans -i, puis ajoutez cette option lorsque la sortie vous convient.
# 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.yamlMettre à jour l’étiquette de l’image du conteneur
Une tâche très courante d’intégration continue consiste à incrémenter l’étiquette de l’image Docker dans un manifeste Kubernetes après la création d’une nouvelle image. Avec yq, cela se fait en une seule ligne.
Le modèle est le suivant :
- Ciblez le conteneur par son nom avec
select()afin d’éviter de coder en dur l’index 0 du tableau. - Utilisez
|=(opérateur de mise à jour) ou=pour définir la nouvelle valeur.
Avec un index de tableau (fragile si la liste des conteneurs change) :
yq -i '.spec.template.spec.containers[0].image = "my-app:2.1.0"' deployment.yaml
Avec select() (robuste) :
yq -i '(.spec.template.spec.containers[] | select(.name == "app")).image = "my-app:2.1.0"' deployment.yaml
Dans une chaîne d’intégration continue, vous transmettriez l’étiquette sous forme de variable d’interpréteur de commandes :
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.yamlAjouter et supprimer des champs
En plus de mettre à jour les champs existants, yq peut ajouter de nouvelles clés ou en supprimer certaines.
Ajouter un champ :
- Attribuez simplement une valeur à un chemin qui n’existe pas :
yq -i '.metadata.labels.version = "v2"' file.yaml - Si la clé parente (
labels) est absente, yq la crée automatiquement.
Supprimer un champ :
- Utilisez la fonction
del():yq -i 'del(.metadata.annotations)' file.yaml - Supprimez un élément de tableau par son index :
yq -i 'del(.spec.template.spec.containers[1])' file.yaml
Ajouter un élément à un tableau :
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.yamlUtiliser des fichiers YAML à plusieurs documents
Les manifestes Kubernetes regroupent souvent plusieurs ressources dans un même fichier, séparées par ---. Par défaut, yq traite tous les documents présents dans un tel fichier.
Techniques principales :
- Répertorier tous les types de documents :
yq '.[].kind' multi.yaml— notez le.[]initial qui permet d’itérer sur les documents. - Cibler un document précis par son type :
yq 'select(.kind == "Service")' multi.yaml - Modifier sur place uniquement les documents correspondants :
yq -i 'select(.kind == "Deployment").spec.replicas = 2' multi.yaml
Les documents qui ne correspondent pas au prédicat de select() sont transmis sans modification ; votre Service, votre ConfigMap et vos autres ressources restent donc intacts.
Pour séparer un fichier à plusieurs documents en fichiers individuels, vous pouvez parcourir la sortie de yq ou utiliser :
yq -s '.kind' multi.yaml— écrit un fichier par document, nommé d’après sa valeur.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.yamlCorriger le fichier YAML d’intégration continue de GitHub Actions
Les fichiers de configuration d’intégration continue (.github/workflows/*.yml, .gitlab-ci.yml) sont eux aussi au format YAML. Les mêmes commandes yq fonctionnent, même si les chemins peuvent être profondément imbriqués.
Tâches courantes de correction de l’intégration continue :
- Figer la version d’un exécuteur : mettez à jour
runs-ondans toutes les tâches. - Mettre à jour la version d’une action : recherchez les étapes qui utilisent une action donnée et incrémentez son champ
uses. - Activer ou désactiver une option : activez ou désactivez un paramètre au niveau du flux de travail.
Exemple : mettre à jour vers v4 toutes les étapes qui utilisent actions/checkout :
yq -i '(.jobs[].steps[] | select(.uses == "actions/checkout@v3")).uses = "actions/checkout@v4"' .github/workflows/ci.ymlCette méthode — itérer avec [], restreindre avec select(), affecter avec = — constitue le modèle central de toute modification structurée de YAML.
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.ymlUtiliser des variables d’environnement dans les expressions yq
Coder des valeurs en dur dans les expressions yq rend les scripts fragiles. yq permet d’injecter des variables de l’interpréteur de commandes avec la fonction env() ou l’abréviation strenv().
env(VAR_NAME)— lit la variable d’environnement et la convertit vers le type YAML approprié (un nombre reste un nombre, une chaîne reste une chaîne).strenv(VAR_NAME)— renvoie toujours une chaîne, ce qui est utile pour les étiquettes d’image.
Cela évite le cauchemar des guillemets lié à l’interpolation de variables dans des chaînes de l’interpréteur de commandes entre guillemets doubles contenant des chemins YAML.
Modèle :
export IMAGE_TAG="my-app:3.0.0"
yq -i '.spec.template.spec.containers[0].image = strenv(IMAGE_TAG)' deployment.yamlUtilisez env() lorsque vous définissez des champs numériques comme replicas, afin de préserver le type YAML (entier et non chaîne entre guillemets).
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.yamlFusionner deux fichiers YAML
Vous devez parfois appliquer un fichier de correctif (un petit YAML de remplacement) à une configuration de base — par exemple pour gérer des remplacements propres à un environnement dans des flux de travail de type Kustomize.
yq peut fusionner deux fichiers à l’aide de l’opérateur de fusion * :
yq '. *= load("patch.yaml")' base.yaml— effectue une fusion en profondeur du correctif dans la base et écrit le résultat sur la sortie standard.- Ajoutez
-ipour mettre à jour la base sur place :yq -i '. *= load("patch.yaml")' base.yaml
Fonctionnement de la fusion :
- Les valeurs scalaires du correctif écrasent celles de la base.
- Les mappages sont fusionnés en profondeur (les clés absentes du correctif sont conservées).
- Les séquences (tableaux) sont remplacées par défaut et non ajoutées à la suite. Utilisez
*+pour les ajouter à la suite.
Ce modèle remplace les scripts sed fragiles qui cessent de fonctionner lorsque les espaces changent.
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.yamlValider YAML et convertir en JSON
Avant d’appliquer un YAML corrigé à un cluster, il est recommandé de le valider et, si nécessaire, de le convertir en JSON pour d’autres outils.
Valider la syntaxe :
yq '.' file.yaml && echo "Valid"— yq se termine avec le code 1 en cas d’erreur d’analyse, ce qui convient aux contrôles d’intégration continue.
Convertir YAML en JSON :
yq -o=json '.' file.yaml— produit un JSON mis en forme.- Transmettez le résultat à
jqpour poursuivre le traitement JSON :yq -o=json '.' file.yaml | jq '.metadata.name'
Convertir JSON en YAML :
yq -P '.' file.json— l’option-Pforce la sortie au format YAML (mise en forme) lorsque l’entrée est au format JSON.
Ces conversions font de yq un pont entre les outils natifs de YAML (Helm, kubectl) et les outils natifs 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 '.'Script complet de correctif pour un déploiement en intégration continue
Voici comment réunir toutes les techniques : un véritable script d’intégration continue qui corrige un manifeste de déploiement Kubernetes dans le cadre d’un flux GitOps.
Le script :
- Valide le YAML d’entrée avant toute modification.
- Utilise
env()/strenv()pour toutes les substitutions de variables. - Met à jour la balise de l’image du conteneur à l’aide d’un
select()basé sur le nom. - Augmente le nombre de réplicas.
- Ajoute une annotation
deploy-timecontenant l’horodatage actuel. - Valide à nouveau la sortie avant la validation des modifications.
Ce modèle garantit que, même si le flux s’exécute simultanément, chaque étape est atomique et vérifiable.
#!/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"Vérification des connaissances : modifier plusieurs documents en toute sécurité
Vérifiez votre compréhension de la modification de fichiers YAML Kubernetes contenant plusieurs documents avec yq.
Récapitulatif de la leçon : modifier du YAML avec yq
Vous avez terminé la leçon sur la modification de fichiers de configuration YAML avec yq. Voici un résumé concis de tout ce qui a été abordé :
- Installation : utilisez le binaire Go de mikefarah/yq (v4). Vérifiez l’installation avec
yq --version. - Lecture : chemins en notation par points tels que
.spec.replicas; accès aux tableaux avec[0]ou itération avec[]. - Modification sur place : l’option
-iréécrit le fichier. Affichez toujours un aperçu sans-iau préalable. - Ciblage fiable : préférez
select(.name == "app")aux indices de tableau codés en dur. - Ajout et suppression : affectez une nouvelle valeur à un chemin pour le créer ; utilisez
del()pour supprimer des champs. - Fichiers contenant plusieurs documents : utilisez
select(.kind == "...")pour cibler une ressource et laisser les autres intactes. - Variables d’intégration continue : utilisez
strenv(VAR)pour les chaînes etenv(VAR)pour les valeurs typées — cela évite les problèmes de guillemets du shell. - Fusion :
. *= load("patch.yaml")fusionne en profondeur un fichier de remplacement sans perdre les clés qui ne sont pas corrigées. - Validation et conversion : utilisez
yq '.'comme contrôle de qualité ;-o=jsonet-Pservent à convertir le format.
Le modèle essentiel pour tout correctif YAML en intégration continue est : valider → sélectionner → affecter → valider. Combinez-le avec strenv() et select() et vous n’aurez plus jamais besoin de recourir aux commandes sed fragiles d’une seule ligne.
Questions Fréquemment Posées
La leçon « Modifier des fichiers de configuration YAML avec yq » est-elle gratuite ?
Oui — le texte complet de « Modifier des fichiers de configuration YAML avec yq » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours DevOps Bootcamp, passe à CoddyKit PRO. Le cours DevOps Bootcamp comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Modifier des fichiers de configuration YAML avec yq » ?
Lisez et modifiez sur place des fichiers YAML Kubernetes et CI avec yq, tout en préservant leur structure et leurs commentaires. Tu pratiques DevOps Bootcamp avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer DevOps Bootcamp ?
Aucune expérience préalable n'est requise. DevOps Bootcamp sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Modifier des fichiers de configuration YAML avec yq » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon DevOps Bootcamp ?
Oui. Chaque leçon DevOps Bootcamp inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Filtrer et sélectionner du JSON avec les pipelines jq
- Transformer et construire des objets JSON avec jq
- Consommer des API REST avec curl et jq
- Modifier des fichiers de configuration YAML avec yq