Teorija – Modul 24 – Automatizacija mreža
Napomena: svaka tema u ovom dokumentu sadrži sedam elemenata: (1) jednostavno objašnjenje, (2) stručno objašnjenje, (3) primer iz svakodnevnog života, (4) primer iz poslovnog IT okruženja, (5) praktičnu vežbu ili napomenu, (6) najčešće greške, (7) pitanje za proveru znanja.
Dozvoljena upotreba: svi primeri su namenjeni isključivo uređajima koje administrirate ili za koje imate pisano ovlašćenje.
Tema 1 – Zašto automatizacija
1. Jednostavno objašnjenje
Kada isti posao treba uraditi na 50 uređaja, ručni rad je spor i sklon greškama. Skripta uradi isti posao za minut, svaki put na isti način.
2. Stručno objašnjenje
Automatizacija mreže je upotreba programa (skripti, alata poput Ansible-a, API-ja) za konfigurisanje, proveru i održavanje mrežnih uređaja umesto ručnog kucanja komandi. Koristi:
- Brzina i skalabilnost — ista izmena na stotinama uređaja za nekoliko minuta.
- Konzistentnost — svaki uređaj dobija identičnu konfiguraciju iz istog izvora; nema „zaboravljenog" koraka.
- Manje ljudskih grešaka — najveći deo prekida u mrežama izazivaju ručne izmene.
- Dokumentovanost i ponovljivost — skripta ili playbook je istovremeno i dokumentacija postupka; čuva se u Git-u (Modul 23).
- Oslobađanje vremena za projektovanje i rešavanje problema.
Rizik: greška u automatizaciji se takođe širi brzo — pogrešna komanda poslata na sve uređaje može oboriti celu mrežu za nekoliko sekundi. Zato automatizacija zahteva testiranje, postepeno uvođenje i jasna ovlašćenja (Tema 15). Pristup u kome se mrežom upravlja kao softverom (verzionisanje, testiranje, pregled izmena) naziva se NetDevOps ili Infrastructure as Code.
3. Primer iz svakodnevnog života
Mašina za pranje sudova: isti program svaki put, bez obzira na to ko je uključi. Ali ako greškom izaberete pogrešan program, pokvariće se ceo teret posuđa odjednom — ne samo jedan tanjir.
4. Primer iz poslovnog IT okruženja
Firma sa 120 svičeva treba da promeni adresu NTP i Syslog servera. Ručno: dva dana rada i sigurno bar nekoliko propuštenih uređaja. Ansible playbook: 10 minuta, uz izveštaj koji tačno pokazuje na kojim uređajima je izmena primenjena.
5. Praktična vežba / napomena
Zapišite tri posla koja ste u ovom kursu radili ručno na više uređaja (npr. hostname, ntp server, copy running-config tftp). To su tipični kandidati za automatizaciju.
6. Najčešće greške
- Automatizovanje procesa koji ni ručno nije jasno definisan.
- Pokretanje nove skripte odmah nad svim produkcionim uređajima.
- Uverenje da automatizacija zamenjuje razumevanje mreže — skripta ne zna šta je ispravno, već samo radi ono što joj je rečeno.
7. Pitanje za proveru znanja
P: Navedite dve koristi i jedan rizik automatizacije mreže. O: Koristi: brzina/skalabilnost i konzistentnost (manje ljudskih grešaka). Rizik: greška u automatizaciji se u trenutku širi na veliki broj uređaja.
Tema 2 – Osnove Python-a za mreže
1. Jednostavno objašnjenje
Python je programski jezik jednostavne sintakse koji je postao standard za mrežnu automatizaciju. Za početak su dovoljni: promenljive, liste, rečnici, petlje, funkcije i obrada grešaka.
2. Stručno objašnjenje
Osnovni elementi na primeru spiska uređaja:
uredjaji = [
{"ime": "VYOS1", "ip": "192.168.56.11"},
{"ime": "VYOS2", "ip": "192.168.56.12"},
]
def opis(uredjaj):
return f"{uredjaj['ime']} ({uredjaj['ip']})"
for uredjaj in uredjaji:
try:
print("Obrađujem", opis(uredjaj))
except KeyError as greska:
print("Nedostaje podatak:", greska)
- Promenljive i tipovi:
str(tekst),int(ceo broj),bool(True/False). - Lista (
[...]) — uređeni niz, npr. spisak uređaja ili komandi. - Rečnik (
{ključ: vrednost}) — opis jednog uređaja (ime, adresa, tip). - Petlja
for— isti postupak za svaki uređaj;if— odluka. - Funkcija (
def) — imenovan, ponovo upotrebljiv blok koda. try/except— obrada grešaka, tako da nedostupan uređaj ne prekine obradu ostalih.- f-string (
f"...{promenljiva}...") — ubacivanje vrednosti u tekst. - Uvlačenje (4 razmaka) određuje blokove koda — nije samo stil, već deo sintakse.
Biblioteke se instaliraju komandom pip unutar virtuelnog okruženja (python3 -m venv), odvojeno od sistemskog Python-a, da različiti projekti ne bi menjali biblioteke jedni drugima.
3. Primer iz svakodnevnog života
Recept za kolače: spisak sastojaka (lista), količina za svaki sastojak (rečnik), „mešati dok ne postane glatko" (petlja), „ako je testo retko, dodati brašno" (uslov).
4. Primer iz poslovnog IT okruženja
Administrator dobija Excel tabelu sa 80 svičeva, izvozi je u CSV i Python skriptom za svaki red generiše konfiguraciju upravljačkog interfejsa — bez ijedne greške u kucanju adresa.
5. Praktična vežba / napomena
Na Ubuntu Server VM-u pokrenite python3, otkucajte gornji primer (redove sa def i for završite praznim redom) i dodajte treći uređaj u listu.
6. Najčešće greške
- Mešanje razmaka i tabova pri uvlačenju (
IndentationError). - Instaliranje biblioteka u sistemski Python umesto u virtuelno okruženje.
- Izostavljanje
try/except— prvi nedostupan uređaj prekida celu skriptu.
7. Pitanje za proveru znanja
P: Koji Python tip podataka je najpogodniji za opis jednog uređaja (ime, adresa, tip), a koji za spisak uređaja? O: Rečnik za opis jednog uređaja, lista (rečnika) za spisak uređaja.
Tema 3 – Rad sa tekstualnim fajlovima
1. Jednostavno objašnjenje
Skripte čitaju podatke iz fajlova (spisak uređaja, komande) i upisuju rezultate u fajlove (izlazi komandi, backup-i, izveštaji).
2. Stručno objašnjenje
from pathlib import Path
folder = Path("izlazi")
folder.mkdir(exist_ok=True)
with open("komande.txt", encoding="utf-8") as fajl:
komande = [red.strip() for red in fajl if red.strip() and not red.startswith("#")]
(folder / "VYOS1_show_version.txt").write_text("...izlaz komande...", encoding="utf-8")
with open(...)automatski zatvara fajl i kada se desi greška; režimi"r"(čitanje),"w"(upis, briše postojeći sadržaj),"a"(dodavanje na kraj).pathlib.Pathspaja putanje nezavisno od operativnog sistema (folder / "ime.txt").- Uvek navoditi
encoding="utf-8"(srpski znakovi, izlazi uređaja).
Izvlačenje podataka iz izlaza komande („screen scraping"):
izlaz = "Version: VyOS 1.5-rolling\nRelease train: current"
for red in izlaz.splitlines():
if red.startswith("Version:"):
verzija = red.split(":", 1)[1].strip()
print(verzija)
Za složenije obrasce koristi se modul re (regularni izrazi), npr. re.search(r"Version (\S+),", izlaz) za verziju Cisco IOS-a. Za tabelarne podatke pogodan je modul csv.
3. Primer iz svakodnevnog života
Rukovanje papirnim dosijeom: otvorite fasciklu, pročitate šta vam treba, upišete novu belešku i vratite fasciklu na mesto — with je pravilo „fascikla se uvek vraća na mesto".
4. Primer iz poslovnog IT okruženja
Skripta čita uredjaji.txt sa 200 adresa, sa svakog uređaja prikuplja verziju softvera i upisuje CSV izveštaj koji se direktno uvozi u evidenciju opreme (Modul 23).
5. Praktična vežba / napomena
Napravite fajl komande.txt sa tri show komande i jednim komentarom koji počinje sa #, i proverite da gornji kod učitava samo komande.
6. Najčešće greške
- Otvaranje postojećeg fajla u režimu
"w"i nenamerno brisanje sadržaja. - Zaboravljen
strip()— znak za novi red postaje deo komande. - Parsiranje izlaza koje se oslanja na tačan broj razmaka — puca posle nadogradnje softvera uređaja.
7. Pitanje za proveru znanja
P: Zašto se za rad sa fajlovima koristi konstrukcija with open(...)? O: Zato što automatski zatvara fajl na kraju bloka, čak i kada se desi greška.
Tema 4 – JSON
1. Jednostavno objašnjenje
JSON je tekstualni format za strukturisane podatke — rečnike i liste zapisane tako da ih razume svaki program i svaki programski jezik.
2. Stručno objašnjenje
JSON (JavaScript Object Notation, RFC 8259) je standardni format razmene podataka u REST API-jima i mnogim alatima. Tipovi: objekat {"kljuc": vrednost}, niz [...], string (u dvostrukim navodnicima), broj, true/false, null. U Python-u:
import json
rezultat = {"uredjaj": "VYOS1", "dostupan": True, "portovi": [22, 443]}
tekst = json.dumps(rezultat, indent=2)
podaci = json.loads(tekst)
print(podaci["portovi"][0])
with open("rezultat.json", "w", encoding="utf-8") as f:
json.dump(rezultat, f, indent=2, ensure_ascii=False)
dumps/loads rade sa tekstom, a dump/load sa fajlovima. Python True postaje JSON true, a None postaje null.
3. Primer iz svakodnevnog života
Obrazac sa jasno imenovanim poljima („Ime:", „Adresa:") — svako ko ga dobije zna gde da nađe koji podatak, bez obzira na to ko ga je popunio.
4. Primer iz poslovnog IT okruženja
Monitoring sistem preko API-ja vraća listu uređaja u JSON formatu; skripta bira one sa statusom "down" i automatski otvara tikete.
5. Praktična vežba / napomena
Pokrenite gornji primer i otvorite rezultat.json — uporedite kako izgledaju True i False u Python-u i u JSON-u.
6. Najčešće greške
- Jednostruki navodnici u JSON-u (
{'a': 1}nije ispravan JSON). - Zarez posle poslednjeg elementa (
[1, 2,]) — nije dozvoljen. - Mešanje
json.dumps(vraća tekst) ijson.dump(piše u fajl).
7. Pitanje za proveru znanja
P: Kako se Python vrednost None zapisuje u JSON-u? O: Kao null.
Tema 5 – YAML
1. Jednostavno objašnjenje
YAML je format za podatke koji ljudi lako čitaju i pišu, jer koristi uvlačenje umesto zagrada. Ansible i mnoge skripte čuvaju spisak uređaja i podešavanja u YAML-u.
2. Stručno objašnjenje
YAML (YAML Ain't Markup Language) opisuje iste strukture kao JSON — rečnike, liste i vrednosti — ali čitljivije. Pravila: struktura se određuje uvlačenjem razmacima (tabovi nisu dozvoljeni), kljuc: vrednost je rečnik, - stavka je element liste, # počinje komentar, a fajl često počinje sa ---.
---
uredjaji:
- ime: VYOS1
ip: 192.168.56.11
tip: vyos
- ime: VYOS2
ip: 192.168.56.12
tip: vyos
U Python-u (biblioteka PyYAML):
import yaml
with open("uredjaji.yaml", encoding="utf-8") as f:
podaci = yaml.safe_load(f)
for u in podaci["uredjaji"]:
print(u["ime"], u["ip"])
yaml.safe_load učitava samo osnovne tipove podataka i treba ga uvek koristiti umesto yaml.load, jer nebezbedno učitavanje može izvršiti proizvoljan kod iz fajla. Zamka: neke vrednosti YAML sam tumači — yes, no, on, off mogu postati True/False, a 08 ili verzija 1.10 mogu postati brojevi; takve vrednosti se stavljaju u navodnike.
3. Primer iz svakodnevnog života
Sadržaj knjige sa poglavljima i potpoglavljima uvučenim ispod njih — struktura se vidi na prvi pogled.
4. Primer iz poslovnog IT okruženja
Tim drži „izvor istine" o mreži u YAML fajlovima u Git-u (uređaji, VLAN-ovi, adrese). Izmena VLAN-a počinje izmenom YAML-a i pregledom u Git-u, a tek zatim je Ansible primenjuje na uređaje.
5. Praktična vežba / napomena
Prepišite gornji YAML primer u JSON (ručno) i uočite da je sadržaj isti — razlikuje se samo zapis.
6. Najčešće greške
- Tab umesto razmaka ili neujednačeno uvlačenje.
- Upotreba
yaml.loadbez bezbednog učitavača. - Nenavedeni navodnici oko vrednosti kao što su
no,onili0800.
7. Pitanje za proveru znanja
P: Zašto se za učitavanje YAML-a koristi yaml.safe_load? O: Zato što učitava samo osnovne tipove podataka i ne može da izvrši kod iz fajla, za razliku od nebezbednog učitavanja.
Tema 6 – SSH automatizacija i Paramiko
1. Jednostavno objašnjenje
Većina mrežnih uređaja nema API, ali ima SSH. Skripta može da se prijavi preko SSH-a kao administrator, pošalje komandu, sačeka odgovor i pročita ga.
2. Stručno objašnjenje
SSH automatizacija oponaša čoveka za terminalom (screen scraping): otvara SSH sesiju, šalje tekst komande i čita tekst odgovora. Izazovi: prepoznavanje prompta (kada je uređaj završio odgovor), paging (--More-- — mora se isključiti, npr. terminal length 0), prelazak između režima (enable, configure terminal), vremenska ograničenja (timeout) za spore komande, i nestrukturisan izlaz koji treba parsirati.
Paramiko je Python biblioteka koja implementira SSH protokol na niskom nivou — daje SSH vezu i kanal, ali ne zna ništa o mrežnim uređajima:
import paramiko
klijent = paramiko.SSHClient()
klijent.load_system_host_keys()
klijent.connect("192.168.56.20", username="admin", password=lozinka)
stdin, stdout, stderr = klijent.exec_command("ip -brief address")
print(stdout.read().decode())
klijent.close()
Ovo radi na Linux serveru, ali za mrežne uređaje (prompt, režimi, paging) programer bi sve morao sam da reši. Zato se za mrežnu opremu koristi Netmiko, izgrađen iznad Paramiko-a (Tema 7). Paramiko koriste i Ansible (network_cli veza) i mnogi drugi alati.
3. Primer iz svakodnevnog života
Paramiko je kao telefonska linija — omogućava razgovor, ali ne zna jezik sagovornika. Netmiko je prevodilac koji zna jezik svakog proizvođača i kada je sagovornik završio rečenicu.
4. Primer iz poslovnog IT okruženja
Stariji svičevi u fabrici nemaju API ni podršku za NETCONF. SSH automatizacija je jedini način da se sa njih automatski prikupe konfiguracije.
5. Praktična vežba / napomena
Setite se komande terminal length 0 iz Cisco IOS-a. Zašto je skripta mora poslati pre komande show running-config?
6. Najčešće greške
- Korišćenje Paramiko-a direktno za mrežne uređaje i „ručno" rešavanje prompta i paging-a.
- Isključivanje provere SSH ključa hosta (
AutoAddPolicy) u produkciji bez razmišljanja — gubi se zaštita od lažnog servera (MITM, Modul 16). - Prekratak timeout za komande sa dugim izlazom.
7. Pitanje za proveru znanja
P: Kakav je odnos između Paramiko-a i Netmiko-a? O: Paramiko je niskonivoska SSH biblioteka; Netmiko je izgrađen iznad nje i dodaje logiku za mrežne uređaje (prompt, režimi, paging, podrška za različite proizvođače).
Tema 7 – Netmiko
1. Jednostavno objašnjenje
Netmiko je Python biblioteka koja olakšava SSH rad sa mrežnim uređajima: jednom linijom se povežete, drugom pošaljete show komandu, trećom pošaljete konfiguraciju.
2. Stručno objašnjenje
Netmiko podržava stotine platformi preko parametra device_type (cisco_ios, cisco_nxos, juniper_junos, arista_eos, mikrotik_routeros, vyos, linux...). Glavne metode:
| Metoda | Namena |
|---|---|
ConnectHandler(**uredjaj) | Otvara SSH vezu i priprema sesiju (isključuje paging) |
send_command("...") | Izvršava komandu i vraća izlaz kao tekst |
send_config_set([...]) | Ulazi u konfiguracioni režim i šalje listu komandi |
save_config() | Čuva konfiguraciju (write memory na Cisco IOS-u, save na VyOS-u) |
enable() | Prelazi u privilegovani režim (parametar secret) |
commit() | Primenjuje izmene na platformama sa commit modelom (VyOS, Junos) |
disconnect() | Zatvara vezu (automatski kod with bloka) |
Cisco IOS:
from netmiko import ConnectHandler
uredjaj = {
"device_type": "cisco_ios",
"host": "10.0.99.2",
"username": korisnik,
"password": lozinka,
"secret": enable_lozinka,
}
with ConnectHandler(**uredjaj) as veza:
veza.enable()
print(veza.send_command("show ip interface brief"))
veza.send_config_set(["interface GigabitEthernet0/1", "description UPLINK-SW2"])
veza.save_config()
VyOS (commit model, kao u Modulu 22):
with ConnectHandler(device_type="vyos", host="192.168.56.11",
username=korisnik, password=lozinka) as veza:
veza.send_config_set(["set interfaces ethernet eth0 description 'MGMT'"],
exit_config_mode=False)
veza.commit()
veza.save_config()
Na VyOS-u send_config_set() ostaje u konfiguracionom režimu da bi se moglo izvršiti commit(); save_config() izvršava save i izlazi iz režima. Izlazak iz konfiguracionog režima bez commit-a odbacuje unete izmene.
Izuzeci koje treba hvatati: NetmikoTimeoutException (uređaj ne odgovara na SSH) i NetmikoAuthenticationException (pogrešni kredencijali).
3. Primer iz svakodnevnog života
Daljinski upravljač koji zna „jezik" svakog televizora: ne morate da znate koji signal koji proizvođač koristi, samo pritisnete „jačina zvuka".
4. Primer iz poslovnog IT okruženja
Tokom incidenta NOC operater pokreće Netmiko skriptu koja za 30 sekundi sa 40 svičeva prikuplja show interfaces status i show logging u fajlove za analizu, umesto da se prijavljuje na svaki svič posebno.
5. Praktična vežba / napomena
Laboratorijska vežba ovog modula koristi upravo ove obrasce sa dva VyOS rutera. Obratite pažnju na razliku: Cisco IOS izmene primenjuje odmah, a VyOS tek posle commit.
6. Najčešće greške
- Pogrešan
device_type— Netmiko ne prepoznaje prompt i prijavljuje timeout. - Zaboravljen
commit()na VyOS/Junos uređajima — izmene nisu primenjene. - Zaboravljeno čuvanje konfiguracije (
save_config()) — izmene nestaju posle restarta. - Lozinke upisane direktno u rečnik uređaja u kodu (Tema 14).
7. Pitanje za proveru znanja
P: Koju metodu Netmiko-a koristite za show komandu, a koju za listu konfiguracionih komandi? O: send_command() za show komandu i send_config_set() za listu konfiguracionih komandi.
Tema 8 – Automatski backup konfiguracija
1. Jednostavno objašnjenje
Skripta se svake noći prijavi na sve uređaje, preuzme konfiguraciju i sačuva je u fajl sa datumom — backup iz Modula 23, ali bez ručnog rada.
2. Stručno objašnjenje
Tipičan tok: učitavanje spiska uređaja (YAML) → za svaki uređaj Netmiko veza → show running-config (Cisco) ili show configuration commands (VyOS) → upis u fajl HOSTNAME_GGGG-MM-DD.cfg → obrada grešaka i izveštaj o uspešnim i neuspešnim uređajima. Poređenje sa prethodnom verzijom:
import difflib
from pathlib import Path
stara = Path("backup/VYOS1_2026-09-24.cfg").read_text(encoding="utf-8").splitlines()
nova = Path("backup/VYOS1_2026-09-25.cfg").read_text(encoding="utf-8").splitlines()
for red in difflib.unified_diff(stara, nova, "juce", "danas", lineterm=""):
print(red)
Automatsko pokretanje na Linux-u: cron (npr. 0 2 * * * /home/admin/netauto/bin/python /home/admin/netauto/backup.py — svake noći u 2:00) ili systemd timer. Backup folder se čuva u Git repozitorijumu, pa git diff pokazuje izmene (Modul 23). Gotovi alati sa istom namenom: Oxidized, RANCID.
3. Primer iz svakodnevnog života
Automatsko kopiranje fotografija sa telefona na cloud svake noći — ne morate da se setite, a ujutru vidite koje su slike nove.
4. Primer iz poslovnog IT okruženja
Posle neočekivanog prekida administrator poredi jutarnji i jučerašnji backup rutera i vidi da je neko ručno izmenio ACL u 17:40 — uzrok je pronađen za minut.
5. Praktična vežba / napomena
Razmislite kako će skripta nazvati fajl ako se pokrene dva puta istog dana, i da li vam to odgovara (predlog: dodati i vreme, GGGG-MM-DD_HHMM).
6. Najčešće greške
- Skripta prekida rad na prvom nedostupnom uređaju, pa ostali ostaju bez backup-a.
- Neuspeh backup-a niko ne primećuje — skripta mora prijaviti greške (e-pošta, Syslog, monitoring).
- Backup folder dostupan svima, iako sadrži hash-eve lozinki i ključeve.
7. Pitanje za proveru znanja
P: Čemu služi modul difflib u skripti za backup? O: Poredi dve verzije konfiguracije red po red i prikazuje samo razlike, pa se odmah vidi šta je izmenjeno.
Tema 9 – Prikupljanje i parsiranje show komandi
1. Jednostavno objašnjenje
Skripta može sa svih uređaja da prikupi izlaze show komandi. Još je korisnije kada tekstualni izlaz pretvori u tabelu podataka iz koje se lako izvlači ono što treba.
2. Stručno objašnjenje
Prikupljanje: za svaki uređaj i svaku komandu iz liste — send_command() i upis u fajl HOSTNAME_komanda.txt. Za dalju obradu izlaz se parsira u strukturisane podatke:
- Ručno —
splitlines(),split(), regularni izrazi (Tema 3); krhko pri promeni formata. - TextFSM + ntc-templates — biblioteka gotovih šablona za stotine komandi različitih proizvođača; u Netmiko-u:
send_command("show ip interface brief", use_textfsm=True)vraća listu rečnika, npr.[{"interface": "GigabitEthernet0/0", "ip_address": "10.0.0.1", "status": "up", ...}]. - Genie/pyATS (Cisco) i TTP — alternativni parseri.
- Strukturisani izlaz uređaja — neke platforme vraćaju JSON direktno (npr.
show ... | jsonna NX-OS-u,| display jsonna Junos-u), a API-ji uvek (Tema 11).
Kada su podaci strukturisani, lako se prave provere („svi uplink portovi su up"), izveštaji i CSV/JSON izvozi.
3. Primer iz svakodnevnog života
Prepisivanje ručno pisanih računa u tabelu: dok su na papiru, teško je sabrati troškove po mesecima; kada su u tabeli, to je jedna formula.
4. Primer iz poslovnog IT okruženja
Skripta sa TextFSM-om sa 60 svičeva prikuplja show interfaces status i pravi izveštaj o portovima sa greškama duplex-a (Modul 20) i portovima koji nisu korišćeni više od 30 dana — kandidatima za gašenje (Modul 16).
5. Praktična vežba / napomena
Uporedite izlaz show ip interface brief kao tekst i kao listu rečnika: koliko je linija koda potrebno da se pronađu svi interfejsi u stanju down u svakom od ta dva slučaja?
6. Najčešće greške
- Parsiranje po tačnoj poziciji kolona — puca kada je naziv interfejsa duži.
- Očekivanje da TextFSM šablon postoji za svaku komandu svakog proizvođača.
- Čuvanje izlaza bez naziva uređaja i vremena — kasnije se ne zna odakle potiču.
7. Pitanje za proveru znanja
P: Šta vraća send_command(..., use_textfsm=True) kada postoji odgovarajući šablon? O: Listu rečnika — strukturisane podatke, gde je svaki red izlaza jedan rečnik sa imenovanim poljima.
Tema 10 – Automatska provera dostupnosti
1. Jednostavno objašnjenje
Skripta redom proverava da li uređaji odgovaraju na ping i da li im je otvoren SSH port, i pravi izveštaj — mini monitoring sistem.
2. Stručno objašnjenje
Dva nivoa provere:
import socket
import subprocess
def ping(ip):
rezultat = subprocess.run(["ping", "-c", "2", "-W", "1", ip], capture_output=True)
return rezultat.returncode == 0
def port_otvoren(ip, port=22, timeout=2):
try:
with socket.create_connection((ip, port), timeout=timeout):
return True
except OSError:
return False
- ICMP (ping) — da li je uređaj uopšte dostupan na mrežnom sloju.
- TCP port — da li servis radi (SSH 22, HTTPS 443). Uređaj može da odgovara na ping, a da SSH ne radi — što je upravo slučaj koji ruši automatizaciju.
Rezultat se čuva u JSON/CSV izveštaju sa vremenom provere. Za veći broj uređaja provere se izvršavaju paralelno (concurrent.futures.ThreadPoolExecutor), pa 200 uređaja ne traje 200 × 2 sekunde. Ovakva skripta ne zamenjuje monitoring sistem (Modul 23) — korisna je pre pokretanja automatizacije („koji uređaji su spremni?") i za brze provere tokom incidenta.
3. Primer iz svakodnevnog života
Prozivka u školi pre ekskurzije: prvo se proveri da li je svako prisutan (ping), pa da li ima putnu ispravu (port) — tek onda se kreće.
4. Primer iz poslovnog IT okruženja
Pre noćnog Ansible pokretanja skripta proverava dostupnost svih 120 uređaja; uređaji koji ne odgovaraju na SSH izostavljaju se iz pokretanja i prijavljuju se dežurnom, umesto da izazovu 120 grešaka usred playbook-a.
5. Praktična vežba / napomena
U laboratoriji ćete namerno ugasiti SSH servis na jednom ruteru i videti kako se razlikuju rezultati ping i port provere.
6. Najčešće greške
- Samo ping provera — pogrešan zaključak da je uređaj „spreman".
- Bez timeout-a — skripta dugo „visi" na nedostupnom uređaju.
- Pokretanje provera sa računara koji nema istu mrežnu putanju kao sistem za automatizaciju.
7. Pitanje za proveru znanja
P: Uređaj odgovara na ping, ali TCP provera porta 22 nije uspešna. Šta to znači za Netmiko skriptu? O: Uređaj je dostupan na mrežnom sloju, ali SSH servis ne radi ili je blokiran, pa će Netmiko prijaviti grešku (timeout ili odbijenu vezu).
Tema 11 – REST API
1. Jednostavno objašnjenje
API je „ulaz za programe". Umesto da skripta čita tekst namenjen čoveku, pošalje zahtev preko HTTPS-a i dobije uredne podatke u JSON-u.
2. Stručno objašnjenje
REST API koristi HTTP(S) i resurse označene URL-om. HTTP metode: GET (čitanje), POST (kreiranje ili izvršavanje akcije), PUT (zamena), PATCH (delimična izmena), DELETE (brisanje). Statusni kodovi: 200 OK, 201 Created, 204 No Content, 400 loš zahtev, 401 nije autentifikovan, 403 zabranjeno, 404 ne postoji, 500 greška servera. Autentifikacija: API ključ ili token (u zaglavlju ili telu zahteva), korisničko ime i lozinka (Basic), OAuth. Podaci se razmenjuju u JSON-u (Tema 4).
import requests
odgovor = requests.get(
"https://netbox.firma.local/api/dcim/devices/",
headers={"Authorization": f"Token {api_token}", "Accept": "application/json"},
timeout=10,
)
odgovor.raise_for_status()
for uredjaj in odgovor.json()["results"]:
print(uredjaj["name"])
Na mrežnim uređajima: RESTCONF (RFC 8040) — REST pristup podacima opisanim YANG modelima; NETCONF (RFC 6241) — XML preko SSH-a (port 830) sa transakcijama i validacijom; gNMI za telemetriju. Mnogi proizvođači imaju i sopstvene API-je (npr. VyOS HTTP API, koji koristite u laboratoriji). Prednosti u odnosu na SSH: strukturisani podaci, jasni kodovi grešaka, nema parsiranja teksta. API se uvek koristi preko HTTPS-a; provera sertifikata (verify=False) sme se isključiti samo u izolovanoj laboratoriji sa samopotpisanim sertifikatom.
3. Primer iz svakodnevnog života
Naručivanje u restoranu preko šaltera sa menijem (API): tačno piše šta može da se naruči i u kom obliku, i dobijate tačno ono što ste tražili — umesto da odete u kuhinju i sami tražite hranu (SSH screen scraping).
4. Primer iz poslovnog IT okruženja
Firma drži inventar i IP adrese u NetBox-u (Modul 23). Skripta preko NetBox REST API-ja dobija spisak svih svičeva jedne lokacije i prosleđuje ga Ansible-u — spisak uređaja nikada nije zastareo.
5. Praktična vežba / napomena
U laboratoriji ćete na VyOS ruteru uključiti HTTP API i preko Python-a preuzeti konfiguraciju interfejsa u JSON formatu.
6. Najčešće greške
verify=Falseprenet iz laboratorije u produkciju.- API ključ upisan u kod koji završi u Git repozitorijumu.
- Nepostojanje provere statusnog koda — skripta obrađuje poruku o grešci kao da su podaci.
7. Pitanje za proveru znanja
P: Šta znače HTTP statusni kodovi 401 i 404? O: 401 — zahtev nije autentifikovan (nedostaje ili je pogrešan ključ/token); 404 — traženi resurs ne postoji.
Tema 12 – Ansible: arhitektura i inventory
1. Jednostavno objašnjenje
Ansible je alat kome opišete kakvo stanje želite na uređajima, a on se sam poveže na njih i to stanje uspostavi. Spisak uređaja kojima upravlja zove se inventory.
2. Stručno objašnjenje
Ansible je agentless — ne instalira ništa na uređaje; sa kontrolnog računara (Linux) povezuje se preko SSH-a ili API-ja. Elementi:
- Inventory — spisak uređaja podeljenih u grupe, sa promenljivim.
- Moduli — jedinice rada (npr.
vyos.vyos.vyos_command,vyos.vyos.vyos_config,cisco.ios.ios_config,ansible.builtin.copy), organizovani u kolekcije. - Playbook — YAML fajl sa zadacima (Tema 13).
- Promenljive — u inventory-ju,
group_vars/ihost_vars/.
Za mrežne uređaje veza je ansible.netcommon.network_cli (SSH, preko Paramiko-a ili libssh), uz promenljivu ansible_network_os koja kaže koji je OS na uređaju.
[vyos]
vyos1 ansible_host=192.168.56.11
vyos2 ansible_host=192.168.56.12
[vyos:vars]
ansible_connection=ansible.netcommon.network_cli
ansible_network_os=vyos.vyos.vyos
ansible_user=vyos
Isti inventory može biti i u YAML formatu. Provera: ansible-inventory -i inventory.ini --graph.
3. Primer iz svakodnevnog života
Upravnik zgrade (kontrolni računar) sa spiskom stanova po spratovima (inventory) i uputstvom „na svim vratima mora da piše broj stana" (playbook). Stanari ne moraju ništa da instaliraju.
4. Primer iz poslovnog IT okruženja
Inventory ima grupe centrala, poslovnice, svicevi, ruteri. Izmena NTP servera primenjuje se na grupu svicevi samo u poslovnici Niš, parametrom --limit.
5. Praktična vežba / napomena
Nacrtajte hijerarhiju grupa za firmu sa dve lokacije i tri tipa uređaja, i odlučite koje promenljive idu na nivo grupe, a koje na nivo pojedinačnog uređaja.
6. Najčešće greške
- Nedostaje
ansible_network_osili jeansible_connectionpogrešan (npr.sshumestonetwork_cliza mrežne uređaje). - Lozinka upisana u inventory kao običan tekst (Tema 14).
- Isti uređaj u više grupa sa kontradiktornim promenljivim.
7. Pitanje za proveru znanja
P: Šta znači da je Ansible „agentless"? O: Na upravljane uređaje ne instalira se nikakav softver; Ansible se povezuje postojećim protokolima (SSH, API) sa kontrolnog računara.
Tema 13 – Ansible playbook i idempotentnost
1. Jednostavno objašnjenje
Playbook je YAML fajl sa spiskom zadataka. Ansible ga može pokrenuti deset puta — ako je stanje već ispravno, ništa neće menjati.
2. Stručno objašnjenje
Playbook sadrži jedan ili više play-eva (koji uređaji — hosts) sa listom zadataka (tasks), svaki sa nazivom i modulom:
---
- name: Standardna konfiguracija VyOS rutera
hosts: vyos
gather_facts: false
tasks:
- name: Banner i opis upravljačkog interfejsa
vyos.vyos.vyos_config:
lines:
- set system login banner pre-login 'Samo za ovlascene korisnike'
- set interfaces ethernet eth0 description 'MGMT-HOSTONLY'
save: true
- name: Provera
vyos.vyos.vyos_command:
commands: show interfaces
register: izlaz
- name: Prikaz rezultata
ansible.builtin.debug:
var: izlaz.stdout_lines
Idempotentnost: višestruko izvršavanje daje isti rezultat kao jedno. Modul vyos_config poredi tražene linije sa trenutnom konfiguracijom i šalje samo ono što nedostaje; drugo pokretanje prijavljuje changed=0. Rezime (PLAY RECAP) prikazuje ok, changed, unreachable, failed za svaki uređaj. Korisne opcije: --check (samo proveri šta bi se promenilo), --diff (prikaži razlike), --limit vyos1 (samo deo uređaja), -v (detaljniji izlaz). Pokretanje: ansible-playbook -i inventory.ini standard.yml.
3. Primer iz svakodnevnog života
Termostat podešen na 22 °C: ako je u sobi već 22 °C, ne radi ništa; ako je hladnije, greje. Uputstvo „grej 10 minuta" nije idempotentno — svako ponavljanje dodatno zagreva sobu.
4. Primer iz poslovnog IT okruženja
Standardni playbook se pokreće svake noći nad svim uređajima. Ako neko ručno promeni banner ili NTP server, sledeće pokretanje ga vraća na standard i prijavljuje changed=1 za taj uređaj — automatsko otkrivanje odstupanja (configuration drift).
5. Praktična vežba / napomena
U laboratoriji ćete isti playbook pokrenuti dva puta i uporediti changed vrednosti u rezimeu.
6. Najčešće greške
- Neispravno YAML uvlačenje (tab, pomereni
-). - Korišćenje modula
*_commandza izmene konfiguracije — nije idempotentno, uvek „menja". - Tekst u
lineskoji se ne poklapa tačno sa zapisom u konfiguraciji (skraćena komanda, drugačiji razmaci, podrazumevana vrednost koju uređaj ne prikazuje), pa Ansible svaki put prijavljuje izmenu.
7. Pitanje za proveru znanja
P: Šta znači kada drugo pokretanje istog playbook-a prijavi changed=0? O: Da su uređaji već u željenom stanju i da ništa nije promenjeno — playbook je idempotentan.
Tema 14 – Bezbedno čuvanje kredencijala
1. Jednostavno objašnjenje
Lozinke nikada ne pišite u kod. Skripta ih dobija u trenutku pokretanja ili iz šifrovanog „sefa".
2. Stručno objašnjenje
Kod se deli, kopira i čuva u Git-u — lozinka upisana u kod pre ili kasnije završi tamo gde ne treba (javni repozitorijum, e-pošta, snimak ekrana). Bezbedni načini, od jednostavnijih ka naprednijim:
- Unos pri pokretanju —
getpass.getpass("Lozinka: ")(ne prikazuje se na ekranu). - Promenljive okruženja —
os.environ["NET_PASS"], postavljene pre pokretanja (export NET_PASS=...iliread -s NET_PASS), a ne u kodu. - Ansible Vault — šifrovan YAML fajl (
ansible-vault create), dešifruje se pri pokretanju (--ask-vault-pass). - Sistemi za tajne — HashiCorp Vault, CyberArk, Azure Key Vault; skripta preuzima kratkotrajne kredencijale preko API-ja.
- SSH ključevi umesto lozinki, zaštićeni lozinkom (Modul 18).
Dodatno: poseban nalog za automatizaciju sa minimalnim potrebnim pravima (npr. samo čitanje za backup skriptu), centralna autentifikacija i evidencija preko AAA/TACACS+ (Modul 16), fajl .gitignore koji isključuje fajlove sa tajnama, i alati koji pre commit-a proveravaju da li su tajne slučajno dodate. Ako tajna ipak procuri — odmah se menja; brisanje iz Git istorije nije dovoljno.
3. Primer iz svakodnevnog života
Ključ od stana se ne ostavlja ispod otirača (lozinka u kodu), već se nosi sa sobom (unos pri pokretanju) ili ostavlja u sefu sa šifrom (Vault).
4. Primer iz poslovnog IT okruženja
Praktikant objavljuje skriptu na javnom GitHub-u sa lozinkom za sve svičeve u kodu. Automatizovani skeneri pronalaze je za nekoliko sati. Firma mora hitno da promeni lozinke na svim uređajima i uvodi pravilo: kredencijali samo iz Vault-a, uz proveru pre svakog commit-a.
5. Praktična vežba / napomena
Sve skripte u laboratoriji čitaju kredencijale iz promenljivih okruženja, a Ansible lozinka je u Ansible Vault-u. Proverite da nijedan fajl koji pravite ne sadrži lozinku kao tekst: grep -ri lozinka ~/netauto-lab.
6. Najčešće greške
- Lozinka u kodu „samo privremeno".
- Isti administratorski nalog sa punim pravima za sve skripte.
export NET_PASS=...u.bashrcili istoriji komandi (history) — boljeread -s.- Brisanje tajne iz poslednjeg commit-a bez promene same lozinke.
7. Pitanje za proveru znanja
P: Lozinka je greškom objavljena u Git repozitorijumu i odmah obrisana sledećim commit-om. Da li je problem rešen? O: Nije. Lozinka ostaje u Git istoriji i mogla je već biti preuzeta — mora se odmah promeniti na svim uređajima.
Tema 15 – Bezbedna i odgovorna automatizacija
1. Jednostavno objašnjenje
Automatizacija ima veliku moć, pa zahteva disciplinu: prvo testirati u laboratoriji, pa na jednom uređaju, pa postepeno na ostalim — i uvek imati plan za povratak na prethodno stanje.
2. Stručno objašnjenje
Principi:
- Ovlašćenje — automatizacija samo nad uređajima koje administrirate, u okviru odobrene izmene (change management).
- Testiranje — u laboratoriji (VirtualBox, GNS3 iz Modula 22) pre produkcije.
- Suvi rad (dry-run) —
--check --diffu Ansible-u, ili skripta koja prvo samo prikazuje komande koje bi poslala. - Postepeno uvođenje (canary) — prvo jedan uređaj (
--limit), pa mala grupa, pa svi; zaustavljanje pri prvoj grešci (u Ansible-u npr.serialimax_fail_percentage). - Ograničavanje „radijusa eksplozije" (blast radius) — nikada ne menjati istovremeno sve uređaje od kojih zavisi upravljački pristup (npr. ACL na VTY linijama svih rutera).
- Povratak (rollback) — backup pre izmene; VyOS
commit-confirmi Ciscoconfigure replace/reload inautomatski vraćaju stanje ako se izgubi pristup. - Evidencija — logovanje ko je, kada i šta pokrenuo; kod u Git-u sa pregledom izmena (code review).
- Obrada grešaka — skripta mora prijaviti neuspeh, ne ćutati.
3. Primer iz svakodnevnog života
Nov lek se prvo ispituje u laboratoriji, pa na malom broju dobrovoljaca, pa na većoj grupi — i tek onda ide u apoteke.
4. Primer iz poslovnog IT okruženja
Inženjer menja ACL za SSH pristup na 80 rutera. Playbook prvo radi sa --check --diff, zatim nad jednim ruterom sa VyOS commit-confirm 5 (automatski povratak za 5 minuta ako se ne potvrdi), zatim u grupama po 10 uz max_fail_percentage: 0. Na trećem ruteru greška u sintaksi zaustavlja pokretanje — pogođen je samo jedan uređaj, i on se sam vratio na prethodno stanje.
5. Praktična vežba / napomena
Pre svakog pokretanja skripte u laboratoriji postavite sebi pitanje: „Šta se dešava ako ova skripta uradi pogrešnu stvar na svim uređajima odjednom — i kako se vraćam?"
6. Najčešće greške
- Pokretanje neproverenog koda odmah nad svim produkcionim uređajima.
- Izmena koja preseca sopstveni upravljački pristup (npr. pogrešna ACL na VTY liniji) bez automatskog povratka.
- Automatizacija bez evidencije — posle incidenta se ne zna ko je šta pokrenuo.
- Pokretanje skripti nad tuđim ili neovlašćenim sistemima „radi testiranja".
7. Pitanje za proveru znanja
P: Čemu služi VyOS komanda commit-confirm? O: Primenjuje izmenu uz automatski povratak na prethodnu konfiguraciju posle zadatog vremena ako izmena ne bude potvrđena — štiti od gubitka pristupa usled pogrešne izmene.
Rezime modula
- Automatizacija donosi brzinu, konzistentnost i manje ljudskih grešaka, ali greške širi jednako brzo — zato se uvodi uz testiranje i postepeno.
- Python osnove (liste, rečnici, petlje, funkcije,
try/except, virtuelno okruženje) dovoljne su za većinu mrežnih skripti. - Fajlovi (
with open,pathlib), JSON (API-ji, izveštaji) i YAML (inventar, Ansible) nose podatke. - Paramiko je SSH biblioteka; Netmiko dodaje podršku za mrežne uređaje (
send_command,send_config_set,commit,save_config). - Tipični poslovi: backup konfiguracija sa
difflib/Git, prikupljanje i parsiranjeshowkomandi (TextFSM), provera dostupnosti (ping + TCP port). - REST API daje strukturisane podatke preko HTTPS-a; RESTCONF/NETCONF sa YANG modelima su standardni API-ji mrežnih uređaja.
- Ansible je agentless: inventory + playbook + moduli; idempotentnost omogućava bezbedno ponavljanje.
- Kredencijali nikada u kodu:
getpass, promenljive okruženja, Ansible Vault, sistemi za tajne; nalozi sa minimalnim pravima. - Samo nad ovlašćenom infrastrukturom, sa dry-run-om, postepenim uvođenjem i mogućnošću povratka.
Mermaid dijagram
graph LR
SRC["Izvor istine<br/>(YAML u Git-u, NetBox)"] --> CTRL["Kontrolni računar<br/>(Python, Ansible)"]
VAULT["Kredencijali<br/>(Vault, promenljive okruženja)"] --> CTRL
CTRL -->|"SSH (Netmiko / network_cli)"| R1["VYOS1"]
CTRL -->|"SSH"| R2["VYOS2"]
CTRL -->|"HTTPS REST API"| R1
R1 -->|"Izlazi, konfiguracije"| OUT["Backup-i, izveštaji<br/>(JSON, TXT, Git)"]
R2 -->|"Izlazi, konfiguracije"| OUT
Dodatni izvori (opciono)
- Netmiko dokumentacija i primeri (github.com/ktbyers/netmiko)
- Ansible dokumentacija — Network Automation (docs.ansible.com)
- VyOS dokumentacija — HTTP API i Ansible (docs.vyos.io)
- Python tutorijal (docs.python.org/3/tutorial)
- RFC 8040 (RESTCONF), RFC 6241 (NETCONF), RFC 8259 (JSON)
- Cisco DevNet besplatni materijali i sandbox okruženja (developer.cisco.com)