Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Terraform on Oracle Cloud: A Primer for Databas...

Sean Scott
December 03, 2023

Terraform on Oracle Cloud: A Primer for Database Administrators (South Korea - Dec 4)

Sean Scott

December 03, 2023
Tweet

More Decks by Sean Scott

Other Decks in Technology

Transcript

  1. Terraform on Oracle Cloud A Primer for Database Administrators APAC

    Tour '23 December 4, 2023 Seoul, South Korea @ViscosityNA www.viscosityna.com Sean Scott
  2. Database Reliability Engineering Business Continuity ⁘ HA & DR Automation

    ⁘ Observability Real Application Clusters ⁘ Data Guard ⁘ Sharding Containerization ⁘ Terraform ⁘ Ansible Exadata & Engineered Systems AHF ⁘ TFA ⁘ GIMR ⁘ CHA Sean Scott Oracle ACE Director Data on Kubernetes Community Ambassador Managing Principal Consultant Viscosity North America @ViscosityNA www.viscosityna.com
  3. @ViscosityNA www.viscosityna.com Oracle on Docker Running Oracle Databases in Linux

    Containers Free sample chapter: https://oraclesean.com
  4. BOI - SEA 642 km SEA - ICN 8,394 km

    ICN - NRT 1,260 km NRT - MEL 8,144 km MEL - AKL 2,644 km AKL - LAX 10,467 km LAX - BOI 1,085 km 32,635 km
  5. @ViscosityNA www.viscosityna.com @ViscosityNA www.viscosityna.com Latin "terra" (earth), English "form" ter•ra•form

    verb To transform an environment to support life www.viscosityna.com @ViscosityNA
  6. An Infrastructure as Code (IaC) tool from Hashicorp. Terraform defines,

    provisions and manages cloud & on-premises infrastructure. @ViscosityNA www.viscosityna.com Ter•ra•form noun
  7. @ViscosityNA www.viscosityna.com Build a 10-liter aquarium with imperative language •

    Get tank a, pump b, heater c... • Configure them... • Add x liters water... • Add y grams salt... • Set temperature to z°C... • Add n fish...
  8. @ViscosityNA www.viscosityna.com Build a 10-liter aquarium with imperative language •

    Imperative languages scale poorly: • Changing the tank size redefines the assets • Resources may have dependencies • Change requires domain expertise • Should heater capacity change linearly or exponentially to water volume? • Will a tall, skinny tank have different requirements than a short, wide one? • Does surface area affect monitoring and maintenance schedules? • Which intermediate values should round up or down? • Are salinity ratios fixed for all water volumes?
  9. @ViscosityNA www.viscosityna.com Build a 10-liter aquarium with declarative language "I

    want a 10-liter aquarium." @ViscosityNA www.viscosityna.com
  10. @ViscosityNA www.viscosityna.com Providers are implementation experts • Understand dependencies •

    Interpret configurations • Build the declared infrastructure Terraform provider
  11. @ViscosityNA www.viscosityna.com We tell the provider what we want. The

    provider deploys resources for us. Different providers for OCI, Azure, AWS, GCP, etc. Terraform provider
  12. @ViscosityNA www.viscosityna.com • Infrastructure objects available to Terraform • Properties

    defined in the Terraform API • Created & managed by assigning values to properties • Configured via simple text files Terraform resource
  13. @ViscosityNA www.viscosityna.com Resources can be: • Physical: compute, storage, network

    • Dependent: queries against the environment • Dynamic: functions, expressions, loops • Config: security lists, rules, operations • Code: scripts, payloads Terraform resource
  14. @ViscosityNA www.viscosityna.com Terraform projects @ViscosityNA • Files with infrastructure definitions

    • Stored in a common directory • Often managed in a repository (GitHub, etc.)
  15. @ViscosityNA www.viscosityna.com Start a new Terraform project Create a project

    directory & add files: • providers.tf • variables.tf • terraform.tfvars • main.tf • outputs.tf @ViscosityNA Project files: https://github.com/oraclesean/terraform-for-oracle-dbas
  16. @ViscosityNA www.viscosityna.com @ViscosityNA Terraform project styles Everything in one file

    • Can be difficult to read, maintain • main.tf Separate files for each resource • More portable, modular code • compute.tf • storage.tf • variables.tf
  17. @ViscosityNA www.viscosityna.com providers.tf provider "oci" { tenancy_ocid = var.tenancy_ocid region

    = var.region user_ocid = var.user_ocid fingerprint = var.fingerprint private_key_path = var.private_key_path } Resource variables Value assignments Value assignments could go here
  18. @ViscosityNA www.viscosityna.com variables.tf # Terraform tenancy variables variable "tenancy_ocid" {}

    variable "region" {} variable "user_ocid" {} variable "fingerprint" {} variable "private_key_path" {} Variable declarations Value assignment could go here
  19. @ViscosityNA www.viscosityna.com terraform.tfvars # Terraform tenancy variable values tenancy_ocid =

    Your tenancy_ocid region = Your region identifier user_ocid = Your user_ocid fingerprint = Your fingerprint private_key_path = Your private_key_path Same variables as defined in variables.tf Hard-coded variable assignments Limiting hard-coded assignments to terraform.tfvars means no changes are needed elsewhere to run the same configuration on different tenancies, scale, etc.!
  20. @ViscosityNA www.viscosityna.com Test the configuration • In the project directory,

    run: terraform init terraform plan terraform apply @ViscosityNA www.viscosityna.com
  21. @ViscosityNA www.viscosityna.com terraform init > terraform init Initializing the backend...

    Initializing provider plugins... - Finding latest version of hashicorp/oci... - Installing hashicorp/oci v4.76.0... - Installed hashicorp/oci v4.76.0 (signed by HashiCorp) Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary.
  22. @ViscosityNA www.viscosityna.com terraform plan > terraform plan No changes. Your

    infrastructure matches the configuration. Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.
  23. @ViscosityNA www.viscosityna.com terraform apply > terraform apply No changes. Your

    infrastructure matches the configuration. Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed. Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
  24. @ViscosityNA www.viscosityna.com Add an Autonomous Database resource • Add the

    ADB resource in main.tf • Add ADB variables to variables.tf • Add ADB values to terraform.tfvars • Add output variables to output.tf @ViscosityNA
  25. @ViscosityNA www.viscosityna.com main.tf # Autonomous database resource resource "oci_database_autonomous_database" "autonomous_db"

    { compartment_id = var.tenancy_ocid db_name = var.db_name display_name = var.display_name db_version = var.db_version db_workload = var.db_workload cpu_core_count = var.cpu_core_count data_storage_size_in_tbs = var.data_storage_size_in_tbs is_free_tier = var.is_free_tier license_model = var.license_model admin_password = var.admin_password } Type of resource Name assigned to the resource Properties for ADB Values used to create the ADB
  26. @ViscosityNA www.viscosityna.com Add database variables to variables.tf # Autonomous DB

    variables variable "db_name" { type = string } variable "display_name" { type = string } variable "admin_password" { type = string } Variable declarations
  27. @ViscosityNA www.viscosityna.com Add database variables to variables.tf variable "db_version" {

    type = string default = "21c" # Options are 19c, 21c } variable "db_workload" { type = string default = "OLTP" # Options are: OLTP, DW, AJD, APEX } Variable declaration block Set variable type Assign a default value
  28. @ViscosityNA www.viscosityna.com Add database variables to variables.tf variable "cpu_core_count" {

    type = number default = 1 } variable "data_storage_size_in_tbs" { type = number default = 1 }
  29. @ViscosityNA www.viscosityna.com variable "is_free_tier" { type = string default =

    "true" # Must be false for AJD, APEX } variable "license_model" { type = string default = "LICENSE_INCLUDED" } Add database variables to variables.tf
  30. @ViscosityNA www.viscosityna.com Add variable assignments to terraform.tfvars # Autonomous database

    variable values db_name = "ADB21C" display_name = "ADB21C" admin_password = "XXXXXXXXXXXXXXXXXXXXXX" # Default overrides #db_version = #db_workload = #cpu_core_count = #data_storage_size_in_tbs = #is_free_tier = #license_model = ADB values likely to change for each DB To override defaults, un-comment the line and set a value
  31. @ViscosityNA www.viscosityna.com outputs.tf output "db_name" { value = oci_database_autonomous_database.autonomous_db.display_name }

    output "db_state" { value = oci_database_autonomous_database.autonomous_db.state } resource "oci_database_autonomous_database" "autonomous_db" { compartment_id = var.tenancy_ocid db_name = var.db_name display_name = var.display_name ... }
  32. @ViscosityNA www.viscosityna.com terraform plan > terraform plan Terraform used the

    selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # oci_database_autonomous_database.autonomous_db will be created + resource "oci_database_autonomous_database" "autonomous_db" { + actual_used_data_storage_size_in_tbs = (known after apply) + admin_password = (sensitive value) ...
  33. @ViscosityNA www.viscosityna.com terraform plan (Continued) ... Plan: 1 to add,

    0 to change, 0 to destroy. Changes to Outputs: + db_name = "ADB21C" + db_state = (known after apply) ──────────────────────────────────────────────────────────────────────────── Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.
  34. @ViscosityNA www.viscosityna.com terraform apply > terraform apply ... Plan: 1

    to add, 0 to change, 0 to destroy. Changes to Outputs: + db_name = "ADB21C" + db_state = (known after apply) Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes
  35. @ViscosityNA www.viscosityna.com ... Enter a value: yes oci_database_autonomous_database.autonomous_db: Creating... oci_database_autonomous_database.autonomous_db:

    Still creating... [10s elapsed] ... oci_database_autonomous_database.autonomous_db: Creation complete after 1m31s Apply complete! Resources: 1 added, 0 changed, 0 destroyed. Outputs: db_name = "ADB21C" db_state = "AVAILABLE" terraform apply (Continued)
  36. @ViscosityNA www.viscosityna.com How does Terraform help the DBA? @ViscosityNA •

    Streamlines & simplifies database creation • Codifies & standardizes processes • Consistent environments, from dev to prod • Reduces DBA workload • Lowers dependence/waiting for DBA resources • Accelerates development, innovation