Skip to main content

Environment Variables

Environment variables (muhit o'zgaruvchilari) - bu operatsion tizim darajasida saqlanadigan kalit-qiymat juftliklari bo'lib, dasturlar va jarayonlar tomonidan konfiguratsiya va ma'lumot almashish uchun ishlatiladi. DevOps da bu juda muhim mavzu.

Environment Variables Nima?

Asosiy Tushunchalar

Environment variables - bu tizim va dasturlar uchun global konfiguratsiya parametrlari:

  • Global scope: Barcha child process'lar uchun mavjud
  • Session-based: User session bilan bog'liq
  • Configuration: Dastur sozlamalari uchun
  • Security: Credentials va sensitive data uchun

Environment Variables Ko'rish

# Barcha environment variables
env # Barcha muhit o'zgaruvchilarini ko'rsatish
printenv # env bilan bir xil

# Ma'lum o'zgaruvchini ko'rish
echo $HOME # Home directory
echo $PATH # Executable files path'lari
echo $USER # Current user
echo $SHELL # Current shell

# printenv bilan
printenv HOME # $HOME qiymati
printenv PATH # $PATH qiymati

# set buyruqi (shell variables ham)
set # Barcha shell va environment variables

Asosiy Environment Variables

System Variables

# User-related
$USER # Foydalanuvchi nomi
$HOME # Home directory path
$SHELL # Default shell
$UID # User ID
$GROUPS # User groups

# System-related
$HOSTNAME # Computer nomi
$PWD # Current working directory
$OLDPWD # Previous directory
$PATH # Executable files path'lari
$LD_LIBRARY_PATH # Library files path'lari

# Terminal-related
$TERM # Terminal type
$COLUMNS # Terminal width
$LINES # Terminal height
$PS1 # Primary prompt
$PS2 # Secondary prompt

DevOps uchun Muhim Variables

# Editor settings
$EDITOR # Default text editor
$VISUAL # Visual editor

# Language and locale
$LANG # System language
$LC_ALL # Locale settings
$TZ # Timezone

# Development
$JAVA_HOME # Java installation path
$PYTHON_PATH # Python modules path
$NODE_PATH # Node.js modules path
$GOPATH # Go workspace path

# Container environments
$DOCKER_HOST # Docker daemon address
$KUBECONFIG # Kubernetes config file

Environment Variables O'rnatish

Temporary Variables (Vaqtinchalik)

# Current session uchun
export MYVAR="value" # Export qilish (child process'lar uchun)
MYVAR="value" # Faqat current shell uchun

# Inline usage
EDITOR=vim crontab -e # Faqat shu buyruq uchun

# Multiple variables
export VAR1="value1" VAR2="value2"

# Unset (o'chirish)
unset MYVAR # O'zgaruvchini o'chirish

Permanent Variables (Doimiy)

User-level (.bashrc, .profile)

# ~/.bashrc - bash-specific
echo 'export EDITOR=vim' >> ~/.bashrc
echo 'export JAVA_HOME=/usr/lib/jvm/java-11-openjdk' >> ~/.bashrc

# ~/.profile - shell-independent
echo 'export PATH=$PATH:/opt/custom/bin' >> ~/.profile

# ~/.bash_profile - bash login shells
echo 'export GOPATH=$HOME/go' >> ~/.bash_profile

# Changes ni apply qilish
source ~/.bashrc # yoki
. ~/.bashrc

System-level (/etc/environment)

# /etc/environment - system-wide environment
sudo vim /etc/environment

# Misol:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
JAVA_HOME="/usr/lib/jvm/java-11-openjdk"
EDITOR="vim"

System-level (/etc/profile.d/)

# Custom script yaratish
sudo vim /etc/profile.d/custom.sh

#!/bin/bash
export CUSTOM_APP_HOME="/opt/myapp"
export PATH="$PATH:$CUSTOM_APP_HOME/bin"

# Executable qilish
sudo chmod +x /etc/profile.d/custom.sh

PATH Variable (Eng Muhim)

PATH nima?

PATH - bu shell'ga executable fayllarni qayerda izlashni ko'rsatadigan directory'lar ro'yxati.

# PATH ni ko'rish
echo $PATH
# Natija: /usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin

# PATH ni parse qilish
echo $PATH | tr ':' '\n' # Har bir path yangi qatorda

# which buyruqi PATH'dan foydalanadi
which python3 # PATH'da python3 ni qidirish
which docker # PATH'da docker ni qidirish

PATH ga Qo'shish

# Temporary
export PATH=$PATH:/new/path

# Current directory qo'shish (xavfli!)
export PATH=$PATH:.

# Beginning ga qo'shish (priority yuqori)
export PATH=/new/path:$PATH

# Permanent (.bashrc da)
echo 'export PATH=$PATH:/opt/custom/bin' >> ~/.bashrc

DevOps Tools uchun PATH

# Docker
export PATH=$PATH:/usr/local/docker/bin

# Kubernetes
export PATH=$PATH:/usr/local/bin/kubectl

# Terraform
export PATH=$PATH:/opt/terraform

# Custom scripts
export PATH=$PATH:$HOME/scripts

# Node.js global packages
export PATH=$PATH:$HOME/.npm/bin

# Go binaries
export PATH=$PATH:$HOME/go/bin

DevOps uchun Environment Variables

Docker Environment

# Docker daemon
export DOCKER_HOST="tcp://docker-server:2376"
export DOCKER_TLS_VERIFY="1"
export DOCKER_CERT_PATH="/path/to/certs"

# Docker Compose
export COMPOSE_PROJECT_NAME="myproject"
export COMPOSE_FILE="docker-compose.yml"

# Dockerfile build args
docker build --build-arg API_KEY=$API_KEY .

Kubernetes Environment

# Kubeconfig
export KUBECONFIG=$HOME/.kube/config
export KUBECONFIG=$HOME/.kube/config1:$HOME/.kube/config2 # Multiple configs

# kubectl context
kubectl config use-context production
export KUBE_CONTEXT="production"

# Namespace
export KUBECTL_NAMESPACE="default"

CI/CD Environment

# Jenkins
export JENKINS_URL="https://jenkins.company.com"
export JENKINS_USER="admin"
export JENKINS_API_TOKEN="xxx"

# GitLab CI
export CI_COMMIT_SHA
export CI_COMMIT_REF_NAME
export CI_PROJECT_NAME

# GitHub Actions
export GITHUB_TOKEN
export GITHUB_REPOSITORY
export GITHUB_SHA

Application Configuration

# Database
export DB_HOST="localhost"
export DB_PORT="5432"
export DB_NAME="myapp"
export DB_USER="appuser"
export DB_PASSWORD="secret123" # Xavfli! Secret management ishlatish kerak

# Redis
export REDIS_URL="redis://localhost:6379"

# Application settings
export APP_ENV="production"
export LOG_LEVEL="info"
export DEBUG="false"

Cloud Providers

# AWS
export AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE"
export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
export AWS_DEFAULT_REGION="us-west-2"
export AWS_PROFILE="production"

# Google Cloud
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/service-account.json"
export GCLOUD_PROJECT="my-project-id"

# Azure
export AZURE_SUBSCRIPTION_ID="xxx"
export AZURE_TENANT_ID="xxx"
export AZURE_CLIENT_ID="xxx"
export AZURE_CLIENT_SECRET="xxx"

Advanced Environment Variable Techniques

Conditional Variables

# Default values
export DB_HOST=${DB_HOST:-localhost} # localhost if not set
export API_URL=${API_URL:="http://localhost:8080"} # set if empty

# Required variables
: ${REQUIRED_VAR:?"Error: REQUIRED_VAR is not set"}

# Conditional logic
if [ -z "$JAVA_HOME" ]; then
export JAVA_HOME="/usr/lib/jvm/default-java"
fi

Variable Substitution

# String manipulation
export VERSION="1.2.3"
export APP_NAME="myapp"
export FULL_NAME="${APP_NAME}-${VERSION}" # myapp-1.2.3

# Path manipulation
export CONFIG_DIR="${HOME}/.config/myapp"
export LOG_FILE="${CONFIG_DIR}/app.log"

# Upper/Lower case
export ENV_UPPER="${ENV,,}" # lowercase
export ENV_LOWER="${ENV^^}" # uppercase

Arrays in Environment

# Arrays (bash)
export SERVERS=("web1" "web2" "web3")
export ENVIRONMENTS=("dev" "staging" "prod")

# String with delimiters
export SERVER_LIST="web1,web2,web3"
export ENV_LIST="dev:staging:prod"

# Parsing
IFS=',' read -ra ADDR <<< "$SERVER_LIST"
for server in "${ADDR[@]}"; do
echo "Server: $server"
done

Security Best Practices

Sensitive Data

# HECH QACHON qilmang:
export PASSWORD="secret123" # History'da saqlanadi
echo $PASSWORD > file.txt # File'da saqlanadi

# To'g'ri usullar:
# 1. Secret management systems
export DB_PASSWORD=$(vault kv get -field=password secret/db)

# 2. Environment files (.env)
# .env file:
# DB_PASSWORD=secret123
source .env

# 3. Interactive input
read -s -p "Password: " PASSWORD
export PASSWORD

# 4. External key management
export PASSWORD=$(aws ssm get-parameter --name "/app/db/password" --with-decryption --query Parameter.Value --output text)

Environment Isolation

# Development
export APP_ENV="development"
export DEBUG="true"
export LOG_LEVEL="debug"

# Production
export APP_ENV="production"
export DEBUG="false"
export LOG_LEVEL="error"

# Environment-specific configs
case $APP_ENV in
"development")
export DB_HOST="localhost"
;;
"production")
export DB_HOST="prod-db.company.com"
;;
esac

Configuration Management

.env Files

# .env file format
# Database configuration
DB_HOST=localhost
DB_PORT=5432
DB_NAME=myapp
DB_USER=appuser

# Application settings
APP_ENV=development
LOG_LEVEL=debug
API_KEY=your-api-key-here

# Loading .env file
set -a # Automatically export
source .env
set +a # Stop auto-export

Docker .env Usage

# docker-compose.yml
version: '3.8'
services:
app:
image: myapp:latest
env_file:
- .env
environment:
- NODE_ENV=${APP_ENV}
- DATABASE_URL=postgres://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}

Kubernetes ConfigMaps va Secrets

# Environment variables from ConfigMap
kubectl create configmap app-config \
--from-literal=APP_ENV=production \
--from-literal=LOG_LEVEL=info

# Environment variables from Secret
kubectl create secret generic app-secrets \
--from-literal=DB_PASSWORD=secret123 \
--from-literal=API_KEY=your-api-key

# Pod specification
apiVersion: v1
kind: Pod
spec:
containers:
- name: app
envFrom:
- configMapRef:
name: app-config
- secretRef:
name: app-secrets

Troubleshooting

Debug Environment Variables

# Current process environment
cat /proc/$$/environ | tr '\0' '\n'

# Check specific variable
env | grep -i path
printenv | grep -i java

# Variable scope test
bash -c 'echo $MYVAR' # New shell test
sh -c 'echo $MYVAR' # Different shell test

# Export verification
declare -p MYVAR # Variable attributes
export -p | grep MYVAR # Exported variables

Common Issues

# Issue 1: Variable not exported
MYVAR="value" # Not exported
bash -c 'echo $MYVAR' # Empty!

# Solution:
export MYVAR="value" # Export qilish

# Issue 2: Path conflicts
which python # Wrong python version
echo $PATH # Check path order

# Issue 3: Quotes problems
export PATH=$PATH:"/path with spaces" # To'g'ri
export PATH=$PATH:/path with spaces # Noto'g'ri

# Issue 4: Variable persistence
export MYVAR="value" # Faqat current session
# .bashrc ga qo'shish kerak permanent uchun

Amaliy DevOps Stsenarilar

1. Development Environment Setup

#!/bin/bash
# dev-setup.sh

# Base environment
export EDITOR="code"
export BROWSER="firefox"

# Development tools
export JAVA_HOME="/usr/lib/jvm/java-11-openjdk"
export MAVEN_HOME="/opt/maven"
export GRADLE_HOME="/opt/gradle"
export NODE_VERSION="16"

# Cloud tools
export AWS_PROFILE="development"
export KUBECONFIG="$HOME/.kube/dev-config"

# Application
export APP_ENV="development"
export LOG_LEVEL="debug"
export DB_HOST="localhost"

# Update PATH
export PATH="$JAVA_HOME/bin:$MAVEN_HOME/bin:$GRADLE_HOME/bin:$PATH"
export PATH="$HOME/.nvm/versions/node/v$NODE_VERSION/bin:$PATH"

echo "Development environment configured!"

2. Production Deployment Script

#!/bin/bash
# deploy-prod.sh

# Production safety checks
if [ "$APP_ENV" != "production" ]; then
echo "Error: APP_ENV must be 'production'"
exit 1
fi

if [ -z "$DB_PASSWORD" ]; then
echo "Error: DB_PASSWORD is required"
exit 1
fi

# Production environment
export DEBUG="false"
export LOG_LEVEL="error"
export CACHE_ENABLED="true"

# Deploy application
docker-compose -f docker-compose.prod.yml up -d

echo "Production deployment completed!"

3. Multi-Environment Manager

#!/bin/bash
# env-manager.sh

function load_env() {
local env_name=$1

case $env_name in
"dev")
export APP_ENV="development"
export DB_HOST="localhost"
export LOG_LEVEL="debug"
export KUBECONFIG="$HOME/.kube/dev-config"
;;
"staging")
export APP_ENV="staging"
export DB_HOST="staging-db.company.com"
export LOG_LEVEL="info"
export KUBECONFIG="$HOME/.kube/staging-config"
;;
"prod")
export APP_ENV="production"
export DB_HOST="prod-db.company.com"
export LOG_LEVEL="error"
export KUBECONFIG="$HOME/.kube/prod-config"
;;
*)
echo "Unknown environment: $env_name"
return 1
;;
esac

echo "Environment '$env_name' loaded successfully!"
echo "APP_ENV: $APP_ENV"
echo "DB_HOST: $DB_HOST"
echo "KUBECONFIG: $KUBECONFIG"
}

# Usage: load_env dev|staging|prod

Bu tutorial environment variables bo'yicha DevOps engineers uchun zarur bo'lgan barcha asosiy ma'lumotlarni qamrab oladi. Environment variables ni to'g'ri boshqarish production tizimlarning xavfsizligi va ishonchliligi uchun juda muhimdir.