Обновить значение вложенного массива в yaml с помощью yq - PullRequest
2 голосов
/ 29 мая 2020

Учитывая yaml-файл (helmfile), как показано ниже

releases:
  - chart: ../charts/foo
    name: foo
    namespace: '{{ .Values.stack }}'
    values:
      - ../config/templates/foo-values.yaml.gotmpl
    set:
      - name: image.tag
        value: 22
      - name: replicas
        value: 1
  - chart: ../charts/bar
    name: bar
    namespace: '{{ .Values.stack }}'
    values:
      - ../config/templates/bar-values.yaml.gotmpl
    set:
      - name: image.bar_proxy.tag
        value: 46
      - name: image.bar.tag
        value: 29
      - name: replicas
        value: 1

Я пытаюсь найти чистый способ обновления определенного тега изображения c. Например, я хотел бы обновить image.bar_proxy.tag с 46 до 51.

У меня есть следующее, которое выполняет свою работу, но требует, чтобы вы знали точный индекс элемента массива :

yq -y '.releases[] |= if .name=="bar" then .set[0].value |= 51 else . end' helmfile-example.yaml

Так что, если бы порядок массивов в какой-то момент изменился, это бы сломалось.

Предпочтительным решением было бы: "обновить значение image.bar_proxy.tag с 46 до 51 где установлено []. Name == image.bar_proxy.tag ". Есть идеи о том, как добиться более точного c условного выбора вроде этого?

К вашему сведению, наша версия yq:

$ yq --version
yq 2.10.0

1 Ответ

2 голосов
/ 29 мая 2020

Вы можете использовать следующий фильтр, чтобы он заработал. Он работает путем динамического выбора индекса объекта, в котором существует ваш тег. На выбранном объекте .value=51 обновит значение по вашему желанию. Вы также можете использовать флаг -i для модификации исходного файла на месте.

yq -y '.releases[].set |= map(select(.name == "image.bar_proxy.tag").value=51)' yaml

См. Базовый фильтр jq, действующий на объект JSON в jq-plays

...