Как сохранить переменные окружения для использования в разных сессиях и серверах?

«Как сохранить переменные окружения для использования в разных сессиях и серверах?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps переменные окружения — ключевой способ конфигурации приложений. Их постоянное хранение и управление должно быть безопасным и воспроизводимым.

1. Файлы в домашнем каталоге (для пользовательских настроек):

  • ~/.bashrc, ~/.zshrc — выполняются при запуске интерактивной оболочки.
    # Добавить в ~/.bashrc
    export EDITOR=vim
    export PATH="$PATH:$HOME/bin"
  • ~/.profile или ~/.bash_profile — выполняются при логине. После редактирования выполните source ~/.bashrc.

2. Системные файлы конфигурации (для глобальных настроек):

  • /etc/environment — системные переменные (только KEY=value, без export).
  • /etc/profile.d/ — каталог для скриптов, выполняемых при входе всех пользователей. Создайте файл myapp.sh:
    # /etc/profile.d/myapp.sh
    export APP_HOME=/opt/myapp

3. Файлы .env (для проектов) — НЕ коммитить в Git!:

# .env файл
DB_HOST=localhost
DB_PORT=5432
SECRET_KEY=$(openssl rand -hex 32)  # Генерация на этапе деплоя

Загрузить в сессию: set -a; source .env; set +a или использовать инструменты вроде direnv.

4. Использование секретов и внешних хранилищ (Production-подход):

  • HashiCorp Vault:
    # Получение секрета из Vault
    export DB_PASSWORD=$(vault kv get -field=password secret/myapp/db)
  • Облачные хранилища (AWS SSM Parameter Store, GCP Secret Manager):
    # AWS CLI
    export API_KEY=$(aws ssm get-parameter --name "/prod/api-key" --with-decryption --query "Parameter.Value" --output text)
  • Orchestrator secrets (Docker Swarm, Kubernetes):
    # Kubernetes Secret, смонтированный как env
    env:
      - name: PASSWORD
        valueFrom:
          secretKeyRef:
            name: app-secret
            key: db-password

5. Инфраструктура как код (IaC): В Terraform или CloudFormation переменные определяются в конфигурации и передаются в инстансы через user-data или системы управления.

Рекомендация: Никогда не храните секреты (пароли, ключи) в plain text в файлах, которые попадают в репозиторий. Используйте dedicated secret management tools.