Infrastruktura kao kod (IaC) je praksa upravljanja i provisioninga infrastrukture kroz kod, umesto kroz manuelne procese ili interaktivne alate. To znači da se serveri, baze podataka, mreže i svi ostali resursi potrebni za pokretanje aplikacije definišu u fajlovima koji se mogu verzirati, testirati i deployovati na isti način kao i aplikativni kod. IaC je fundamentalni stub DevOps-a, omogućavajući automatizaciju, ponovljivost i skalabilnost. Ovaj tutorijal će vas provesti kroz principe IaC-a, ključne alate kao što su Terraform i Ansible, i praktične primere implementacije.
IaC donosi brojne prednosti koje su neophodne za modernu DevOps praksu:
Idempotentnost je ključni princip u IaC-u. To znači da primena istog IaC koda više puta treba da rezultira istim stanjem infrastrukture, bez obzira na početno stanje. Ako je resurs već kreiran i u željenom stanju, IaC alat ga neće ponovo kreirati ili menjati. Ovo je važno za pouzdanost i konzistentnost.
U DevOps-u se često koristi kombinacija oba pristupa. Deklarativni alati su odlični za provisioning infrastrukture, dok su imperativni alati korisni za konfiguraciju softvera na tim resursima.
Terraform je open-source alat za Infrastructure as Code koji omogućava definisanje, provisioniranje i upravljanje cloud i on-premise resursima koristeći deklarativni pristup. Podržava veliki broj provajdera (AWS, Azure, GCP, VMware, OpenStack, itd.).
aws, azurerm, google).aws_instance, azurerm_virtual_network).terraform.tfstate fajlu. Ovaj fajl mapira resurse definisane u kodu sa stvarnim resursima u infrastrukturi. Ključno je da se ovaj fajl čuva na sigurnom mestu i da se verzira (npr. u S3 bucketu sa verzionisanjem).terraform init: Inicijalizuje radni direktorijum, preuzima potrebne provajdere. bash terraform initterraform plan: Generiše i prikazuje plan izvršenja, pokazujući koje će promene biti napravljene u infrastrukturi. bash terraform planterraform apply: Primjenjuje plan izvršenja, kreirajući ili modifikujući resurse. Traži potvrdu pre izvršenja. bash terraform applyterraform destroy: Briše sve resurse definisane u konfiguraciji. Traži potvrdu pre izvršenja. bash terraform destroyKreirajte fajl main.tf:
# Definisanje AWS provajdera
provider "aws" {
region = "us-east-1" # Promenite region po potrebi
}
# Kreiranje EC2 instance
resource "aws_instance" "web_server" {
ami = "ami-0abcdef1234567890" # Promenite AMI ID za vaš region i OS
instance_type = "t2.micro"
tags = {
Name = "WebServer"
}
}
# Izlaz: Javna IP adresa instance
output "public_ip" {
value = aws_instance.web_server.public_ip
}
Koraci za izvršenje:
bash terraform initbash terraform planbash terraform apply Nakon terraform apply, biće kreirana EC2 instanca i prikazana njena javna IP adresa.Ansible je open-source alat za automatizaciju koji se koristi za upravljanje konfiguracijom, deployment aplikacija i orkestraciju. Koristi SSH za komunikaciju sa udaljenim mašinama i ne zahteva instalaciju agenta na ciljnim serverima (agentless).
ansible all -m ping: Proverava povezanost sa svim hostovima u inventaru. bash ansible all -m pingansible-playbook <ime_playbooka.yml>: Pokreće Ansible playbook. bash ansible-playbook deploy_web_server.ymlInventory fajl (inventory.ini):
[webservers]
web1 ansible_host=your_server_ip ansible_user=ubuntuPlaybook (nginx_install.yml):
---
- name: Install and Configure Nginx
hosts: webservers
become: yes # Pokreni zadatke sa sudo privilegijama
tasks:
- name: Update apt cache
apt: update_cache=yes
- name: Install Nginx
apt: name=nginx state=present
- name: Start Nginx service
systemd: name=nginx state=started enabled=yes
- name: Copy custom index.html
copy:
src: files/index.html
dest: /var/www/html/index.html
mode: '0644'
notify: Restart Nginx
handlers:
- name: Restart Nginx
systemd: name=nginx state=restartedHTML fajl (files/index.html):
<!DOCTYPE html>
<html>
<head>
<title>Hello from Ansible!</title>
</head>
<body>
<h1>Hello from Ansible!</h1>
<p>This page was deployed using Ansible.</p>
</body>
</html>Koraci za izvršenje:
files/ i inventory.ini i nginx_install.yml fajlove kao što je prikazano.inventory.ini zamenite your_server_ip sa stvarnom IP adresom vašeg servera i ansible_user sa korisnikom koji ima SSH pristup.bash ansible-playbook -i inventory.ini nginx_install.yml Nakon izvršenja, Nginx će biti instaliran i pokrenut na ciljnom serveru, a index.html će biti kopiran u /var/www/html/.Ovo su IaC servisi specifični za cloud provajdere. Omogućavaju vam da definišete resurse koristeći JSON ili YAML templejte.
CloudFormation omogućava modeliranje, provisioniranje i upravljanje AWS resursima. Definišete resurse u templejtu, a CloudFormation kreira “stack” koji sadrži te resurse.
Primer CloudFormation templejta (YAML) za EC2 instancu:
AWSTemplateFormatVersion: '2010-09-09'
Description: A simple EC2 instance CloudFormation template
Resources:
WebServerInstance:
Type: AWS::EC2::Instance
Properties:
ImageId: ami-0abcdef1234567890 # Promenite AMI ID
InstanceType: t2.micro
Tags:
- Key: Name
Value: MyCloudFormationInstance
Outputs:
InstanceId:
Description: The Instance ID of the EC2 instance
Value: !Ref WebServerInstance
PublicIp:
Description: The Public IP address of the EC2 instance
Value: !GetAtt WebServerInstance.PublicIpARM templejti su JSON fajlovi koji definišu infrastrukturu i konfiguraciju za vaše Azure rešenje. Omogućavaju deklarativno deployment Azure resursa.
Primer ARM templejta (JSON) za Virtualnu Mašinu:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"vmName": {
"type": "string",
"defaultValue": "myVM",
"metadata": {
"description": "Name of the virtual machine."
}
},
"adminUsername": {
"type": "string",
"metadata": {
"description": "Username for the Virtual Machine."
}
},
"adminPassword": {
"type": "securestring",
"metadata": {
"description": "Password for the Virtual Machine."
}
}
},
"variables": {
"location": "[resourceGroup().location]",
"nicName": "[concat(parameters("vmName"), "-nic")]",
"publicIpName": "[concat(parameters("vmName"), "-pip")]",
"vnetName": "myVnet",
"subnetName": "mySubnet",
"networkSecurityGroupName": "myNSG"
},
"resources": [
{
"type": "Microsoft.Network/virtualNetworks",
"apiVersion": "2020-11-01",
"name": "[variables("vnetName")]",
"location": "[variables("location")]",
"properties": {
"addressSpace": {
"addressPrefixes": [
"10.0.0.0/16"
]
},
"subnets": [
{
"name": "[variables("subnetName")]",
"properties": {
"addressPrefix": "10.0.0.0/24"
}
}
]
}
},
{
"type": "Microsoft.Network/networkSecurityGroups",
"apiVersion": "2020-11-01",
"name": "[variables("networkSecurityGroupName")]",
"location": "[variables("location")]",
"properties": {
"securityRules": [
{
"name": "SSH",
"properties": {
"priority": 1000,
"direction": "Inbound",
"access": "Allow",
"protocol": "Tcp",
"sourcePortRange": "*",
"destinationPortRange": "22",
"sourceAddressPrefix": "*",
"destinationAddressPrefix": "*"
}
}
]
}
},
{
"type": "Microsoft.Network/publicIPAddresses",
"apiVersion": "2020-11-01",
"name": "[variables("publicIpName")]",
"location": "[variables("location")]",
"sku": {
"name": "Standard"
},
"properties": {
"publicIPAllocationMethod": "Static"
}
},
{
"type": "Microsoft.Network/networkInterfaces",
"apiVersion": "2020-11-01",
"name": "[variables("nicName")]",
"location": "[variables("location")]",
"dependsOn": [
"[resourceId("Microsoft.Network/virtualNetworks", variables("vnetName"))]",
"[resourceId("Microsoft.Network/networkSecurityGroups", variables("networkSecurityGroupName"))]",
"[resourceId("Microsoft.Network/publicIPAddresses", variables("publicIpName"))]"
],
"properties": {
"ipConfigurations": [
{
"name": "ipconfig1",
"properties": {
"privateIPAllocationMethod": "Dynamic",
"publicIPAddress": {
"id": "[resourceId("Microsoft.Network/publicIPAddresses", variables("publicIpName"))]"
},
"subnet": {
"id": "[resourceId("Microsoft.Network/virtualNetworks/subnets", variables("vnetName"), variables("subnetName"))]"
}
}
}
],
"networkSecurityGroup": {
"id": "[resourceId("Microsoft.Network/networkSecurityGroups", variables("networkSecurityGroupName"))]"
}
}
},
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2020-12-01",
"name": "[parameters("vmName")]",
"location": "[variables("location")]",
"dependsOn": [
"[resourceId("Microsoft.Network/networkInterfaces", variables("nicName"))]"
],
"properties": {
"hardwareProfile": {
"vmSize": "Standard_DS1_v2"
},
"osProfile": {
"computerName": "[parameters("vmName")]",
"adminUsername": "[parameters("adminUsername")]",
"adminPassword": "[parameters("adminPassword")]"
},
"storageProfile": {
"imageReference": {
"publisher": "Canonical",
"offer": "UbuntuServer",
"sku": "18.04-LTS",
"version": "latest"
},
"osDisk": {
"createOption": "FromImage"
}
},
"networkProfile": {
"networkInterfaces": [
{
"id": "[resourceId("Microsoft.Network/networkInterfaces", variables("nicName"))]"
}
]
}
}
}
]
}Infrastruktura kao kod je transformisala način na koji se upravlja infrastrukturom, čineći je automatizovanom, ponovljivom i verziranom. Ovladavanje alatima kao što su Terraform za provisioning i Ansible za konfiguraciju je ključno za svakog DevOps inženjera. Razumevanje principa IaC-a i sposobnost primene ovih alata u praksi će vam omogućiti da izgradite robustne, skalabilne i efikasne sisteme. Kontinuirano učenje i eksperimentisanje sa različitim IaC alatima i cloud provajderima će vam pomoći da ostanete u toku sa najnovijim trendovima u industriji.
Autor: Manus AI Datum: 27. jul 2025.