2. září 2024

Terraform: Infrastruktura jako kód

Terraform je nástroj, kterým můžeme spravovat infrastrukturu jako kód. Co to znamená a proč je to důležité? Aneb konec klikání v konzoli a hledání, jak jsme vlastně ten server před rokem nastavili.

Předchůdci

Než se podíváme na Terraform, chtěl bych zmínit jeho předchůdce. Ansible, Puppet a Chef.

Níže v článku srovnám Terraform s Ansible. Jednak proto, že Ansible je velmi známý a rozšířený v Česku. A také proto, že na rozdíl od ostatních alternativ, Ansible nepotřebuje agenta (program, klienta), který běží na cílových serverech. Stejně jako Terraform.

Puppetu a Chefu se věnovat nebudu, jednak z mé zkušenosti v Česku nejsou ani zdaleka tak populární a zároveň jsou podobné Ansible.

Terraform

HashiCorp Terraform logo

Myšlenka Terraformu se zrodila už v roce 2011, kdy Mitchell Hashimoto psal na svém blogu o AWS CloudFormation, a že na trhu chybí open-source alternativa, nezávislá na AWS. Když se k jeho nespokojenosti tohoto nápadu nikdo pár let neujal, začal s tím sám a v roce 2014 vyšla první verze Terraformu, v0.1.

Dnes je Terraform (asi) nejznámější a nejúspěšnější DevOps nástroj pro správu infrastruktury a to nejen ve veřejném cloudu. Aktuálně je poslední verzí verze 1.9.5 a už se pracuje na další verzi 1.10.

Díky Terraformu můžeme popsat infrastrukturu jako kód (Infrastructure as Code, IaC) a tím získat mnoho výhod:

Jiný pohled

Terraform staví na deklarativním modelu tvorby a správy zdrojů (resources) napříč různými poskytovateli (providers), jako je AWS, Azure, GCP a další.

Co znamená deklarativní? To znamená, že v Terraformu popisujete co chcete a jak má vypadat výsledný stav. Opakem je imperativní model, kde popisujete jednotlivé kroky, jak se dostat z bodu A do bodu B. Pro přestavu imperativní jsou například skripty v Bashi, Pythonu nebo třeba Ansible.

Základní koncepty

V Terraformu se potkáte s řadou pojmů, které byste měli znát nebo alespoň tušit, že existují.

Práce s Terraformem

Práce s Terraformem probíhá v příkazové řádce, teď se podíváme na nejdůležitější příkazy.

Terraform a GitLab CI

Ukážeme si, jak jednoduše spojit Terraform a GitLab CI. Takže Terraform nemusíme spoutět my, ale postará se o to GitLab CI pipeline.

  1. Vytvoříme soubor .gitlab-ci.yml v kořenovém adresáři repozitáře.

  2. Do souboru přidáme následující obsah:

    include:
    - template: Terraform/Base.gitlab-ci.yml
    - template: Jobs/SAST-IaC.gitlab-ci.yml
    
    stages:
    - validate
    - test
    - build
    - deploy
    - cleanup
    
    fmt:
    extends: .terraform:fmt
    needs: []
    
    validate:
    extends: .terraform:validate
    needs: []
    
    build:
    extends: .terraform:build
    
    deploy:
    extends: .terraform:deploy
    dependencies:
      - build
    environment:
      name: $TF_STATE_NAME
    

    Všiměte si, že většinu konfigurace CI pipeline prakticky vůbec nepíšeme, ale používáme šablony od GitLabu. Pokud Vás zajímá, co šablona přesně dělá, můžete se podívat: https://gitlab.com/gitlab-org/gitlab-foss/tree/master/lib/gitlab/ci/templates

  3. Nakonfigurujeme Terraform, aby použil GitLab jako backend.

    terraform {
      backend "http" {
        address = "https://gitlab.com/api/v4/projects/1234/terraform/state"
        lock_address = "https://gitlab.com/api/v4/projects/1234/terraform/lock"
        unlock_address = "https://gitlab.com/api/v4/projects/1234/terraform/lock"
        username = "gitlab-ci-token"
        password = "CI_JOB_TOKEN"
      }
    }
    
  4. Přidáme .tf soubory do repozitářeme a provedem push, GitLab se postará o zbytek (samozřejmě je třeba nastavit GitLab CI environment proměnné, pokud jsou třeba. Například token pro přístup do Cloudflare apod.).

Pro lokální práci s Terraformem, pokud je backend nastavený na GitLab, je třeba jej lokálně nakonfigurovat:

export GITLAB_USERNAME="gitlab-username"
export GITLAB_ACCESS_TOKEN="xxx"

terraform init -reconfigure \
  -backend-config=username=$GITLAB_USERNAME \
  -backend-config=password=$GITLAB_ACCESS_TOKEN \
  -backend-config=lock_method=POST \
  -backend-config=unlock_method=DELETE \
  -backend-config=retry_wait_min=5

Pokud bychom chtěli i automatickou destroy operaci, například pro demo prostředí apod. Můžeme upravit .gitlab-ci.yml soubor:

deploy:
  extends: .terraform:deploy
  rules:
    - if: $CI_COMMIT_TITLE != "destroy"
      when: on_success
  dependencies:
    - build
  environment:
    name: $TF_STATE_NAME

cleanup:
  extends: .terraform:destroy
  environment:
    name: $TF_STATE_NAME
  rules:
    - if: $CI_COMMIT_TITLE == "destroy"
      when: on_success

Terraform vs Ansible

TerraformAnsible
ModelDeklarativníImperativní
VyvíjíHashiCorpRedHat
LicenceBUSL (bussiness, pouze public-source)*GPL-3 (open-source, copyleft)
FormátHCL (HashiCorp Configuration Language)YAML
RozšiřitelnostAno, moduly a GolangAno, role a Python
Dokumentace**9/107/10

*BUSL licence: je podobná běžným open-source licencím a nezakazuje použití Terraformu ve firmách. Ale zakazuje komerční distribuci nebo přímou integraci Terraformu do produktu, v tom případě je třeba kontaktovat HashiCorp a uzavřít smlouvu. Pokud je pro vás licence problém, podívejte se na open-source projekt OpenTofu, který je kompatibilní s Terraformem jedná se totiž o fork.

**Dokumentace: beru v potaz oficiální dokumentaci, ne dokumentaci pro komunitní projekty nebo třetí strany. A je to samozřejmě moje subjektivní hodnocení.

Jak jsem již psal, největší rozdíl je v tom, jaký model jednotlivé nástroje využívají. Terraform je deklarativní, tj. popisujeme výsledný stav který chceme. Zatímco Ansible je imperativní a popisujeme jak se dostat ze stavu A do stavu B.

Terraform je dnes velice populární v cloudovém světě, hlavně díky tomu, že deklarativní model jde s cloudem ruku v ruce. Můžu si server vytvořit jak chci, kolik serverů chci a pak je zase zahodit. To dříve, kdy se servery nakupovaly nešlo.

To ale neznamená, že Ansible ztratil své místo, stále je spousta datacenter která je třeba spravovat. A stále je spousta firem, které veřejnému cloudu prostě nevěří, a nebo jej nemohou využívat kvůli legislativě. Pro ty je Ansible stále velmi často nepostradatelným nástrojem, který využívají ke správě serverů.

Zároveň je třeba podoknout, že Terraform a Ansible nejsou přímými konkurenty. Terraform se stará o tvorbu a správu zdrojů (serverů, DNS záznamů, certifikátů apod.), zatímco Ansible je zaměřen na konfiguraci existujícího serveru a jeho dlouhodobou údržbu. V triviálním přirovnání se Ansible stará o vnitřek krabice, zatímco Terraform o to, kolik a jakých krabic chceme.

Nejen pro public cloud

Terraform provider dnes může vytvořit úplně každý, kdo umí trochu psát Golang. A proto existuje provider prakticky pro cokoliv. Od AWS, Azure, GCP, Cloudflare, přes OpenStack, GitLab a GitHub až po Keycloak nebo Google Workspace nebo i Unifi (Ubiquiti) routery.

Terraform a DevOps

Terraform se stal klíčovým a pratikcy nepostradatelným DevOps nástrojem při správě infrastruktury. Nejen díky jeho schopnostem a možnostem, ale i díky integraci s dalšími DevOps nástroji, jako je třeba GitLab.

Zároveň se Terraform těší velké oblibě v DevOps komunitě, i když nedává změna licence vyvolala řadu otázek a diskuzí o budoucnosti projektu, přesto je Terraform stále nesmírně populární.

HashiCorp

HashiCorp logo

Jak jsem psal v úvodu, Terraform vytvořil Mitchell Hashimoto, který je spoluzakladatelem firmy HashiCorp. Dnes už však firmu definitivně opustil a věnuje se dalším projektům.

HashiCorp je dominantním hráčem na poli DevOps nástrojů a správy infrastruktry. Ale Terraform není jejich jediným produktem, naopak, mají jich celou řadu:

Terraform v praxi

Jako konzultant, ale i jako vývojář mám Terraform nesmírně rád. Umožňuje mi popsat infrastrukturu jako kód a v Gitu ji sdílet s kolegy a s budoucími kolegy. Je to jednotný, standardizovaný zápis (Terraform má vlastní integrovaný formater, který vám kód zformátuje terraform fmt). Je v něm vše pohromadě a není třeba nic dohledávat v konzoli nebo se ptát kolegů, kde jsme k takovému kusu infrastruktury přišli a jak je to vlasně nastavené.

Terraform školení

Pokud Vás zajímá Terraform více do hloubky a chtěli byste se s ním naučit víc nebo chcete aby Váš tým začal Terraform používat, přijďte na moje školení Terraformu. Školení probíhá formou workshopu, kde si práci s Terraformem všichni sami vyzkouší. Buď přijďte na veřejný termín nebo se domluvme na firemním školení.