Это очень широкий вопрос о методах и рекомендациях относительно переменных / структуры среды. Но в конечном итоге я ищу ответы на очень специфический вопрос «Как хранить переменные среды?».
Сначала некоторые уточнения:
- Среда для меня может быть от 3 до 10 серверов и является способом сдерживания инфраструктуры конкретного клиента.
- Внутри каждой среды есть несколько переменных, которые в основном автоматически генерируются из нескольких ключевых входных данных (имя, размер и т. Д.).
В настоящий момент мы храним все переменные окружения в такой структуре:
<playbook>.yml # Various playbooks for deployment
roles/windows # Ansible role for Ubuntu
roles/ubuntu # Ansible role for Ubuntu
config/hosts/<name>.yml # Ansible inventory
config/hosts/vars/<name>.json # Environment specific variables
Прямо сейчас конфигурация инициализируется как подмодуль в репозитории git выше. Поскольку файл переменных изменяется довольно часто, это вызывало проблемы с изменением данных, один, два или даже три раза между фиксациями, что усложняло отслеживание изменений.
Поскольку я лично вижу, что это продвигается вперед, мы должны стремиться хранить все переменные наших клиентов централизованным / масштабируемым образом, а затем подключаться к ним с помощью динамического инвентаря с ansible .
Я понимаю, что есть несколько технологий, которые, кажется, выполняют часть того, что может потребоваться, например Consul, но они, кажется, работают лучше всего в среде, которая обслуживает одно большое приложение, а не множество небольших, слегка отличающихся друг от друга.
По сути, я вижу, что нам нужно написать сценарий инвентаризации, а затем просто поместить все наши данные в какую-то нецелевую базу данных, а затем продолжать работу, как будто ничего не изменилось. Я рассматриваю это как способ потенциально урезать большую часть данных, которые мы храним в настоящее время, и, возможно, искать другие способы хранения данных, а не просто увеличивать то, что обслуживает их снова.
Я надеюсь, что у кого-то есть опыт реализации инфраструктуры как кода, когда приходится иметь дело со множеством небольших сред, а не с одной, двумя или тремя огромными.
Какие-либо предложения?
Если ваша среда предназначена для каждого клиента, я бы предложил в вашем конкретном случае иметь репозиторий для каждого клиента . (Как правило, это репозиторий для каждой среды.) Этот репозиторий будет иметь стандартную структуру каталогов для переменных среды, переменных переменных и инвентаризаций, строго зашифрованных секретов (токенов доступа к учетной записи, личных ключей и т. Д.). Вы должны добавить субмодульный код в эти репозитории. Я бы, наверное, сделал это в нескольких хранилищах. Один для заданных ролей и модулей, один для сценариев обслуживания и развертывания, один для каждого основного приложения, работающего в среде.
Теперь вы можете по желанию раскошелиться на код или иным образом прикрепить подмодуль к определенному тегу для выпуска , убедившись, что код, управляющий средой клиента, не изменится, если не будет протестирован и выпущен.
Если вы используете репозиторий артефактов , убедитесь, что артефакты имеют правильную версию и эти версии правильно указаны в переменных среды.
Автоматизация важна, потому что переменные среды не должны обновляться людьми, где это возможно, а должны генерироваться сценариями. Удостоверьтесь, что в инвентаризации для каждого клиента почти нет обновлений вручную, а разработчики обновляют только репозитории кода. Если они хотят внести изменения в конфигурацию, это следует сделать с одним из генерирующих сценариев, который затем запускается для генерации переменных, и diff сохраняется в репозитории клиента. Стоит настроить непрерывную интеграцию для этого процесса. Без этого в какой-то момент будет слишком много хранилищ для обслуживания .
источник