terraform-provider-stackitp.../docs/resources/server.md
João Palet 153947fd7b
Implement key pair resource (#578)
* feat: Implement key pair resource

* feat: Implement acceptance test

* fix: Minor fixes to server and public IP resources

* fix: Lint fixes

* fix: Generalize description

* feat: Update examples to read key from file; Add datasource example

* fix: Fix field descriptions

* fix: Fix example

* feat: Add link to key pair resource in server example

* feat: Add links to key pair resource in other examples
2024-11-05 09:50:55 +00:00

13 KiB

page_title subcategory description
stackit_server Resource - stackit Server resource schema. Must have a region specified in the provider configuration. ~> This resource is in beta and may be subject to breaking changes in the future. Use with caution. See our guide https://registry.terraform.io/providers/stackitcloud/stackit/latest/docs/guides/opting_into_beta_resources for how to opt-in to use beta resources. Example Usage With key pair ```terraform resource "stackitkeypair" "keypair" { name = "example-key-pair" publickey = chomp(file("path/to/idrsa.pub")) } resource "stackitserver" "user-data-from-file" { projectid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" bootvolume = { size = 64 sourcetype = "image" sourceid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" } name = "example-server" machinetype = "g1.1" keypairname = stackitkeypair.keypair.name userdata = file("${path.module}/cloud-init.yaml") } ``` Boot from volume ```terraform resource "stackitserver" "boot-from-volume" { projectid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" name = "example-server" bootvolume = { size = 64 sourcetype = "image" sourceid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" } availabilityzone = "eu01-1" machinetype = "g1.1" keypairname = "example-keypair" } ``` Boot from existing volume ```terraform resource "stackitvolume" "example-volume" { projectid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" size = 12 source = { type = "image" id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" } name = "example-volume" availability_zone = "eu01-1" } resource "stackitserver" "boot-from-volume" { projectid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" name = "example-server" bootvolume = { sourcetype = "volume" sourceid = stackitvolume.example-volume.volumeid } availabilityzone = "eu01-1" machinetype = "g1.1" keypairname = stackitkeypair.keypair.name } ``` Network setup ```terraform resource "stackitserver" "server-with-network" { projectid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" name = "example-server" bootvolume = { size = 64 sourcetype = "image" sourceid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" } machinetype = "g1.1" keypairname = stackitkey_pair.keypair.name } resource "stackitnetwork" "network" { projectid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" name = "example-network" nameservers = ["192.0.2.0", "198.51.100.0", "203.0.113.0"] ipv4prefixlength = 24 } resource "stackitsecuritygroup" "sec-group" { project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" name = "example-security-group" stateful = true } resource "stackitsecuritygrouprule" "rule" { projectid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" securitygroupid = stackitsecuritygroup.sec-group.securitygroupid direction = "ingress" ether_type = "IPv4" } resource "stackitnetworkinterface" "nic" { projectid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" networkid = stackitnetwork.network.networkid securitygroupids = [stackitsecuritygroup.sec-group.securitygroupid] } resource "stackitpublicip" "public-ip" { projectid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" networkinterfaceid = stackitnetworkinterface.nic.networkinterface_id } resource "stackitservernetworkinterfaceattach" "nic-attachment" { projectid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" serverid = stackitserver.server-with-network.serverid networkinterfaceid = stackitnetworkinterface.nic.networkinterfaceid } ``` Server with attached volume ```terraform resource "stackitvolume" "example-volume" { projectid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" size = 12 performanceclass = "storagepremiumperf6" name = "example-volume" availabilityzone = "eu01-1" } resource "stackitserver" "server-with-volume" { projectid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" name = "example-server" bootvolume = { size = 64 sourcetype = "image" sourceid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" } availabilityzone = "eu01-1" machinetype = "g1.1" keypairname = stackitkeypair.keypair.name } resource "stackitservervolumeattach" "attachvolume" { projectid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" serverid = stackitserver.server-with-volume.serverid volumeid = stackitvolume.example-volume.volume_id } ``` Server with user data (cloud-init) ```terraform resource "stackitserver" "user-data" { projectid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" bootvolume = { size = 64 sourcetype = "image" sourceid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" } name = "example-server" machinetype = "g1.1" keypairname = stackitkeypair.keypair.name userdata = "#!/bin/bash\n/bin/su" } resource "stackitserver" "user-data-from-file" { projectid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" bootvolume = { size = 64 sourcetype = "image" sourceid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" } name = "example-server" machinetype = "g1.1" keypairname = stackitkeypair.keypair.name userdata = file("${path.module}/cloud-init.yaml") } ```

stackit_server (Resource)

Server resource schema. Must have a region specified in the provider configuration.

~> This resource is in beta and may be subject to breaking changes in the future. Use with caution. See our guide for how to opt-in to use beta resources.

Example Usage

With key pair

resource "stackit_key_pair" "keypair" {
  name       = "example-key-pair"
  public_key = chomp(file("path/to/id_rsa.pub"))
}

resource "stackit_server" "user-data-from-file" {
  project_id   = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  boot_volume = {
    size        = 64
    source_type = "image"
    source_id   = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
  name         = "example-server"
  machine_type = "g1.1"
  keypair_name = stackit_key_pair.keypair.name
  user_data    = file("${path.module}/cloud-init.yaml")
}

Boot from volume

resource "stackit_server" "boot-from-volume" {
  project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  name       = "example-server"
  boot_volume = {
    size        = 64
    source_type = "image"
    source_id   = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
  availability_zone = "eu01-1"
  machine_type      = "g1.1"
  keypair_name      = "example-keypair"
}

Boot from existing volume

resource "stackit_volume" "example-volume" {
  project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  size       = 12
  source = {
    type = "image"
    id   = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
  name              = "example-volume"
  availability_zone = "eu01-1"
}

resource "stackit_server" "boot-from-volume" {
  project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  name       = "example-server"
  boot_volume = {
    source_type = "volume"
    source_id   = stackit_volume.example-volume.volume_id
  }
  availability_zone = "eu01-1"
  machine_type      = "g1.1"
  keypair_name = stackit_key_pair.keypair.name
}

Network setup

resource "stackit_server" "server-with-network" {
  project_id   = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  name         = "example-server"
  boot_volume = {
    size        = 64
    source_type = "image"
    source_id   = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
  machine_type = "g1.1"
  keypair_name = stackit_key_pair.keypair.name
}

resource "stackit_network" "network" {
  project_id         = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  name               = "example-network"
  nameservers        = ["192.0.2.0", "198.51.100.0", "203.0.113.0"]
  ipv4_prefix_length = 24
}

resource "stackit_security_group" "sec-group" {
  project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  name       = "example-security-group"
  stateful   = true
}

resource "stackit_security_group_rule" "rule" {
  project_id        = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  security_group_id = stackit_security_group.sec-group.security_group_id
  direction         = "ingress"
  ether_type         = "IPv4"
}

resource "stackit_network_interface" "nic" {
  project_id         = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  network_id         = stackit_network.network.network_id
  security_group_ids = [stackit_security_group.sec-group.security_group_id]
}

resource "stackit_public_ip" "public-ip" {
  project_id           = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  network_interface_id = stackit_network_interface.nic.network_interface_id
}

resource "stackit_server_network_interface_attach" "nic-attachment" {
  project_id           = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  server_id            = stackit_server.server-with-network.server_id
  network_interface_id = stackit_network_interface.nic.network_interface_id
}

Server with attached volume

resource "stackit_volume" "example-volume" {
  project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  size       = 12
  performance_class = "storage_premium_perf6"
  name              = "example-volume"
  availability_zone = "eu01-1"
}

resource "stackit_server" "server-with-volume" {
  project_id        = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  name              = "example-server"
  boot_volume = {
    size        = 64
    source_type = "image"
    source_id   = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
  availability_zone = "eu01-1"
  machine_type      = "g1.1"
  keypair_name = stackit_key_pair.keypair.name
}

resource "stackit_server_volume_attach" "attach_volume" {
  project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  server_id  = stackit_server.server-with-volume.server_id
  volume_id  = stackit_volume.example-volume.volume_id
}

Server with user data (cloud-init)

resource "stackit_server" "user-data" {
  project_id   = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  boot_volume = {
    size        = 64
    source_type = "image"
    source_id   = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
  name         = "example-server"
  machine_type = "g1.1"
  keypair_name = stackit_key_pair.keypair.name
  user_data    = "#!/bin/bash\n/bin/su"
}

resource "stackit_server" "user-data-from-file" {
  project_id   = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  boot_volume = {
    size        = 64
    source_type = "image"
    source_id   = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }
  name         = "example-server"
  machine_type = "g1.1"
  keypair_name = stackit_key_pair.keypair.name
  user_data    = file("${path.module}/cloud-init.yaml")
}

Schema

Required

  • machine_type (String) Name of the type of the machine for the server. Possible values are documented in Virtual machine flavors
  • name (String) The name of the server.
  • project_id (String) STACKIT project ID to which the server is associated.

Optional

  • affinity_group (String) The affinity group the server is assigned to.
  • availability_zone (String) The availability zone of the server.
  • boot_volume (Attributes) The boot volume for the server (see below for nested schema)
  • image_id (String) The image ID to be used for an ephemeral disk on the server.
  • keypair_name (String) The name of the keypair used during server creation.
  • labels (Map of String) Labels are key-value string pairs which can be attached to a resource container
  • user_data (String) User data that is passed via cloud-init to the server.

Read-Only

  • created_at (String) Date-time when the server was created
  • id (String) Terraform's internal resource ID. It is structured as "project_id,server_id".
  • launched_at (String) Date-time when the server was launched
  • server_id (String) The server ID.
  • updated_at (String) Date-time when the server was updated

Nested Schema for boot_volume

Required:

  • source_id (String) The ID of the source, either image ID or volume ID
  • source_type (String) The type of the source. Supported values are: volume, image.

Optional:

  • performance_class (String) The performance class of the server.
  • size (Number) The size of the boot volume in GB. Must be provided when source_type is image.