Terraform vs Ansible: infrastruktūros valdymo palyginimas

Kodėl apskritai kalbame apie šiuos įrankius?

Jei dirbate IT srityje, greičiausiai esate girdėję apie Terraform ir Ansible. Galbūt net naudojate vieną iš jų, o gal abiejus. Bet jei dar tik planuojate automatizuoti savo infrastruktūrą arba ieškote tinkamesnio sprendimo, šis palyginimas jums tikrai pravers.

Pradėkime nuo pagrindų. Abu šie įrankiai skirti infrastruktūros valdymui, bet jie tai daro gana skirtingais būdais. Terraform dažniausiai apibūdinamas kaip Infrastructure as Code (IaC) įrankis, skirtas infrastruktūrai kurti ir valdyti. Ansible, nors taip pat gali būti naudojamas infrastruktūrai kurti, labiau žinomas kaip konfigūracijos valdymo ir automatizavimo įrankis.

Realybėje šių įrankių funkcionalumas persidengia, todėl pasirinkimas ne visada akivaizdus. Aš pats esu dirbęs su abiem įrankiais skirtinguose projektuose, ir galiu pasakyti, kad kiekvienas turi savo stipriąsias puses. Kartais net naudojame juos kartu – Terraform infrastruktūrai sukurti, o Ansible jos konfigūracijai valdyti.

Kaip jie veikia: fundamentalūs skirtumai

Terraform yra deklaratyvus įrankis. Tai reiškia, kad jūs aprašote, kokią norite gauti galutinę infrastruktūros būseną, o Terraform pats išsiaiškina, kaip ją pasiekti. Jis naudoja HCL (HashiCorp Configuration Language) sintaksę, kuri gana intuityvi ir lengvai skaitoma.

Štai paprastas Terraform pavyzdys:

„`hcl
resource „aws_instance” „web_server” {
ami = „ami-0c55b159cbfafe1f0”
instance_type = „t2.micro”

tags = {
Name = „WebServer”
}
}
„`

Ansible, kita vertus, yra procedūrinis įrankis, nors ir turi deklaratyvių elementų. Jūs aprašote žingsnius, kuriuos reikia atlikti, naudodami YAML formatą. Ansible naudoja „playbook” koncepciją – tai tarsi scenarijai, kuriuose nurodote, ką ir kokia tvarka daryti.

Ansible pavyzdys:

„`yaml
– name: Įdiegti ir paleisti nginx
hosts: webservers
tasks:
– name: Įdiegti nginx
apt:
name: nginx
state: present
– name: Paleisti nginx
service:
name: nginx
state: started
„`

Esminis skirtumas – Terraform puikiai žino, kokia yra dabartinė infrastruktūros būsena, nes saugo ją state faile. Ansible paprastai neturi tokios išsamios būsenos informacijos ir kiekvieną kartą tikrina sistemą iš naujo.

Būsenos valdymas: didžiulis skirtumas praktikoje

Čia ir prasideda įdomiausi dalykai. Terraform state failas – tai ir palaiminimas, ir prakeiksmas viename. Iš vienos pusės, jis leidžia Terraform tiksliai žinoti, kas buvo sukurta, kas pakeista, ir planuoti tik reikalingus pakeitimus. Tai neįtikėtinai efektyvu.

Bet state failas kelia ir iššūkių. Jei dirbate komandoje, jums reikės remote state backend – paprastai tai S3 su DynamoDB lock’ais AWS atveju arba Terraform Cloud. Kitaip rizikuojate, kad du žmonės vienu metu bandys keisti tą pačią infrastruktūrą, ir viskas sugrius.

Aš asmeniškai esu matęs situacijų, kai state failas buvo prarasta arba sugadinta, ir tada prasideda tikras košmaras. Tenka rankiniu būdu importuoti resursus atgal į state arba, blogiausiu atveju, perkurti viską iš naujo. Todėl labai svarbu:

  • Visada naudoti remote state backend produkcinėje aplinkoje
  • Reguliariai daryti state backup’us
  • Niekada neredaguoti state failo rankiniu būdu (nebent tikrai žinote, ką darote)
  • Naudoti state locking mechanizmą

Ansible šiuo atžvilgiu paprastesnis – jis tiesiog vykdo playbook’us ir tikrina, ar sistema atitinka norimą būseną. Nėra jokio centrinio state failo, apie kurį reikėtų jaudintis. Bet tai reiškia, kad Ansible kartais gali būti lėtesnis, nes jam reikia tikrinti sistemą kiekvieną kartą.

Mokymosi kreivė ir pradžia

Jei tik pradedate, Ansible paprastai yra lengviau įsisavinti. YAML sintaksė intuityvi, dokumentacija puiki, o community modulių biblioteka milžiniška. Galite pradėti nuo paprastų užduočių – pavyzdžiui, įdiegti paketą keliuose serveriuose – ir palaipsniui judėti link sudėtingesnių scenarijų.

Terraform taip pat nėra labai sudėtingas, bet jame yra daugiau koncepcijų, kurias reikia suprasti: providers, resources, data sources, modules, state, workspaces. Pirmą kartą susidūrus su šiais terminais gali būti šiek tiek pribloškiančia.

Tačiau kai įsisavinsite pagrindus, Terraform tampa labai galingas. Jo modulių sistema leidžia kurti pakartotinai naudojamus infrastruktūros komponentus. Pavyzdžiui, galite sukurti modulį, kuris aprašo tipinę trijų lygių web aplikacijos architektūrą AWS, ir tada naudoti jį keliuose projektuose.

Praktinis patarimas pradedantiesiems: pradėkite nuo Ansible, jei jūsų pirminis tikslas – automatizuoti serverių konfigūraciją. Pradėkite nuo Terraform, jei norite valdyti cloud infrastruktūrą (EC2 instances, VPC, databases ir pan.).

Cloud infrastruktūra vs serverių konfigūracija

Čia ir yra pagrindinis skirtumas, kuris turėtų nulemti jūsų pasirinkimą. Terraform iš esmės sukurtas cloud infrastruktūrai valdyti. Jis turi provider’ius beveik visiems populiariems cloud platformoms: AWS, Azure, GCP, DigitalOcean, ir dar šimtams kitų paslaugų.

Kai reikia sukurti VPC, subnets, security groups, load balancer’ius, RDS duomenų bazes – Terraform šviečia. Jis puikiai supranta resursų priklausomybes ir kuria viską teisinga tvarka. Be to, jis gali parodyti, kas pasikeis prieš tai padarydamas (terraform plan), kas produkcinėje aplinkoje neįkainojama.

Ansible, nors ir turi cloud modulių, labiau orientuotas į tai, kas vyksta serverių viduje. Paketo įdiegimas, konfigūracijos failų valdymas, servisų paleidimas, naudotojų kūrimas – tai Ansible teritorija. Jis puikiai tinka:

  • Aplikacijų deployment’ui
  • Serverių konfigūracijos valdymui
  • Saugumo nustatymų taikymui
  • Rutininių užduočių automatizavimui
  • Multi-step deployment procesams

Realybėje daugelis organizacijų naudoja abu įrankius kartu. Terraform sukuria infrastruktūrą (serverius, tinklus, duomenų bazes), o Ansible konfigūruoja tuos serverius (įdiegia software, nustato konfigūracijas, deploy’ina aplikacijas).

Bendruomenė, ekosistema ir palaikymas

Abu įrankiai turi stiprias bendruomenes, bet jos šiek tiek skiriasi. Ansible yra Red Hat produktas (nuo 2015 metų), todėl turi stiprų komercinį palaikymą per Ansible Tower (dabar vadinamas Ansible Automation Platform). Tai puikus pasirinkimas įmonėms, kurioms reikia enterprise lygio palaikymo.

Terraform priklauso HashiCorp ir taip pat turi komercinę versiją – Terraform Cloud ir Terraform Enterprise. Nemokama open source versija labai galinga, bet enterprise versija prideda komandinio darbo funkcijų, policy as code (Sentinel), private module registry ir kitas naudingumas.

Modulių ir rolių ekosistemos:

Terraform Registry turi tūkstančius modulių, kuriuos galite naudoti savo projektuose. Daugelis jų labai kokybiški ir prižiūrimi. AWS, Azure ir GCP patys palaiko oficialius provider’ius, kurie reguliariai atnaujinami.

Ansible Galaxy – tai rolių ir collection’ų saugykla. Čia rasite sprendimus beveik bet kokiai užduočiai. Nors kokybė įvairi, populiarios rolės paprastai gerai prižiūrimos ir dokumentuotos.

Vienas dalykas, kurį pastebėjau: Terraform bendruomenė labiau orientuota į cloud-native sprendimus, o Ansible bendruomenė platesnė ir apima daugiau tradicinių IT operacijų scenarijų.

Našumas ir skalė

Kai infrastruktūra auga, našumas tampa svarbus. Terraform gali būti gana lėtas su dideliais state failais. Jei turite šimtus ar tūkstančius resursų, `terraform plan` gali užtrukti kelias minutes. Yra būdų tai optimizuoti – pavyzdžiui, skaidyti infrastruktūrą į atskirus workspace’us arba naudoti targeted applies, bet tai prideda sudėtingumo.

Ansible našumas priklauso nuo to, kiek hostų valdote ir kaip sudėtingi jūsų playbook’ai. Ansible veikia nuosekliai (nors galite konfigūruoti paralelumą su `forks` parametru), todėl su šimtais serverių gali užtrukti. Ansible AWX arba Automation Platform gali padėti valdyti didelio masto deployment’us efektyviau.

Praktiniai patarimai našumui gerinti:

Terraform:

  • Skaidykite infrastruktūrą į mažesnius, logiškus workspace’us
  • Naudokite `-target` flag’ą, kai reikia atnaujinti tik konkrečius resursus
  • Optimizuokite provider konfigūraciją (pavyzdžiui, AWS provider gali cache’inti credentials)
  • Naudokite remote state su locking mechanizmu

Ansible:

  • Didinkite `forks` skaičių paraleliam vykdymui
  • Naudokite `async` ir `poll` ilgai trunkančioms užduotims
  • Optimizuokite SSH jungtis su ControlPersist
  • Naudokite `strategy: free` kai užduočių tvarka nesvarbi

Testavimas ir CI/CD integracija

Šiuolaikinėje DevOps kultūroje infrastruktūros testavimas yra būtinas. Terraform turi kelis testavimo sluoksnius. Galite naudoti `terraform validate` sintaksės tikrinimui, `terraform plan` pakeitimų peržiūrai, o sudėtingesniam testavimui – įrankius kaip Terratest (Go kalba) arba Kitchen-Terraform.

Ansible testavimui galite naudoti Molecule – tai framework’as, kuris leidžia testuoti roles įvairiose aplinkose (Docker, Vagrant, cloud instances). Taip pat galite naudoti `–check` režimą (dry-run), kuris parodo, kas būtų pakeista, bet nieko nekeičia.

CI/CD pipeline’uose abu įrankiai integruojasi gana sklandžiai. Tipinis workflow’as su Terraform:

1. Developer’is sukuria pull request su Terraform pakeitimais
2. CI sistema paleidžia `terraform fmt -check` ir `terraform validate`
3. Paleidžiamas `terraform plan` ir rezultatai komentaruose PR
4. Po merge į main branch, automatiškai paleidžiamas `terraform apply`

Su Ansible panašiai, tik vietoj plan naudojate `–check` režimą. Vienas iššūkis su Ansible – kaip saugiai laikyti credentials ir secrets. Ansible Vault padeda, bet reikia gerai apgalvoti, kaip jį integruoti į CI/CD.

Kada naudoti ką: praktiniai scenarijai ir išmintis

Po visų šių palyginimų, kaip gi pasirinkti? Atsakymas, kaip dažnai IT srityje, yra „priklauso”. Bet leiskite pasidalinti keliais konkrečiais scenarijais.

Naudokite Terraform, kai:

Jūsų pagrindinis tikslas – valdyti cloud infrastruktūrą. Jei kuriate AWS, Azure ar GCP resursus, Terraform yra natūralus pasirinkimas. Jis puikiai tvarko resursų priklausomybes, leidžia lengvai atkurti visą infrastruktūrą, ir turi puikią ekosistemą.

Jums reikia tiksliai žinoti infrastruktūros būseną. State failas, nors ir prideda sudėtingumo, suteikia neįkainojamą matomumą. Galite bet kada pamatyti, kas sukurta, kas pakeista, ir kas bus pakeista.

Dirbate su multi-cloud aplinka. Terraform abstrahavimo lygis leidžia valdyti resursus skirtinguose cloud’uose panašia sintakse.

Naudokite Ansible, kai:

Jums reikia konfigūruoti serverius ir deploy’inti aplikacijas. Ansible čia tiesiog geresnis – jis turi daugiau modulių, geresnę error handling logiką, ir lengviau aprašyti sudėtingus deployment procesus.

Valdote tradicinę infrastruktūrą ar hybrid aplinką. Jei turite fizinių serverių, VMware, ar mišrią aplinką, Ansible universalumas pravers.

Reikia atlikti ad-hoc užduotis. Ansible puikiai tinka greitiems, vienkartiniams darbams – pavyzdžiui, atnaujinti paketą visuose serveriuose arba pakeisti konfigūraciją.

Naudokite abu kartu, kai:

Turite ir cloud infrastruktūrą, ir sudėtingą aplikacijų deployment procesą. Tai labiausiai paplitęs scenarijus. Terraform kuria infrastruktūrą, o Ansible ją konfigūruoja ir deploy’ina aplikacijas.

Praktiškai tai atrodo taip: Terraform sukuria EC2 instances, RDS duomenų bazę, load balancer’į. Tada Ansible prisijungia prie tų instances, įdiegia reikalingą software, konfigūruoja aplikaciją, ir paleidžia servisus.

Galite net integruoti juos – Terraform gali paleisti Ansible playbook’us per provisioner’ius, nors tai ne visada rekomenduojama (Terraform dokumentacija pataria laikyti provisioning atskirai).

Paskutinis patarimas: nesistenkite viską daryti vienu įrankiu. Kiekvienas įrankis turi savo stipriąsias puses. Geriau išmokti abu ir naudoti kiekvieną ten, kur jis šviečia, nei bandyti pritempti vieną įrankį visoms užduotims. Jūsų infrastruktūra bus patikimesnė, kodas skaitomesnis, o jūs – laimingesni.

Daugiau

Cross-site scripting (XSS) atakos: prevencija ir apsauga