Как прочитать файл yaml и вывести значения файла yaml в качестве переменных среды?

У меня есть переменные среды, хранящиеся в файле YAML. Файл YAML используется сторонней службой для развертывания.

Мне было интересно, есть ли способ получить файл YAML, который я использую, чтобы я мог получить доступ к своим учетным данным базы данных для запуска миграции после развертывания приложения?

пример YAML:

env_variables:
  DATABASE_CONNECTION_ADDRESS: 'localhost'
  DATABASE_PORT: '5432'
  DATABASE_NAME: 'a-db'
  DATABASE_USERNAME: 'user'
  DATABASE_PASSWORD: 'password'
  IS_DEBUG: 'false'
  GS_BUCKET_NAME: image-bucket

Моя основная мотивация заключается в том, что это развертывание выполняется в конвейере, и я не хочу поддерживать дублирование каждой из этих переменных среды в своем собственном секрете и хранить этот файл YAML в качестве секрета, чтобы сторонняя служба имела к нему доступ.

Поскольку вам, вероятно, не нужно все из вашего файла YAML, а только переменные среды, было бы хорошо включить пример, показывающий, где в структуре данных, представленной файлом YAML, env. vars определены (и как: пары ключ-значение, список списков ключей-значений). Таким образом, могут помочь и те, кто не знаком с github-actions. Bash сам по себе не может обрабатывать YAML в целом, какие программы доступны?

Anthon 03.05.2022 07:24

Существует действие, который делает это для переменных JSON в ENV. Сделать что-то подобное для YAML может быть не так уж сложно.

GuiFalourd 03.05.2022 14:00

привет @Anthon, я добавил пример, как ты и просил. Я могу использовать любую программу, которую вы порекомендуете.

Josh Martin 03.05.2022 18:17

@GuiFalourd Да, это очень близко к тому, что я ищу!

Josh Martin 03.05.2022 18:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если в вашей среде установлен Python и вы можете установить ruamel.yaml, вы можете получить вывод следующего однострочного кода:

python -c 'from pathlib import Path; from ruamel.yaml import YAML; print("".join([f"{k} = {v}\n" for k, v in YAML().load(Path("example.yaml"))["env_variables"].items()]))' 

Его вывод:

DATABASE_CONNECTION_ADDRESS=localhost
DATABASE_PORT=5432
DATABASE_NAME=a-db
DATABASE_USERNAME=user
DATABASE_PASSWORD=password
IS_DEBUG=false
GS_BUCKET_NAME=image-bucket

Как предположил Джефф Шаллер, вы, вероятно, захотите заключить значения в кавычки и избежать любых одинарных кавычек, которые могут встречаться в строке. Этого легко добиться, заменив {v} на {v!r} в однострочнике.

Как программа:

#!/usr/bin/env python3

from pathlib import Path
from ruamel.yaml import YAML

file_in = Path("example.yaml")

yaml = YAML()
env_data = yaml.load(file_in)["env_variables"]
print("".join([f"{k} = {v!r}\n" for k, v in env_data.items()])) 

Вы можете сделать переменные частью текущей оболочки с помощью set -a; eval $(python -c ...); set +a. Я работал над аналогичным решением и процитировал значения (окружите их значения {v} одинарными кавычками и используйте v.replace("'", r"'\''"))

Jeff Schaller 03.05.2022 19:34

@JeffSchaller Использование eval, вероятно, более уместно, чем попытки получить исходные данные. Я не уверен, что лучше использовать repr(v) вместо того, чтобы цитировать и использовать замену. Я думаю, что это имеет тот же эффект, которого вы пытаетесь достичь (одинарные кавычки вокруг значения и любые одинарные кавычки в самом значении экранированы). В строке формата вы можете получить это с помощью !r

Anthon 03.05.2022 23:49

Есть ли способ сделать это более удобным и читабельным? и что именно делают set -a и set +a?

Josh Martin 04.05.2022 06:34

@JoshMartin Вы можете превратить однострочник в программу, взяв все между одинарными кавычками и заменив точки с запятой на новые строки, а затем сделав извлечение отдельным оператором. На справочной странице bash вы можете найти set -a: Each variable or function that is created or modified is given the export attribute and marked for export to the environment of subsequent commands (+a отключает это)

Anthon 04.05.2022 09:41

Другие вопросы по теме