#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)