Правильный способ сделать это - использовать язык сценариев и библиотеку синтаксического анализа YAML для извлечения интересующего вас поля.
Вот пример того, как это сделать в Python.Если бы вы делали это по-настоящему, вы бы, вероятно, разбили его на несколько функций и получили бы лучшие отчеты об ошибках.Это буквально просто для иллюстрации некоторых трудностей, вызванных форматом calico.yaml
, который объединяет несколько документов YAML, а не один.Вам также нужно перебрать некоторые из внутренних списков в документе, чтобы извлечь интересующее вас поле.
#!/usr/bin/env python3
import yaml
def foo():
with open('/tmp/calico.yaml', 'r') as fil:
docs = yaml.safe_load_all(fil)
doc = None
for candidate in docs:
if candidate["kind"] == "DaemonSet":
doc = candidate
break
else:
raise ValueError("no YAML document of kind DaemonSet")
l1 = doc["spec"]
l2 = l1["template"]
l3 = l2["spec"]
l4 = l3["containers"]
for containers_item in l4:
l5 = containers_item["env"]
env = l5
for entry in env:
if entry["name"] == "CALICO_IPV4POOL_CIDR":
return entry["value"]
raise ValueError("no CALICO_IPV4POOL_CIDR entry")
print(foo())
Однако иногда вам нужно решение прямо сейчас и сценарии оболочки очень хороши в этом.
Если вы работаете с конечной точкой API, YAML обычно печатается довольно красиво, так что вы можете с легкостью извлекать текст способами, которые неработать с произвольным YAML.
Что-то вроде следующего должно быть достаточно надежным:
cat </tmp/calico.yaml | grep -A1 CALICO_IPV4POOL_CIDR | grep value: | cut -d: -f2 | tr -d ' "'
Хотя в конце стоит проверить с помощью регулярного выражения, что извлеченное значение действительно является действительной нотацией CIDR IPv4.
Ключевым моментом здесь является grep -A1 CALICO_IPV4POOL_CIDR
.
Упомянутый вами двухэлементный словарь (показанный ниже) всегда будет отображаться как один блок, поскольку он является поддеревом документа YAML.
- name: CALICO_IPV4POOL_CIDR
value: "192.168.0.0/16"
Клавиши в calico.yaml
не сортируются в алфавитном порядке в целом, но в конструкциях {"name": <something>, "value": <something else>}
, name
последовательно появляется до value
.