2017-09-13 5 views
1

Je dois mettre à jour la configuration du fichier YAML. Voici la sortie actuelle et attendue. Comment puis-je le faire en utilisant un script shell d'une manière meilleure et plus simple?Mettre à jour le fichier YAML en utilisant un script shell dans Ubuntu

Avant la mise à jour du fichier YAML:

# Where and how to store data. 
storage: 
    dbPath: /var/lib/mongodb 
    journal: 
    enabled: true 
# engine: 
# mmapv1: 
# wiredTiger: 

Après mise à jour du fichier YAML:

# Where and how to store data. 
storage: 
    dbPath: /var/lib/mongodb 
    journal: 
    enabled: true 
    engine: "wiredTiger" 
# mmapv1: 
    wiredTiger: 
    engineConfig: 
     cacheSizeGB: 4 
+1

Vous devriez toujours utiliser un analyseur pour faire ce genre de mise à jour, en utilisant un script shell (appelant 'sed' ou' awk') qui ne connaît pas les composants internes de YAML. (Sur les citations, les lignes pliées, les commentaires, le style de bloc contre le flux, etc.) – Anthon

+1

Assez en accord avec @Anthon là. Je veux dire "C'est juste du texte", donc vous pouvez faire à peu près tout ce que vous voulez. Mais il s'agit en réalité d'une "structure de données sérialisée", donc il est vraiment logique d'analyser et de modifier une structure de données en fonction de vos besoins, puis de la sortir à nouveau en tant que YAML. Il est presque vieux puisque même CSV peut être assez simple, et pourtant c'est aussi très simple de le casser. Les structures de données sont généralement mieux laissées à des choses qui les comprennent. IHMO, –

+0

En tant que sidenote, vos "modifications" sont vraiment assez génériques. Il ne semble donc pas y avoir de raison pour que vous ne puissiez simplement pas échanger une configuration existante contre une nouvelle. À moins bien sûr qu'il y ait des données spécifiques d'instance contenues qui ne sont pas mentionnées dans la question, –

Répondre

1

Si votre entrée est config_in.yaml:

# Where and how to store data. 
storage: 
    dbPath: /var/lib/mongodb 
    journal: 
    enabled: true 

Vous pouvez appeler python update.py wiredTiger 4 avec update.py:

import sys 
from pathlib import Path 

from ruamel.yaml import YAML 

file_name = Path('config_in.yaml') 

engine = sys.argv[1] 
size = int(sys.argv[2]) 


yaml = YAML() 
data = yaml.load(file_name) 
data['storage']['engine'] = engine 
data['storage'][engine] = dict(engineConfig=dict(cacheSizeGB=size)) 
yaml.dump(data, sys.stdout) 
yaml.dump(data, Path('config.yaml')) 

pour obtenir cette sortie (sur la sortie standard, ainsi que dans config.yaml):

# Where and how to store data. 
storage: 
    dbPath: /var/lib/mongodb 
    journal: 
    enabled: true 
    engine: wiredTiger 
    wiredTiger: 
    engineConfig: 
     cacheSizeGB: 4 

Cela suppose python3 (ou python2 avec pathlib2 installé) et ruamel.yaml (dont je suis l'auteur)

+0

: "wiredTiger" est manquant dans la sortie. Aussi je ne veux pas cette ligne "# wiredTiger:". Voici ma sortie après l'exécution de votre script. # Où et comment stocker les données. stockage : dbPath:/var/lib/MongoDB journal: activé: true wiredTiger: engineConfig: cacheSizeGB: 4 # moteur: # mmapv1: # wiredTiger: – karan

+0

Je mis à jour le script. Il est ** possible de supprimer des commentaires, mais pas aussi facile que de les laisser comme dans l'entrée que j'ai présentée. Surtout parce que plusieurs lignes de commentaires sont supposées être un bloc de commentaire. – Anthon

+0

Ok. Merci. Ça marche. – karan