У меня есть переменные среды, хранящиеся в файле 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 в качестве секрета, чтобы сторонняя служба имела к нему доступ.
Существует действие, который делает это для переменных JSON в ENV. Сделать что-то подобное для YAML может быть не так уж сложно.
привет @Anthon, я добавил пример, как ты и просил. Я могу использовать любую программу, которую вы порекомендуете.
@GuiFalourd Да, это очень близко к тому, что я ищу!
Если в вашей среде установлен 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"'\''")
)
@JeffSchaller Использование eval, вероятно, более уместно, чем попытки получить исходные данные. Я не уверен, что лучше использовать repr(v)
вместо того, чтобы цитировать и использовать замену. Я думаю, что это имеет тот же эффект, которого вы пытаетесь достичь (одинарные кавычки вокруг значения и любые одинарные кавычки в самом значении экранированы). В строке формата вы можете получить это с помощью !r
Есть ли способ сделать это более удобным и читабельным? и что именно делают set -a
и set +a
?
@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 отключает это)
Поскольку вам, вероятно, не нужно все из вашего файла YAML, а только переменные среды, было бы хорошо включить пример, показывающий, где в структуре данных, представленной файлом YAML, env. vars определены (и как: пары ключ-значение, список списков ключей-значений). Таким образом, могут помочь и те, кто не знаком с github-actions. Bash сам по себе не может обрабатывать YAML в целом, какие программы доступны?