Перейти к основному содержимому

Работа в CLI

Обзор

С помощью консольного клиента tuna можно получать секреты, автоматически конфигурировать текущую среду или передавать конфигурацию в env нужного приложения.

Для получения секретов через консольное приложение tuna или API необходим API-ключ пользователя или Сервисный ключ конфигурации. При локальной разработке удобнее использовать глобальные API-ключи пользователя, но для работы в CI/CD, Production и других общих средах мы настоятельно рекомендуем использовать Сервисный ключ конфигурации.

Почему tuna secrets лучше direnv при локальной разработке?

direnv - прекрасная утилита для локальной конфигурации, но она всё таки заставляет следить за локальным файлом .env и если на Production появились новые переменные, вы можете не сразу узнать об этом и потратить часы на бессмысленную отладку. В tuna secrets предусмотрена автоматическая синхронизация секретов, что значительно упрощает этот процесс.

Почему tuna secrets лучше Gitlab/Github/Bitbucket Variables?

На самом деле причина тут та же, что и с direnv. Например, у вас есть специальный проект предназначенный для сборки и публикации приложения с помощью goreleaser и он может требовать множество ключей и токенов для разных внешних интеграций, при этом для разных окружений и использовать для этого Gitlab/Github/Bitbucket Variables неудобно, а ещё неудобнее следить за этим, плюс сложность в разграничении прав. В tuna secrets доступ к окружениям регулируется RBAC и вы можете точечно распределять доступ только нужным людям/роботам/скриптам. А обновив секрет или добавив новый, он сразу начнёт работать в CI.

Download

Чтобы получить секреты нужно выполнить команду:

tuna secrets download

Через дополнительные флаги или переменные окружения можно определить настройки, вроде проекта и конфигурации.

Передача проекта и конфигурации

Флаги --project и --config принимают на вход имя (алиас) проекта и конфигурации. По умолчанию конфигурация сохранится в файл tuna.json в текущем каталоге.

$ tuna secrets download --project api-php --config stage
INFO[13:57:46] Downloaded secrets to tuna.json

$ cat tuna.json
{
"API_DB": "postgres://postgres:postgres@localhost:5432/postgres",
"API_TOKEN": "PwZayIp9NpNntNYd2jkAAQgViM6dXdIm"
}

Передача формата

Можно указать в каком формате вам нужен файл json, yaml или env.

$ tuna secrets download --project api-php --config stage --format json
INFO[14:01:50] Downloaded secrets to tuna.json

$ cat tuna.json
{
"API_DB": "postgres://postgres:postgres@localhost:5432/postgres",
"API_TOKEN": "PwZayIp9NpNntNYd2jkAAQgViM6dXdIm"
}

Свой файл

В команде можно передать путь и определить свой файл.

$ tuna secrets download --project api-php --config stage foo-bar.json
INFO[14:11:57] Downloaded secrets to foo-bar.json

Вывод в stdout

Флаг --no-file отключает запись в файл и печатает конфигурацию на стандартный вывод.

$ tuna secrets download --project api-php --config stage --no-file --format env                        
API_TOKEN="PwZayIp9NpNntNYd2jkAAQgViM6dXdIm"
API_DB="postgres://postgres:postgres@localhost:5432/postgres"

Каталог для конфигурации области действия

Флаг --scope определяет какую область действия использовать, если она определена в конфиг файле с помощью tuna secrets setup (подробнее об этой команде описано ниже). По умолчанию . т.е. текущий каталог.

Например у вас в конфигурации есть такое описание:

cat ~/.config/tuna/tuna.yml                                               
secrets:
scoped:
/home/user/src/api:
project: api-php
config: stage

Это значит, что когда вы находитесь в каталоге /home/user/src/api вам не нужно передавать --project и --config, так как они определяются автоматически относительно --scope=. текущего каталога, и можно просто вызвать tuna secrets download.

Но если вы находитесь в директории для которой область действия не определена, то вы получите ошибку:

$ pwd                                                                                                  
/home/user/src/worker

$ tuna secrets download --format env --no-file
{"code":"BadRequest","error":"Validation failed: Incorrect value [fields=project,config]","request_id":"2wlgOjxclsn1yxVulEjPg2jKiQ5"}

Но можно передать --scope нужного каталога, например:

$ tuna secrets download --format env --no-file --scope /home/user/src/api           
API_TOKEN="PwZayIp9NpNntNYd2jkAAQgViM6dXdIm"
API_DB="postgres://postgres:postgres@localhost:5432/postgres"

Setup

Настройка каталога для конфигурации области действия. Чтобы сконфигурировать текущий каталог через меню, выполните:

tuna secrets setup

Настройка scope без меню

Как и в случае с download, в setup можно передать --project и --config и настроить окружение без псевдографического меню.

tuna secrets setup --project api-php --config stage

Настройка scope для не текущего каталога

Если вы хотите настроить не текущий каталог, то передайте нужный путь в флаг --scope.

tuna secrets setup --project api-php --config stage --scope /home/user/src/api

Run

Автоматическая конфигурация приложения с передачей переменных окружения непосредственно процессу.

tuna secrets run

В этом случае tuna выступает обёрткой и запускает ваше приложение с передачей ему нужной конфигурации. Например:

tuna secrets run -- yarn start

С явной передачей конфигурации

tuna secrets run --project api-php --config stage -- yarn start

С указанием scope

tuna secrets run --scope /home/user/src/api -- yarn start

Автоматический перезапуск приложения при изменении секрета (watch)

Если передать флаг --watch, то клиент начинает следить на изменениями секрета в API и если он меняется, то tuna перезапустит процесс с новой конфигурацией.

tuna secrets run --watch -- yarn start

Лучше всего работу продемонстрирует данное видео:

В видео мы запускаем вот такую команду:

tuna secrets run --watch -- bash -c 'while true; do echo -n "$(date -Is) [pid: $$] ==> " ; echo ${API_TOKEN} ; sleep 1; done'