Tutorijal: Programiranje i skripting

Uvod u Programiranje i Skripting za DevOps inženjere

Uloga DevOps inženjera se značajno razlikuje od tradicionalnih IT uloga po tome što zahteva snažno razumevanje i primenu programiranja i skriptinga. Automatizacija je srž DevOps filozofije, a programski jezici i skripting su alati koji omogućavaju tu automatizaciju. Bilo da se radi o pisanju skripti za automatizaciju infrastrukture, kreiranju CI/CD pipeline-a, razvoju alata za monitoring ili integraciji različitih sistema, poznavanje programiranja je neophodno. Ovaj tutorijal će vas provesti kroz ključne aspekte programiranja i skriptinga relevantne za DevOps, sa fokusom na Python i Bash, kao i na Git za kontrolu verzija.

Zašto su programiranje i skripting ključni u DevOps-u?

DevOps inženjeri koriste programiranje i skripting za:

Python - Jezik izbora za DevOps

Python je postao de facto standardni programski jezik u DevOps svetu zbog svoje jednostavnosti, čitljivosti i bogatog ekosistema biblioteka. Koristi se za automatizaciju, razvoj web aplikacija, analizu podataka, mašinsko učenje i još mnogo toga.

Osnove Pythona

Instalacija Pythona:

Python je često preinstaliran na Linux sistemima. Preporučuje se korišćenje pyenv ili conda za upravljanje verzijama Pythona.

# Provera verzije Pythona
python3 --version

# Instalacija pyenv (primer)
curl https://pyenv.run | bash

Varijable i tipovi podataka:

ime = "Alice"
godine = 30
visina = 1.75
je_aktivan = True

print(f"Ime: {ime}, Godine: {godine}, Visina: {visina}, Aktivan: {je_aktivan}")

Uslovi (if/else):

broj = 15

if broj > 10:
    print("Broj je veći od 10.")
elif broj == 10:
    print("Broj je jednak 10.")
else:
    print("Broj je manji od 10.")

Petlje (for/while):

# For petlja
voce = ["jabuka", "banana", "trešnja"]
for v in voce:
    print(v)

# While petlja
brojac = 0
while brojac < 5:
    print(f"Brojač: {brojac}")
    brojac += 1

Funkcije:

def pozdrav(ime):
    return f"Zdravo, {ime}!"

poruka = pozdrav("Bob")
print(poruka)

Liste, Torke, Rečnici, Skupovi:

# Lista (mutable, ordered)
lista_brojeva = [1, 2, 3, 4, 5]
lista_brojeva.append(6)
print(lista_brojeva)

# Torka (immutable, ordered)
torka_boja = ("crvena", "zelena", "plava")
print(torka_boja)

# Rečnik (mutable, unordered, key-value pairs)
korisnik = {"ime": "Ana", "godine": 25, "grad": "Beograd"}
print(korisnik["ime"])
korisnik["grad"] = "Novi Sad"
print(korisnik)

# Skup (mutable, unordered, unique elements)
skup_brojeva = {1, 2, 3, 2, 1}
print(skup_brojeva)

Python za automatizaciju sistema

Python ima bogate biblioteke za interakciju sa operativnim sistemom, fajl sistemom, mrežom i eksternim procesima.

Rad sa fajl sistemom (os, shutil, pathlib):

import os
import shutil
from pathlib import Path

# Kreiranje direktorijuma
os.makedirs("moj_direktorijum", exist_ok=True)

# Kreiranje fajla i pisanje
with open("moj_direktorijum/test.txt", "w") as f:
    f.write("Ovo je test fajl.\n")

# Čitanje fajla
with open("moj_direktorijum/test.txt", "r") as f:
    sadrzaj = f.read()
    print(sadrzaj)

# Kopiranje fajla
shutil.copy("moj_direktorijum/test.txt", "moj_direktorijum/test_kopija.txt")

# Listanje sadržaja direktorijuma (pathlib)
p = Path("moj_direktorijum")
for item in p.iterdir():
    print(item)

# Brisanje fajla
os.remove("moj_direktorijum/test_kopija.txt")

# Brisanje direktorijuma (praznog)
os.rmdir("moj_direktorijum")

Izvršavanje shell komandi (subprocess):

import subprocess

# Izvršavanje komande i hvatanje izlaza
result = subprocess.run(["ls", "-l"], capture_output=True, text=True)
print(result.stdout)

# Izvršavanje komande sa shell=True (oprezno!)
# result = subprocess.run("ls -l | grep .txt", shell=True, capture_output=True, text=True)
# print(result.stdout)

# Izvršavanje komande i provera statusa
try:
    subprocess.run(["non_existent_command"], check=True)
except subprocess.CalledProcessError as e:
    print(f"Komanda nije uspela: {e}")

Praktičan primer: Python skripta za praćenje servisa

Ovaj skript će proveriti status određenog servisa na Linuxu i poslati obaveštenje ako servis nije aktivan.

import subprocess
import sys

def check_service_status(service_name):
    try:
        # Provera statusa servisa koristeći systemctl
        result = subprocess.run(
            ["systemctl", "is-active", service_name],
            capture_output=True,
            text=True,
            check=True
        )
        if "active" in result.stdout.strip():
            print(f"Servis '{service_name}' je aktivan.")
            return True
        else:
            print(f"Servis '{service_name}' NIJE aktivan. Status: {result.stdout.strip()}")
            return False
    except subprocess.CalledProcessError as e:
        print(f"Greška prilikom provere servisa '{service_name}': {e.stderr.strip()}")
        return False
    except FileNotFoundError:
        print("Komanda 'systemctl' nije pronađena. Proverite da li je systemd instaliran.")
        return False

def send_notification(message):
    # Ovde možete implementirati slanje obaveštenja putem emaila, Slacka, itd.
    # Za demonstraciju, samo ćemo ispisati poruku
    print(f"[OBAVEŠTENJE]: {message}")

if __name__ == "__main__":
    service = "nginx" # Promenite ovo na servis koji želite da pratite

    if not check_service_status(service):
        send_notification(f"Upozorenje: Servis '{service}' je neaktivan!")
        # Pokušaj restartovanja servisa (opciono)
        # try:
        #     subprocess.run(["sudo", "systemctl", "restart", service], check=True)
        #     print(f"Pokušaj restartovanja servisa '{service}'.")
        # except subprocess.CalledProcessError as e:
        #     print(f"Greška prilikom restartovanja servisa '{service}': {e.stderr.strip()}")
        sys.exit(1) # Izlaz sa greškom
    else:
        sys.exit(0) # Izlaz bez greške

Da biste pokrenuli ovaj skript:

  1. Sačuvajte ga kao check_service.py.
  2. Pokrenite ga: python3 check_service.py.

Bash skripting

Bash skripting je neophodan za automatizaciju zadataka direktno na Linux komandnoj liniji. Iako Python nudi više fleksibilnosti, Bash je često brži i jednostavniji za rutinske operacije i manipulaciju fajlovima.

Osnove Bash skriptinga (ponavljanje i proširenje)

Kao što je spomenuto u tutorijalu za Linux, bash skripta počinje sa shebang linijom #!/bin/bash.

Ulazni argumenti:

#!/bin/bash

echo "Prvi argument: $1"
echo "Drugi argument: $2"
echo "Svi argumenti: $@"
echo "Broj argumenata: $#"

Provera statusa izvršavanja komande:

Varijabla $? sadrži izlazni status poslednje izvršene komande (0 za uspeh, različito od 0 za grešku).

#!/bin/bash

ls /non_existent_directory
if [ $? -ne 0 ]; then
  echo "Komanda 'ls' nije uspela."
fi

Logovanje:

#!/bin/bash

LOG_FILE="/var/log/moj_skript.log"

echo "$(date): Skripta je pokrenuta." | tee -a "$LOG_FILE"

# Neka operacija
echo "$(date): Izvršavam neku operaciju..." | tee -a "$LOG_FILE"

# Provera uspeha operacije
if [ $? -eq 0 ]; then
  echo "$(date): Operacija uspešna." | tee -a "$LOG_FILE"
else
  echo "$(date): Operacija neuspešna!" | tee -a "$LOG_FILE"
fi

Praktičan primer: Skripta za deployment web aplikacije

Ovaj skript simulira jednostavan deployment web aplikacije, uključujući preuzimanje koda, instalaciju zavisnosti i restart servisa.

#!/bin/bash

APP_DIR="/var/www/html/my_webapp"
GIT_REPO="https://github.com/your_user/your_webapp.git" # Promenite ovo
SERVICE_NAME="nginx" # Promenite ako koristite drugi web server

LOG_FILE="/var/log/webapp_deploy.log"

# Funkcija za logovanje
log_message() {
  echo "$(date +'%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}

log_message "Počinjem deployment web aplikacije."

# Provera da li direktorijum postoji, ako ne, kloniraj repo
if [ ! -d "$APP_DIR" ]; then
  log_message "Kloniram repozitorijum: $GIT_REPO"
  git clone "$GIT_REPO" "$APP_DIR"
  if [ $? -ne 0 ]; then
    log_message "Greška prilikom kloniranja repozitorijuma. Izlazim."
    exit 1
  fi
else
  log_message "Direktorijum aplikacije već postoji. Ažuriram kod."
  cd "$APP_DIR" || { log_message "Ne mogu da uđem u direktorijum $APP_DIR. Izlazim."; exit 1; }
  git pull
  if [ $? -ne 0 ]; then
    log_message "Greška prilikom ažuriranja koda. Izlazim."
    exit 1
  fi
fi

# Instalacija zavisnosti (primer za Node.js, prilagodite za vašu tehnologiju)
log_message "Instaliram zavisnosti..."
# cd "$APP_DIR" # Već smo u direktorijumu ako je postojao
# npm install # Primer komande za instalaciju zavisnosti
# if [ $? -ne 0 ]; then
#   log_message "Greška prilikom instalacije zavisnosti. Izlazim."
#   exit 1
# fi

# Restart web servisa
log_message "Restartujem servis: $SERVICE_NAME"
sudo systemctl restart "$SERVICE_NAME"
if [ $? -ne 0 ]; then
  log_message "Greška prilikom restartovanja servisa $SERVICE_NAME. Proverite logove."
  exit 1
fi

log_message "Deployment uspešno završen."
exit 0

Da biste pokrenuli ovaj skript:

  1. Sačuvajte ga kao deploy_webapp.sh.
  2. Dajte mu dozvolu za izvršavanje: chmod +x deploy_webapp.sh.
  3. Pokrenite ga: ./deploy_webapp.sh.

Git i kontrola verzija

Git je distribuirani sistem za kontrolu verzija koji je postao standard u razvoju softvera. Omogućava timovima da efikasno sarađuju na kodu, prate promene i upravljaju različitim verzijama projekta.

Osnovne Git komande

Gitflow i druge strategije grananja

Postoje različite strategije grananja koje timovi koriste za upravljanje razvojem:

Praktičan primer: Radni tok sa Git-om

  1. Kloniranje repozitorijuma: bash git clone https://github.com/vas_korisnik/vas_projekat.git cd vas_projekat
  2. Kreiranje nove grane za funkcionalnost: bash git checkout -b moja-nova-funkcionalnost
  3. Izmene koda i commit-ovanje: bash # Izmenite fajlove... git add . git commit -m "Dodata nova funkcionalnost X"
  4. Push grane na udaljeni repozitorijum: bash git push origin moja-nova-funkcionalnost
  5. Kreiranje Pull Requesta (ili Merge Requesta): Na GitHubu/GitLabu, kreirajte Pull Request iz moja-nova-funkcionalnost u main (ili develop).
  6. Pregled koda i spajanje: Nakon pregleda i odobrenja, spojite Pull Request.
  7. Ažuriranje lokalne main grane: bash git checkout main git pull origin main

Zaključak

Programiranje i skripting su temelj DevOps-a. Ovladavanje Pythonom i Bashom, uz duboko razumevanje Git-a, omogućiće vam da efikasno automatizujete zadatke, upravljate infrastrukturom i sarađujete sa timom. Kontinuirano vežbanje i primena ovih veština u realnim projektima su ključni za vaš razvoj kao DevOps inženjera.

Reference


Autor: Manus AI Datum: 27. jul 2025.