Linux: обновление значений в файле yaml

#linux #yaml

#linux #yaml

Вопрос:

У меня есть файл конфигурации в YAML (Cassandra), и я хотел бы обновить несколько значений внутри него. Есть ли у вас какие-либо предложения по сценарию, который позволил бы мне это сделать? Возможно, какие-то существующие примеры?

ВВОД:

 cluster_name: 'CassandraCluster0'
initial_token:
seed_provider:
    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
      parameters:
          - seeds: "127.0.0.1"
  

ВЫВОД:

 cluster_name: 'CassandraCluster0'
initial_token: 582023494802482234
seed_provider:
    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
      parameters:
          - seeds: "10.12.3.4, 1.3.4.3"
  

Комментарии:

1. Я не понимаю, разве вы не можете легко сделать это на любом языке, на котором вы предпочитаете кодировать? Лично я бы использовал perl или даже просто sed. С какой проблемой вы сталкиваетесь при попытке?

Ответ №1:

Вы, конечно, можете обновить текст в файле YAML с помощью sed / awk / perl , но, как и при обновлении CSV, INI, XML, HTML с помощью этих инструментов, они ужасно не работают в более сложных примерах, где значения «внезапно» занимают несколько строк или иным образом семантически совпадают с тем, что работало, но больше не состоят из одинаковых совпадающих строк.

Лучше просто использовать язык программирования и реальный анализатор (что также рекомендуется для других форматов). Вот как вы можете сделать это с помощью Python и ruamel.yaml, автором которых я являюсь. Итак, если ваш ввод находится в input.yml , это:

 import ruamel.yaml as yaml

data = yaml.load(open('input.yml'), Loader=yaml.RoundTripLoader)
data['initial_token'] = 582023494802482234
data['seed_provider'][0]['parameters'][0]['seeds'] = "10.12.3.4, 1.3.4.3"
print yaml.dump(data, Dumper=yaml.RoundTripDumper)
  

приведет к:

 cluster_name: CassandraCluster0
initial_token: 582023494802482234
seed_provider:
- class_name: org.apache.cassandra.locator.SimpleSeedProvider
  parameters:
  - seeds: 10.12.3.4, 1.3.4.3
  

Пожалуйста, обратите внимание, что IP-адреса не заключены в кавычки, поскольку в них нет необходимости. Возможно, но не очень просто точно настроить стиль, чтобы заключать значения только в двойные кавычки. И еще сложнее сделать это вокруг определенных значений, поэтому я надеюсь, что это не проблема.

Если вам часто приходится обновлять набор входных файлов для этих двух значений, вы можете создать скрипт, который принимает имя файла, токен и начального поставщика из командной строки:

 update_yml input.yml 582023494802482234 "10.12.3.4, 1.3.4.3"
  

и как скрипт update_yml :

 #! /usr/bin/env python

import sys
import ruamel.yaml as yaml

data = yaml.load(open(sys.argv[1]), Loader=yaml.RoundTripLoader)
data['initial_token'] = sys.argv[2]
data['seed_provider'][0]['parameters'][0]['seeds'] = sys.argv[3]
print yaml.dump(data, Dumper=yaml.RoundTripDumper)