Tutorijal: Infrastruktura kao kod (IaC)

Uvod u Infrastrukturu kao kod (IaC) za DevOps inženjere

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.

Zašto je IaC ključan u DevOps-u?

IaC donosi brojne prednosti koje su neophodne za modernu DevOps praksu:

Principi IaC-a

Idempotentnost

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.

Deklarativni vs. Imperativni pristup

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 - Provisioning infrastrukture

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.).

Ključni koncepti Terraforma

Osnovne Terraform komande

Praktičan primer: Kreiranje EC2 instance na AWS-u sa Terraformom

Kreirajte 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:

  1. Inicijalizacija: bash terraform init
  2. Planiranje: bash terraform plan
  3. Primena: bash terraform apply Nakon terraform apply, biće kreirana EC2 instanca i prikazana njena javna IP adresa.

Ansible - Konfiguracija i automatizacija

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).

Ključni koncepti Ansible-a

Osnovne Ansible komande

Praktičan primer: Konfiguracija Nginx web servera sa Ansible-om

Inventory fajl (inventory.ini):

[webservers]
web1 ansible_host=your_server_ip ansible_user=ubuntu

Playbook (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=restarted

HTML 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:

  1. Kreirajte direktorijume files/ i inventory.ini i nginx_install.yml fajlove kao što je prikazano.
  2. U inventory.ini zamenite your_server_ip sa stvarnom IP adresom vašeg servera i ansible_user sa korisnikom koji ima SSH pristup.
  3. Pokrenite playbook: 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/.

CloudFormation (za AWS) ili Azure Resource Manager (za Azure)

Ovo su IaC servisi specifični za cloud provajdere. Omogućavaju vam da definišete resurse koristeći JSON ili YAML templejte.

AWS CloudFormation

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.PublicIp

Azure Resource Manager (ARM) Templates

ARM 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"))]"
            }
          ]
        }
      }
    }
  ]
}

Zaključak

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.

Reference


Autor: Manus AI Datum: 27. jul 2025.