Linux: обновление значений в файле yaml - PullRequest
1 голос
/ 10 ноября 2011

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

INPUT:

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 Ответ

0 голосов
/ 06 июня 2015

Конечно, вы можете обновить текст в файле 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...