Terraform discovery OCI zdrojů

Nedávno náš tým publikoval novou službu (o které se nebudu moc šířit) a jelikož součástí jsou i věci, týkající se oblasti Infrastructure as Code (což mě hodně zajímá) napsal jsem k tomu v angličtině nějaké články, které teď uvádím v češtině.

Pojďme začít krátkým a stručným úvodem, co to je OCI a Terraform.

  • Oracle Cloud Infrastructure (OCI), aka. Oracle Cloud nabízí moderní set cloudových zdrojů — od síťové infrastruktury, přes compute instance, až po Kubernetes a Hadoop clustery. A spoustu dalších věcí.
  • Terraform je vedoucí a trend-setting řešení pro koncept Infrastructure as Code — umožňuje definici a provisioning cloudové infrastruktury pomocí deskriptivního konfiguračního jazyka a podporuje spoustu cloudových poskytovatelů — mmj. AWS, GCP, Azure a samozřejmě, OCI.

Jak jdou tyhle dvě věci — OCI & Terraform — dohromady? OCI poskytuje několik způsobů, jak komunikovat s cloudovými produkty a zdroji:

  • UI console
  • REST API
  • SDK pro různé jazyky (Java, Python, Golang, Ruby)
  • CLI klient
  • Terraform provider

Terraform Discovery

Terraform discovery — “objevení”, či reverse-engineering existující zdrojů — je relativně nová feature, která umožňuje zmapovat OCI zdroje v určitém kompártmentu a následně vytvořit potřebné Terraform konfigurační soubory.

Existuje řada use casů, kdy se tato discovery feature může hodit:

  • migrujeme na Infrastructure as Code,
  • určité zdroje byly vytvořeny jiným způsobem (console, SDK, atd.) a my bychom chtěli reprodukovatelné řešení založené na industriálním standardu,
  • zálohování komplexní infrastruktury, ad.

Dokumentaci pro Terraform discovery lze najít na stránce: Discovering Terraform resources in an Oracle Cloud Infrastructure compartment.

Discovery OCI zdrojů

Řekněme, že máme následující jednoduchý use case:

  1. Máme vytvořeno několik základních (core) OCI zdrojů.
  2. Chceme stav a konfiguraci těchto zdrojů dokumentovat a uložit.

Existující OCI zdroje

Pro jednoduchost, máme vytvořené 2 compute instance, s následující konfigurací. Samozřejmě, jsou tam další příslušné zdroje, jako: VCN, subnet, seclist atd. Každopádně si dovememe představit daleko složitější infrastrukturu pro nějaký reálný scénář.

Nastavení Terraformu

Vynechám podrobnosti jak nainstalovat a nakonfigurovat Terraform a pouze ukážu, jak získat potřebnou verzi Terraform OCI Provideru. Pro autentikaci vás odkážu na oficiální dokumentaci.

Protože začínáme v prázdném adresáři, musíme Terraformu nějak říct, s jakou verzí provideru chceme pracovat. To můžeme udělat pomocí následujícího souboru:

Teď jen potřebujeme spustit příkaz terraform init a stáhne se nám daná verze provideru.

Plugin provideru je umístěn v adresáři .terraform/plugins/<architecture>.

Nebude od věci si pro pozdější použití vytvořit symbolický link:

ln -s .terraform/plugins/linux_amd64/terraform-provider-oci_v3.69.0_x4 terraform-provider-oci

Terraform discovery

Jakmile máme připraveno, je použití přímočaré:

Plugin se připojí do OCI, udělá discovery a zapíše konfigurační soubory do výstupního adresáře:

Pokud se podíváme do souboru core.tf uvidíme povědomé hodnoty z naší compute instance:

Generování Terraform stavu

Jedna ze silných stránek Terraformu je Terraform State — ačkoliv se Terraform chová ke zdrojům jako by byly immutable, tak interně si drží jejich stav. 🤓 (Tento stav může být buď lokální, nebo remote, ale to už je úplně jiný příběh.)

Naštěstí, Terraform OCI Provider negeneruje jenom konfigurační soubory, ale také soubor pro (lokální) stav. Jediný co potřebujeme, je pustit výše uvedený příkaz s přepínačem -generate_state.

A voilà, máme stav (podívejte se do souboru terraform.tfstate):

Tak, a teď už můžeme používat Terraform tak, jak jsme běžně zvyklí.

Které zdroje jsou objevitelné?

Jak OCI, tak Terraform jsou rychle se rozvíjející dynamické systémy a nové vlastnosti organicky přibývají. Discovery je relativně nová feature a tak ne všechny OCI zdroje jsou podporované pro reverse-engineering.

Seznam objevitelných zdrojů získáme příkazem:

terraform-provider-oci -command=list_export_resources

Aktuálně podporuje plugin následující zdroje a služby:

  • identity
  • core (instances, network etc.)
  • database
  • load_balancer
  • object_storage
  • tagging
  • bds (Big Data Service)

Původní články v angličtině