# Using the Terraform provider This is a terraform plugin for controlling Metalcloud resources. * [MetalCloud Terraform provider documentation](https://registry.terraform.io/providers/metalsoft-io/metalcloud/latest/docs) ## Using the Provider A terraform `main.tf` template file, for an infrastructure with a single server would look something like this: ``` terraform { required_providers { metalcloud = { source = "metalsoft-io/metalcloud" } } } provider "metalcloud" { endpoint = var.endpoint user_email = var.user_email api_key = var.api_key } data "metalcloud_site" "dc" { label = "${var.site}" } data "metalcloud_fabric" "wan" { site_id = data.metalcloud_site.dc.site_id label = "wan-fabric" } data "metalcloud_logical_network_profile" "np01" { label = "np-01" fabric_id = data.metalcloud_fabric.wan.fabric_id } data "metalcloud_server_type" "srv1" { label = "M.16.64.2" } data "metalcloud_os_template" "os1" { label = "ubuntu-22-04" } data "metalcloud_infrastructure" "infra" { site_id = data.metalcloud_site.dc.site_id label = "my-infra01" create_if_missing = true } resource "metalcloud_logical_network" "net1" { infrastructure_id = data.metalcloud_infrastructure.infra.infrastructure_id logical_network_profile_id = data.metalcloud_logical_network_profile.np01.logical_network_profile_id name = "net01" label = "net01" } resource "metalcloud_server_instance_group" "inst01" { infrastructure_id = data.metalcloud_infrastructure.infra.infrastructure_id name = "inst01" label = "inst01" instance_count = 1 server_type_id = data.metalcloud_server_type.srv1.server_type_id os_template_id = data.metalcloud_os_template.os1.os_template_id network_connections = [ { logical_network_id = metalcloud_logical_network.net1.logical_network_id tagged = true access_mode = "l2" mtu = 1500 } ] custom_variables = [ { name = "key1" value = "test1" }, { name = "key2" value = "test2" } ] depends_on = [ metalcloud_logical_network.net1, ] } # Use this resource to effect deploys of the above resources. resource "metalcloud_infrastructure_deployer" "infrastructure_deployer" { infrastructure_id = data.metalcloud_infrastructure.infra.infrastructure_id # Set this to false to actually trigger deploys. prevent_deploy = true # These options will make terraform apply operation will wait for the deploy to finish (when prevent_deploy is false) # instead of exiting while the deploy is ongoing await_deploy_finish = false # This option disables a safety check that metalsoft performs to prevent accidental data loss # It is required when testing delete operations allow_data_loss = true # IMPORTANT. This is important to ensure that deploys happen after everything else. If you need to add or remove resources dynamically # use either count or for_each in the resources or move everything that is dynamic into a module and make this depend on the module depends_on = [ metalcloud_server_instance_group.inst01, ] } variable "endpoint" { default ="" } variable "api_key" { default = "" } variable "logging" { default="false" } variable "site" { default="" } ``` Initialize the provider with your API key and the api endpoint either by using environment variables or -var. ```bash export TF_VAR_api_key="" export TF_VAR_user_email="test@test.com" export TF_VAR_endpoint="https://api.env.metalsoft.io/metal-cloud" export TF_VAR_site="uk-reading" ``` Initialize the provider: ```bash terraform init ``` To deploy this infrastructure export the following variables (or use -var): The plan phase: ```bash terraform plan ``` The apply phase: ```bash terraform apply ``` To delete the infrastrucure: ```bash terraform destroy ```