Univerzální nástroj na všechny cloudy: Terraform pro vaši Infrastructure as Code

Asi už víte, že jsem velký fanoušek deklarativních modelů. Popíšete požadovaný výsledný stav a necháte robota vás do něj automaticky dovést. Nemusíte implerativním modelem řešit správnou sekvenci příkazů ani if/else situace. Nemusíte myslet v algoritmech. Imperativní zápis (třeba skript) je velmi závislý na tom pro co se píše - příkazy jsou specické pro providera, ale i postup operací a jejich pořadí - deklarativní modely jsou daleko univerzálnější. A skutečně - Terraform je zaměřen především na svět tří megacloudů: Microsoft Azure, AWS a Google. Jeden nástroj pro všechny tyto platformy.

Připomínka deklarativního přístupu k infrastruktuře

Deklarativní model popisuje co chcete a robot to vykoná, zajistí váš desired state. Na úrovni OS (správa stavu balíčků a aplikací) je velmi deklarativní třeba Puppet, SaltStack nebo PowerShell DSC. Další dva velmi oblíbené nástroje Ansible a Chef jsou na úrovni dílčích úloh imperativní (jde o sekvenci úkonů a pořadí je důležité), ale na úrovni větších celků se mohou chovat deklarativně (například role v Ansible) a také na nejmenším stupni abstrahují od nízkoúrovňových imperativních postupů (například moduly v Ansible). Zaměřme se ale na infrastrukturu samotnou. Tam můžete také použít configuration management nástroje, například Ansible má velmi dobrou podporu pro Azure, ale já se chci zaměřit na rize deklarativní systémy od začátku namířené na infrastrukturu, ne OS. Jaké máme možnosti?

Deklarativní přístupy v "těch cloudech"

Obvykle každý moderní cloud má svůj vlastní deklarativní model, který je pro něj specifický a perfektně mu sedne. Azure ARM, AWS CloudFormation, OpenStack Heat apod. V případě Azure je dokonce samotným srdcem celého systému, ne přídavkem. ARM je jakýsi koncentrátor pro jednotlivé providery zdrojů (například compute, network apod.) a ARM šablona je přímo popisem pro něj. Nad tím pak vzniká externí REST API a teprve nad tímto API pak pracuje CLI, GUI a všechny další prostředky ovládání. U ostatních systémů může být evoluce jiná, ale v každém případě platí jedno - vlastní nástroje konkrétního systému mají vždy největší podporu pro portfolio poskytovale a zejména novinky, které uvádí. Nástroje třetích stran jsou vždy o něco pozadu (z důvodů na straně jak cloudu, kdy v okamžiku release služby nemusí být ještě hotová třeba knihovna do Go SDK, na kterém třeba Terraform staví, tak nástroje, kdy vývojářům nějakou dobu trvá se s funkcí seznámit a podporu napsat) a vzhledem k rychlosti vývoje to může být omezující. U významných cloudů jako je Azure a AWS nebývá prodleva delší jak 6 měsíců, ale pro řešení typu VMware či OpenStack je podpora často zastaralá, nekompletní a nevyvijí se tak aktivně.

Nicméně - třeba chcete mít možnost jedním mechanismem a jazykem vytvářet infratrukturu v různých cloudech.  Dokonce vám můžete jít jen o tu "možnost" - reálně chcete pracovat jen s Azure, ale chcete mít zadní vrátka a investovat rozvoj svých znalostí do něčeho, co se vám bude hodit i když svou strategii cloudového poskytovatele změníte. Terraform je na to výborná volba a já ji považuji ve světě univerzálních nástrojů za nejlepší.

Co je Terraform

Jde o nástroj z dílny Hashicorp, borců, kteří před mnoha lety dali světu legenární Vagrant a dnes kromě Terraform nabízí i další zajímavé nástroje jako je Vault pro správu klíčů, Consul pro service discovery (ten je skvělý!), Packer pro automatizovanou tvorbu imagů nebo Nomad pro provoz aplikací a kontejnerů (tam ale konkuruje třeba Kubernetes, na který sázím daleko víc).

Terraform je deklarativní nástroj pro infrastrukturu a podporuje řadu providerů včetně Azure. Je neuvěřitelně jednoduchý - to je jeho největší síla. Je napsaný v Go a díky tomu je kompilovaný do jediného binárního souboru, ve kterém je všechno potřebné. Ano - žádná instalace, žádná nutnost nejprve rozchodit Javu, Python, Node a tak podobně. Jen jeden soubor pro váš OS a to je celé. Předpis pro infrastrukturu píšete deklarativním jazykem, který je podobný JSON, ale je lépe čitelný pro neprogramátorsky založené administrátory (má méně uvozovek a rovnítka místo dvoujteček) s podporou proměnných (nicméně předpisy můžete psát i v čistém JSON pokud chcete). Pro správu a opakovatelnost můžete uzavírat větší celky do modulů a ty využívat v hlavním předpisu.

Terraform si vytváří state soubor. Nejen tedy, že provede provisioning podle vašeho předpisu, ale uloží si informace o výsledném stavu (tedy udrží si všechna vzniklá ID resourců v Azure apod.). Můžete pak použít příkaz terraform plan a on vám řekne jestli reálný stav odpovídá požadovanému. Pokud ne, tak vam napíše svůj plán - kroky, které bude muset udělat, aby se stav stal tím požadovaným (napíše vám co přidá, změní, odmaže). Terraform tak můžete použít nejen na provisioning, ale i kompletní životní cyklus infrastruktury. Změnu v nastavení firewall pravidla v komplexním prostředím udělejte přímo v předpisech. Terraform je dost chytrý na to, aby zjistil kde co chybí a dodělal to.

To co mě na Terraform fascinuje nejvíc je jejich inteligentní dependency graph. Je to deklarativní nástroj, takže by vás nemělo zajímat pořadí operací a konkrétní procedura vedoucí k dosažení požadovaného stavu. Nicméně některé zdroje mají na sebe návaznost - těžko vytvořit síťovou kartu v síti, která ještě neexistuje. U mnoha jiných jazyků musíte enginu pomoci a v předpisu zdůraznit "depends on". Terraform tu možnost má taky, ale v 99% případů ji nepotřebujete - přijde na to sám. Dělá to opravdu výborně a nepřehání to. Jednoduché řešení by bylo provádět operace sekvenčně (jak byste to dělali pokud si napíšete třeba PowerShell skript), ale Terraform čeká jen tam, kde je to nutné (tam kde detekuje dependency). Jinak řečeno Terraform používá maximální paralelismus. Infrastrukturu v něm postavíte daleko (u větší infrastruktury řádově) rychleji, než skriptováním (a o klikání v GUI ani nemluvě).

Podívejme se na příklad

Podívejte se na ukázku, kterou jsem si v Terraform připravil: https://github.com/tkubica12/terraform_azure_demo

Vytvořil jsem opakovatelné moduly. Jeden vytvoří farmu VM pro web servery a napojí je do load balanceru. Druhý si bere na starost založení Azure storage, registru pro Docker image (ACR) a vytvoření Kubernetes clusteru (ACS). Třetí modul připraví Azure SQL DB. Každý modul má nějaké vstupní parametry jako je počet nodů, výkonnostní kategorie DB a tak podobně. Je tedy opakovaně použitelný.

V hlavním předpisu kromě vytvoření sdílené infrastruktury ve formě VNETu volám výše zmíněné moduly. Nejprve pro produkční prostředí, ale následně pro testovací. Stejný modul/postup, ale jiné vstupní parametry (menší výkon, méně nodů apod.). Projděte si předpisy - myslím, že díky jednoduchému jazyku jsou docela samovysvětlující.

 

Vsaďte na Azure ve vaší cloudové strategii a pokud chcete být produktu co nejblíž a využívat Infrastructure as Code deklarativní koncepty pro něj nativní, použijte ARM, o kterém jsem psal v jiném článku (a mimochodem pro lokální rozšíření vašeho Azure ve formě Azure Stack funguje ARM taky). Chcete ze strategických důvodů vsadit na výborný nástroj třetí strany? Za mne je pak volba jasná - Terraform (a doporučuji zvážit placenou verzi zejména z důvodu řízení přístupu a koordinace vícero administrátorů).



Jak na Terraform pro Azure služby, které jsou zatím jen v Preview Automatizace
Datové hřiště - zpracování proudu událostí s Azure Stream Analytics nakopnuté Terraformem Automatizace
Datové hřiště - generátory fake dat do kontejneru zabalené Terraformem v Azure nahozené Automatizace
Datové hřiště - jak si hrát s daty bez sebemenšího kliknutí s Terraform a Azure Automatizace
Federace tokenů GitHub Actions s Azure Active Directory pro přístup z vaší CI/CD do Azure bez hesel Automatizace