Последние две статьи в нашей серии касались Потенциал переменных среды и некоторые Практические примеры Анкет В этой статье мы разговариваем с инженером Devops Antione Rougeot о проблемах управления переменными окружающей среды И он разделяет некоторые лучшие практики из своего опыта.
HumanItec: Прежде чем мы поговорим о переменных окружающей среды, возможно, вы могли бы кратко представиться и рассказать нам кое -что о своем прошлом.
Antione Rougeot: Я помогаю предприятиям закрыть разрыв между разработчиками и продуктами. Увлеченный компьютерами, я работал разработчиком и инженером -программистом в течение 6 лет и развивался, чтобы стать инженером DevOps. В прошлом году я начал работать фрилансером, помогая нескольким клиентам приложить свои приложения. Благодаря этому их приложения становятся независимыми от серверов, на которые они развернуты, и они могут свободно работать на любой инфраструктуре, соответствующей докеру.
Почему вы обычно имеете дело с переменными окружающей среды?
Ключевой концепцией, которой я следовал во время кодирования приложений в качестве инженера -программиста, состояла в том, чтобы сделать классы свободно связанными. Это означает наличие приложения, состоящего из многих независимых частей кода, что гарантирует, что ваш код имеет определенный уровень чистоты и обслуживания. Затем идея состоит в том, чтобы создать эти классы, передавая значения параметров и гарантировать, что они работают вместе сплоченным образом. Та же концепция применяется к программной инфраструктуре. Мы создаем много независимых контейнеров Docker, которые мы соединяем вместе, используя переменные среды. Это также известно как архитектура микросервисов.
Чтобы привести конкретный пример, вот определение двух модулей, подключенных с использованием переменной среды. Это определение сделано для Docker-Compose, инструмента, используемого на машине разработки для запуска контейнеров и проверить, что они хорошо работают вместе.
# docker-compose.yml version: '3' services: frontend: build: ./frontend ports: - 80 depends_on: - backend environment: BACKEND_ENDPOINT: localhost:2000 backend: build: ./backend expose: - 2000
Как вы можете видеть, код довольно прост, фронт и бэкэнд создаются с использованием DockerFiles, присутствующих на их соответствующих путях. Оба модуля доступны в сети, используя указанные порты. Фронт должен быть запущен после бэкэнда. Frontend связывается с бэкэнд, используя значение конечной точки Backend_endpoint
Анкет
Что здорово в этой настройке, так это то, что вам не нужно перестроить модуль Frontend, чтобы начать указывать на новое значение конечной точки бэкэнд.
Когда эта настройка будет развернута для производства, единственное сделанное изменение меняется Backend_endpoint
значение от Localhost: 2000
к его доменному имени, как https://backend.endpoint.domain.org
Анкет Каждый модуль теперь независим (слабо связан), а также хорошо подключен с использованием переменной среды (очень сплоченной).
С какими трудностями вы можете столкнуться при настройке переменных среды?
Цитируйте Википедию: «Devops-это набор практик, который сочетает в себе разработку программного обеспечения (DEV) и информационные операции (OPS)». Переменные среды являются частью этого «набора практик».
Что сложно, так это принять существующее приложение и преобразовать его таким образом, чтобы это совместимо с этими практиками, включая настройку параметров с переменными среды. Когда вы строите приложение с нуля, если вы не помните, что оно будет работать в контейнере Docker, адаптация станет более сложной, поскольку она повлияет на все применение.
После того, как вы успешно внесли эти изменения в приложение, вы достигнете следующего шага, делая ту же работу на машинах разработчиков и в производстве.
Представьте, что у вас есть следующая установка, которая очень распространена.
Приложение читает конфиденциальные данные конфигурации, такие как api_key
из простого текстового файла.
Этот файл не включен в управление источником по соображениям безопасности, он прошел вручную. Когда прибывает новый разработчик, они просят этот файл у коллег, чтобы начать кодировать и проверить приложение.
При производстве файл переписывается на удаленный сервер, и он остается там. Проблема здесь заключается в том, что при этом производственное приложение тесно связано с сервером, на котором он работает. Чтобы улучшить вещи, вы решите перейти на настройку на основе Docker. Хороший выбор.:)
После рефакторинга ваше приложение больше не читает значение «api_key» из файла, но из Api_key
переменная среды. На этом этапе вы можете развернуть его в инфраструктуре, совместимой с докером. Значение Api_key
безопасно установлен на платформе, которую вы используете для развертки контейнеров, и если вы добавите новый этап, он по умолчанию, что устраняет необходимость в том, чтобы копировать что-то на удаленном сервере и делает развертывание полностью автоматизированным!
Последний шаг теперь — как установить Api_key
На машинах разработчика? Есть несколько решений:
- Вы просите каждого разработчика установить ценность в своей среде перед запуском приложения
- Вы добавляете некоторую логику в инициализацию приложения для использования значения переменной среды API, если оно существует, в противном случае возвращайтесь в файл простой конфигурации
Большой! В настоящее время все работает как над производством, так и на машинах для разработчиков. Все среды могут запускать один и тот же контейнер, но с разными параметрами.
Можете ли вы привести реальный пример сложности, с которой вы столкнулись?
Как вы знаете, дела идут не всегда так же, как и ожидалось. Самая большая проблема — когда вы понимаете, что внешняя зависимость не была разработана для совместимости с переменными среды. Это случилось со мной недавно, пытаясь докеризировать приложение Ruby on Rails, которое работало в производственной среде с двигателем под названием пассажир. Этот двигатель хорошо работает в мире без докеров, когда вы определяете конфигурации в простых текстовых файлах, но оказывается, что этот двигатель не может по умолчанию читать переменные среды.
После исследования я понял, что источником проблемы является то, что этот двигатель был подпроцессом Nginx, и, как указано в документации :
«По умолчанию Nginx удаляет все переменные среды, унаследованные от его родительского процесса».
Конечно, я не первый человек, который пытается рассказать о пассажире с приложением Rails, поэтому после дальнейшего расследования я увидел, что она добавила директиву « Passenger_App_env Анкет Значение директивы не может быть установлено динамически, поэтому я в итоге использовал хакерский обходной путь, где я преобразовал файлы конфигурации в шаблоны и заменил значения envsubst
инструмент.
Пришло время пересмотреть выбор использования пассажира + nginx для запуска приложения.
Возможные решения, которые я определил, были следующими:
- Попробуйте альтернативу пассажира Apache +,
- Попробуйте другой двигатель, такой как Unicorn, и
- Используйте стандартный сервер PUMA, который уже использовался на машинах разработчика.
Третье решение имело смысл, потому что оно позволило нам сбросить слой сложности, а также двигаться к другой практике DevOps, которая заключается в том, чтобы сохранить среду развития так же, как производство. То, что кажется быстрым изменением, иногда может оказаться сложной задачей, требующей пересмотреть компоненты архитектуры приложения.
В этот момент команды чаще всего борются, когда дело доходит до переменных окружающей среды?
В первые годы в качестве разработчика я всегда говорил: «У меня аллергия на конфигурацию».
Программное обеспечение часто имеет большую папку конфигурации или даже несколько мест, где оно определено. Конфигурация, как правило, темное место. Разработчикам не нужно часто менять, поэтому никто точно не знает, что внутри, кроме архитектора, который уже покинул проект.
Если вы хотите рассказать о приложении, вы должны выкопать, идентифицировать и извлекать все значения, которые зависят от среды. Эти изменения часто происходят со страхом «сломать все». Действительно, изменение конфигурации не похоже на кодирование на бэкэнд или фронта. В некоторых ситуациях трудно подтвердить, что то, что вы только что изменили, правильно.
Что -то распространенное с такими задачами, как рефакторирование конфигурации, заключается в том, что она имеет низкий приоритет. Это то, что вообще не будет видно на стороне продукта. Команды определяют приоритеты в новых функциях, которые приносят заметные результаты. Не заботиться о конфигурации может привести к полной потере контроля над ней! Кроме того, это требует высокого представления о системе, которого может быть трудно достичь. Подводя итог, что несколько факторов могут создавать борьбу, когда речь идет о переменных окружающей среды: страх нарушения, потеря контроля и необходимость в представлении высокого уровня.
Каковы будут ваши лучшие 3 совета о том, как избежать этой борьбы?
Во -первых, минимизировать использование значений по умолчанию. Если вы идентифицируете параметр, который должен быть установлен как переменная среды, подумайте дважды, прежде чем установить значение по умолчанию.
Это может быть опасно и создавать неожиданное поведение или хуже: ложные срабатывания.
Пример: вы используете Backend_endpoint
Чтобы сказать вашему фронта, как общаться с бэкэнд.
У вас есть 2 среды: разработка и производство. Для разработки ценность должна быть https://dev.myapi.org,
и в производстве: https://prod.myapi.org.
При инициализации вашего приложения вы делаете что -то вроде:
if env_variable_is_set("BACKEND_ENDPOINT") backend_endpoint = BACKEND_ENDPOINT else backend_endpoint = "https://dev.myapi.org"
Если вы забудете установить значение Backend_endpoint
Что может произойти для контейнера, который вы развернули в производстве?
В конечном итоге вы будете общаться с бэкэндом разработки, и вы можете не заметить его вообще!
Было бы лучше, чтобы приложение бросило сообщение об ошибке Ошибка: Backend_endpoint не определено
Анкет
Во -вторых, сохраните свою конфигурацию в чистоте. Удалите мертвые строки кода и будьте добры к разработчикам, оставив комментарии, если что -то неясно.:)
В -третьих, поддерживайте схему архитектуры. Используйте что -то вроде asciiflow.com Чтобы нарисовать простую схему компонентов вашего приложения, и добавьте ее к своему источнику.
Это поможет людям понять зависимости вашего приложения.
С тех пор, как я обнаружил этот инструмент, я был фанатом этого!
- Каждый может отредактировать схему, поскольку она не требует наличия исходного файла, или конкретное программное обеспечение
- Схемы быстро рисуют
- Вы можете добавить его в управление источником и отслеживать изменения
Как HumanItec может помочь с вашей точки зрения? Каковы основные преимущества?
Во -первых, переменные динамической среды: я упоминал выше, что для примера приложения: «В производстве», единственное изменение, которое будет сделано, меняется Backend_endpoint
значение от Localhost: 2000
к его доменному имени, как https://backend.endpoint.domain.org
Анкет
В прошлом мне всегда приходилось беспокоиться о значении переменной, такой как Backend_endpoint
Анкет Если доменное имя изменяется, мне пришлось сообщить об изменении значения в конфигурации развертывания. Поскольку фронт и бэкэнд всегда развернуты вместе, было бы здорово иметь возможность рассказать системе: «Развернуть бэкэнд, тогда, когда она готова принять подключения. Поместите значение текущей конечной точки в backend_endpoint
, тогда вы можете начать фронт ». HumanItec предоставляет удобную особенность для этого.
Во -вторых, управляемые услуги: вы можете создать базу данных непосредственно в HumanItec и динамически подключить к нему приложение с помощью функции, описанной выше.
В -третьих, отличный пользовательский интерфейс и легко откатываться от состояния до предыдущего развертывания. Я говорил выше о страхе что -то сломать. Разработчики в конце концов.:)
Даже с самой чистой архитектурой микросервисов вы можете иметь странные ошибки. Когда несколько модулей соединяются вместе, может случиться так, что коллега выдвигает проблематичное изменение для модуля, на который вы полагаетесь, но вы не знаете об этом.
С помощью HumanItec вы можете идентифицировать развертывания для всех подключенных модулей с небольшим количеством кликов, а также отказ от всей группы модулей в предыдущее состояние. Это делает его удобным для разработчиков рабочее место.
Спасибо, Антуан!
Интервью проводилось в письменной форме, и мы хотим поблагодарить Антуан за то, что он нашла время, чтобы ответить на вопросы.
У вас есть больше вопросов о переменных окружающей среды? Эксперты DevOps HumanITEC рады ответить на ваши вопросы во время Бесплатный вебинар !
Оригинал: «https://dev.to/humanitec_com/how-to-manage-environment-variables-282l»