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.
DevOps inženjeri koriste programiranje i skripting za:
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.
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 | bashVarijable 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 += 1Funkcije:
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 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}")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škeDa biste pokrenuli ovaj skript:
check_service.py.python3 check_service.py.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.
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."
fiLogovanje:
#!/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"
fiOvaj 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 0Da biste pokrenuli ovaj skript:
deploy_webapp.sh.chmod +x deploy_webapp.sh../deploy_webapp.sh.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.
git init: Inicijalizuje novi Git repozitorijum u trenutnom direktorijumu. bash git initgit clone <URL>: Klonira postojeći repozitorijum sa udaljenog servera. bash git clone https://github.com/octocat/Spoon-Knife.gitgit add <fajl> / git add .: Dodaje fajlove u staging area (priprema za commit). bash git add index.html git add .git commit -m "Poruka": Snima promene iz staging area u lokalni repozitorijum. bash git commit -m "Dodata početna HTML stranica"git status: Prikazuje status radnog direktorijuma i staging area. bash git statusgit log: Prikazuje istoriju commit-ova. bash git loggit push: Šalje lokalne commit-ove na udaljeni repozitorijum. bash git push origin maingit pull: Preuzima promene sa udaljenog repozitorijuma i spaja ih sa lokalnim. bash git pull origin maingit branch: Prikazuje listu grana ili kreira novu granu. bash git branch nova-funkcionalnostgit checkout <grana>: Prebacuje se na drugu granu. bash git checkout nova-funkcionalnostgit merge <grana>: Spaja promene iz jedne grane u trenutnu granu. bash git merge nova-funkcionalnostgit remote -v: Prikazuje konfigurisane udaljene repozitorijume. bash git remote -vPostoje različite strategije grananja koje timovi koriste za upravljanje razvojem:
master, develop) i kratkotrajnim granama (feature, release, hotfix). Složenija, ali pogodna za veće projekte sa definisanim ciklusima izdanja.main granu i kratkotrajne feature grane koje se spajaju u main putem pull requestova.production, staging).bash git clone https://github.com/vas_korisnik/vas_projekat.git cd vas_projekatbash git checkout -b moja-nova-funkcionalnostbash # Izmenite fajlove... git add . git commit -m "Dodata nova funkcionalnost X"bash git push origin moja-nova-funkcionalnostmoja-nova-funkcionalnost u main (ili develop).main grane: bash git checkout main git pull origin mainProgramiranje 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.
Autor: Manus AI Datum: 27. jul 2025.