Najvažnije iz članka
- Terraform i Ansible su ključni alati za automatizaciju IT infrastrukture; Terraform za "Infrastructure as Code" (IaC) i Ansible za "Configuration Management" (CM).
- Terraform deklarativno kreira baznu infrastrukturu (VM-ove, mreže, baze podataka) preko različitih cloud provajdera, generirajući izlaze poput IP adresa.
- Ansible koristi te izlaze za konfiguraciju softvera (instalaciju, deploy aplikacija) na novostvorenim resursima, koristeći agentless, YAML-bazirani i idempotentni pristup.
- Zajednička upotreba omogućuje potpunu automatizaciju od nule do funkcionalne aplikacije, poboljšava ponovljivost, smanjuje greške i ubrzava razvoj i deploy, uz preporuku za dinamički inventar, odvajanje odgovornosti i sigurno upravljanje tajnim podacima.
Sadržaj članka
- Automatizacija IT infrastrukture s Ansible i Terraformom: Sveobuhvatni Vodič
- Razumijevanje Terrafoma: Infrastruktura kao Kod (IaC)
- Ključne značajke Terrafoma:
- Razumijevanje Ansible-a: Upravljanje konfiguracijom (CM)
- Ključne značajke Ansible-a:
- Sinergija: Kako Terraform i Ansible Rade Zajedno
- Prednosti kombiniranog pristupa:
- Praktični Primjer: Deploy Web Servera na AWS-u
- Preduvjeti:
- Korak 1: Terraform za AWS EC2 Instancu
- Korak 2: Ansible za Konfiguraciju Nginxa
- Čišćenje Resursa
- Napredne Tehnike i Integracije
- Dinamički Inventar Terrafoma za Ansible
- Razdvajanje Odgovornosti
- Upravljanje Tajnim Podacima (Secrets Management)
- Moduli i Role
- Integracija s CI/CD
- Zaključak
Automatizacija IT infrastrukture s Ansible i Terraformom: Sveobuhvatni Vodič
U današnjem dinamičnom okruženju IT infrastrukture, brzina, skalabilnost i pouzdanost ključni su faktori uspjeha. Ručno upravljanje resursima postaje neodrživo kako sustavi rastu u složenosti, što dovodi do potrebe za snažnim alatima za automatizaciju. Dva takva alata, Ansible i Terraform, postali su de facto standardi u industriji za orkestraciju i upravljanje infrastrukturom. Dok Terraform dominira u "Infrastructure as Code" (IaC) domeni za provisioniranje resursa, Ansible briljira u "Configuration Management" (CM) za postavljanje i konfiguraciju softvera na tim resursima.
Ovaj članak pruža sveobuhvatan vodič za integraciju Ansible-a i Terraform-a, pokazujući kako se mogu koristiti zajedno za stvaranje potpuno automatiziranih, deklarativnih i ponovljivih IT infrastruktura. Cilj je objasniti njihove individualne prednosti, demonstrirati sinergiju pri zajedničkoj uporabi i pružiti praktične primjere implementacije.
Razumijevanje Terrafoma: Infrastruktura kao Kod (IaC)
Terraform, razvijen od strane HashiCorpa, je alat otvorenog koda za provisioniranje i orkestraciju infrastrukture. Njegova temeljna snaga leži u tome što omogućuje korisnicima da deklariraju željeno stanje svoje infrastrukture (npr. kreiraj tri virtualne mašine, dvije baze podataka i jedan load balancer) koristeći vlastiti konfiguracijski jezik, HashiCorp Configuration Language (HCL). Terraform zatim preuzima odgovornost za usporedbu tog deklariranog stanja s trenutnim stanjem i poduzima potrebne korake za postizanje željenog stanja.
Ključne značajke Terrafoma:
- Deklarativni pristup: Umjesto da specifyirate korake kako nešto postići, vi opisujete "što" želite imati.
- Podrška za više cloud provajdera: Terraform ima providere za AWS, Azure, Google Cloud, Oracle Cloud, VMware vSphere, OpenStack i stotine drugih servisa, što ga čini agnostičnim na infrastrukturu.
- Planiranje izvršenja: Prije primjene promjena, Terraform generira "plan izvršenja" koji jasno prikazuje što će se kreirati, modificirati ili uništiti. Ovo pruža sloj sigurnosti i preglednosti.
- Stanje infrastrukture (State File): Terraform pohranjuje stanje vaše infrastrukture u "state file" (lokalno ili na udaljenom backendu poput S3, Azure Blob Storage, Google Cloud Storage). Ovaj file je ključan za razumijevanje trenutnog stanja resursa i za planiranje budućih promjena.
- Moduli: Terraform moduli omogućuju modularizaciju i ponovnu upotrebu konfiguracijskog koda, čime se smanjuje dupliciranje i povećava održivost.
Razumijevanje Ansible-a: Upravljanje konfiguracijom (CM)
Ansible, alat otvorenog koda u vlasništvu Red Hat-a, fokusira se na upravljanje konfiguracijom, automatizaciju aplikacija, orkestraciju i provisioniranje. Za razliku od Terrafoma, koji stvara infrastrukturu, Ansible se primarno koristi za konfiguriranje softvera unutar te infrastrukture nakon što je ona provisionirana. To uključuje instalaciju paketa, konfiguraciju servisa, upravljanje korisnicima, deploy aplikacija i izvršavanje ad-hoc naredbi.
Ključne značajke Ansible-a:
- Agentless arhitektura: Ansible ne zahtijeva instalaciju agenta na udaljenim serverima. Koristi standardni SSH protokol za Linux/Unix sustave i WinRM za Windows, što pojednostavljuje implementaciju i smanjuje overhead.
- YAML baziran: Ansible playbooks (skripte za konfiguraciju) pisani su u YAML-u, što ih čini vrlo čitljivima i razumljivima.
- Idempotencija: Ansible je inherentno idempotent, što znači da izvršavanje playooka više puta uvijek rezultira istim stanjem, bez neželjenih nuspojava.
- Inventar: Ansible upravlja popisom hostova (servera) u "inventarnom" fajlu, koji može biti statičan ili dinamičan (npr. generiran iz cloud provajdera).
- Moduli: Ansible ima tisuće ugrađenih modula za različite zadatke, od upravljanja paketima (apt, yum), do konfiguracije baze podataka (mysql), web servera (apache, nginx) i cloud servisa.
Sinergija: Kako Terraform i Ansible Rade Zajedno
Prava snaga leži u kombinaciji ova dva alata. Terraform se koristi za provisioniranje bazne infrastrukture, a Ansible za njeno konfiguriranje i deploy aplikacija. Evo tipičnog tijeka rada:
- Terraform Provisioning: Terraform kreira resurse kao što su virtualne mašine, mrežne komponente, baze podataka. Ključno je da Terraform izlaze informacije potrebne Ansible-u, kao što su IP adrese provisioniranih strojeva.
- Terraform Output: Terraform može generirati izlaze u različitim formatima koji se mogu koristiti kao ulaz za druge alate. U ovom slučaju, generirat će dinamički Ansible inventarni fajl ili podatke koje Ansible može parsirati.
- Ansible Konfiguracija: Ansible preuzima podatke o novostvorenoj infrastrukturi i pokreće playbooks za:
- Instalaciju OS paketa i ovisnosti.
- Konfiguraciju sigurnosnih postavki (firewall, SSH ključevi).
- Instalaciju i konfiguraciju web servera (Nginx, Apache), aplikacijskih servera (Tomcat, Node.js).
- Deploy aplikacijskog koda iz Git repozitorija.
- Postavljanje monitoring i logging agenata.
Prednosti kombiniranog pristupa:
- Potpuna automatizacija: Od praznog clouda do potpuno funkcionalne aplikacije, sve je automatizirano.
- Idempotencija i ponovljivost: Infrastruktura se može ponovno postaviti na isti način, eliminirajući "drift" konfiguracije.
- Verzija kontrole: Cijela infrastruktura (Terraform kod) i konfiguracija (Ansible playbooks) mogu se pratiti u sustavu za kontrolu verzija (npr. Git).
- Skalabilnost: Lako je skalirati infrastrukturu dodavanjem novih VM-ova putem Terrafoma i automatskim konfiguracijama putem Ansible-a.
- Smanjenje grešaka: Ljudske pogreške su minimizirane jer su procesi standardizirani i automatizirani.
- Brži razvoj i deploy: Skraćuje se vrijeme od razvoja do produkcije.
Praktični Primjer: Deploy Web Servera na AWS-u
Demonstrirat ćemo kako postaviti jednostavni Nginx web server na AWS EC2 instanci koristeći Terraform za kreiranje instance i Ansible za konfiguraciju Nginxa.
Preduvjeti:
- Instaliran Terraform (
brew install terraformili službeni download). - Instaliran Ansible (
pip install ansibleili sustavni paket menadžer). - Konfiguriran AWS CLI i pristupni ključevi (
aws configure). - SSH ključ par (
.pemfile) za pristup EC2 instanci.
Korak 1: Terraform za AWS EC2 Instancu
Kreirajmo direktorij aws_nginx i unutar njega file main.tf:
# main.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "eu-central-1"
}
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
tags = {
Name = "nginx-vpc"
}
}
resource "aws_subnet" "main" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
availability_zone = "eu-central-1a"
tags = {
Name = "nginx-subnet"
}
}
resource "aws_internet_gateway" "main" {
vpc_id = aws_vpc.main.id
tags = {
Name = "nginx-igw"
}
}
resource "aws_route_table" "main" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.main.id
}
}
resource "aws_route_table_association" "main" {
subnet_id = aws_subnet.main.id
route_table_id = aws_route_table.main.id
}
resource "aws_security_group" "web_sg" {
name = "web_sg"
description = "Allow HTTP and SSH inbound traffic"
vpc_id = aws_vpc.main.id
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "web-sg"
}
}
resource "aws_instance" "web_server" {
ami = "ami-0d5ee8670da476901" # Amazon Linux 2023 - eu-central-1
instance_type = "t2.micro"
subnet_id = aws_subnet.main.id
security_groups = [aws_security_group.web_sg.id]
key_name = "your-ssh-key-name" # Zamijenite s imenom vašeg SSH ključa
tags = {
Name = "Web Server"
}
}
output "web_server_public_ip" {
description = "Public IP address of the web server"
value = aws_instance.web_server.public_ip
}
VAŽNO: Zamijenite your-ssh-key-name s imenom vašeg SSH ključa koji ste prethodno uvezli u AWS. Također, AMI ID (ami-0d5ee8670da476901) je za Amazon Linux 2023 u regiji eu-central-1. Ako koristite drugu regiju ili OS, provjerite najnoviji AMI ID.
Izvršite Terraform naredbe:
terraform init
terraform plan
terraform apply --auto-approve
Nakon par minuta, virtualna mašina će biti kreirana. Terraform će ispisati javnu IP adresu u outputu web_server_public_ip.
Korak 2: Ansible za Konfiguraciju Nginxa
Sada kada imamo instancu, koristit ćemo Ansible za instalaciju i konfiguraciju Nginxa. Kreirajte novi direktorij ansible_nginx unutar aws_nginx ili negdje drugdje unutar projekta.
Unutar ansible_nginx kreirajte inventory.ini:
# inventory.ini
[webservers]
web_server ansible_host=<PUBLIC_IP_ADRESA_IZ_TERRAFORMA> ansible_user=ec2-user ansible_ssh_private_key_file=/path/to/your/ssh-key.pem
VAŽNO: Zamijenite <PUBLIC_IP_ADRESA_IZ_TERRAFORMA> s IP adresom koju je ispisao Terraform. Zamijenite /path/to/your/ssh-key.pem punom putanjom do vašeg SSH .pem ključa. Za Amazon Linux, ansible_user je ec2-user.
Zatim, kreirajte nginx_playbook.yml:
# nginx_playbook.yml
---
- name: Configure Nginx web server
hosts: webservers
become: true # Koristi sudo za izvršavanje privilegiranih naredbi
tasks:
- name: Update apt cache (Debian/Ubuntu) or yum cache (RHEL/CentOS/Amazon Linux)
ansible.builtin.shell: |
if [ -f /etc/redhat-release ]; then
yum update -y
elif [ -f /etc/debian_version ]; then
apt update -y
else
echo "Unsupported OS for package management"
exit 1
fi
args:
warn: false
- name: Install Nginx
ansible.builtin.package:
name: nginx
state: present
- name: Ensure Nginx service is running and enabled
ansible.builtin.service:
name: nginx
state: started
enabled: true
- name: Deploy custom index.html
ansible.builtin.copy:
content: "<h1>Hello from Ansible & Terraform!</h1>"
dest: /usr/share/nginx/html/index.html
mode: '0644'
Sada pokrenite Ansible playbook:
ansible-playbook -i inventory.ini nginx_playbook.yml
Nakon što se playbook uspješno izvrši, otvorite web preglednik i unesite javnu IP adresu vaše EC2 instance. Trebali biste vidjeti poruku "Hello from Ansible & Terraform!".
Čišćenje Resursa
Kako biste izbjegli nepotrebne troškove, ne zaboravite uništiti resurse kreirane Terraformom:
terraform destroy --auto-approve
Napredne Tehnike i Integracije
Dinamički Inventar Terrafoma za Ansible
Ručno ažuriranje inventory.ini je zamorno i sklono greškama. Terraform može dinamički generirati Ansible inventarni fajl. To se postiže korištenjem local-exec provisionera unutar aws_instance resursa ili vanjskim skriptama koje parsiraju Terraform output.
Primjer local-exec u main.tf za generiranje inventory.ini:
resource "aws_instance" "web_server" {
# ...ostala konfiguracija...
provisioner "local-exec" {
command = "echo '[webservers]' > inventory.ini && echo 'web_server ansible_host=${self.public_ip} ansible_user=ec2-user ansible_ssh_private_key_file=/path/to/your/ssh-key.pem' >> inventory.ini"
working_dir = abspath(path.module)
}
}
Ovo će kreirati inventory.ini u istom direktoriju kao i main.tf s ispravnom IP adresom.
Razdvajanje Odgovornosti
Iako je zgodno imati sve zajedno, u većim projektima je bolje razdvojiti Terraform kod (infrastructure-as-code) od Ansible playbooks-a (configuration-management). Mogu biti u zasebnim repozitorijima ili barem u zasebnim top-level direktorijima. CI/CD pipeline bi prvo pokrenuo Terraform, a zatim, koristeći output iz Terrafoma, pokrenuo Ansible.
Upravljanje Tajnim Podacima (Secrets Management)
Nikada nemojte hardkodirati osjetljive podatke (baze podataka lozinke, API ključevi) u Terraform ili Ansible kod. Koristite alate poput AWS Secrets Manager, HashiCorp Vault, Azure Key Vault ili Ansible Vault za sigurno upravljanje tajnim podacima.
Moduli i Role
- Terraform Moduli: Koristite module za enkapsulaciju ponovljivih infrastruktura (npr. modul za VPC, modul za EC2 instancu s predefiniranim postavkama).
- Ansible Role: Organizirajte Ansible playbooks u role za modularnost i lakšu ponovnu upotrebu (npr.
nginx-role,database-role).
Integracija s CI/CD
Idealno, proces provisioniranja i konfiguracije treba biti dio CI/CD pipeline-a. Alati poput Jenkins, GitLab CI/CD, GitHub Actions, CircleCI mogu orkestrirati izvršavanje Terrafoma i Ansible-a, osiguravajući da su promjene testirane i automatski primijenjene.
Zaključak
Kombinacija Terrafoma i Ansible-a predstavlja moćan tandem za modernu automatizaciju IT infrastrukture. Terraform pruža temelj za deklarativno provisioniranje resursa na bilo kojem cloud provajderu ili on-premise okruženju, dok Ansible osigurava fleksibilnu i idempotentnu konfiguraciju tih resursa. Njihovim zajedničkim korištenjem, timovi mogu postići visoku razinu automatizacije, smanjiti operativne troškove, poboljšati skalabilnost i značajno ubrzati cikluse razvoja i deploya. Usvajanje ovih alata nije samo trend, već nužnost za sve organizacije koje teže Agilnom i DevOps pristupu u upravljanju svojom IT infrastrukturom.
Komentari