---
title: "Создать облачный сервер произвольной конфигурации с загрузочным и дополнительным сетевыми дисками через Terraform"
sidebar_label: 'Создать сервер произвольной конфигурации с загрузочным и дополнительным сетевыми дисками'
sidebar_position: 5
description: "Как создать облачный сервер произвольной конфигурации с загрузочным сетевым диском и дополнительным сетевым диском"
---

import Formbricks from '@theme/MDXComponents/Formbricks'
import ConfigureProviders from '@site/terraform/_partials/common/configure-providers.mdx'
import ConfigureProvidersConfig from '@site/terraform/_partials/common/configure-providers-config.mdx'
import CreateRouter from '@site/terraform/_partials/cloud-networks/create-router.mdx'
import CreateNetworks from '@site/terraform/_partials/cloud-networks/create-networks.mdx'
import AddPublicSsh from '@site/terraform/_partials/cloud-servers/add-public-ssh-key.mdx'
import CreatePort from '@site/terraform/_partials/cloud-servers/create-port.mdx'
import GetImage from '@site/terraform/_partials/cloud-servers/get-image.mdx'
import CreateResourcesAlert from '@site/terraform/_partials/common/create-resources-alert.mdx'
import CreateBootVolume from '@site/terraform/_partials/cloud-servers/create-boot-volume.mdx'
import CreateAdditionalVolume from '@site/terraform/_partials/cloud-servers/create-additional-volume.mdx'
import CreatePublicIp from '@site/terraform/_partials/cloud-networks/create-public-ip.mdx'
import AssociateIp from '@site/terraform/_partials/cloud-networks/associate-ip.mdx'
import GetIp from '@site/terraform/_partials/cloud-networks/get-ip.mdx'
import CreateFlavorWithNetworkVolume from '@site/terraform/_partials/cloud-servers/create-flavor-with-network-volume.mdx'

# Создать облачный сервер произвольной конфигурации с загрузочным и дополнительным сетевыми дисками через Terraform

<CreateResourcesAlert />

<br />

1. Опционально: [настройте провайдеры](#configure-providers).
2. [Добавьте публичный SSH-ключ](#add-public-ssh-key).
3. [Создайте флейвор с сетевым диском](#create-flavor).
4. [Создайте приватную сеть и подсеть](#create-networks).
5. [Создайте облачный роутер, подключенный к интернету](#create-router).
6. [Создайте порт для облачного сервера](#create-port).
7. [Получите образ](#get-image).
8. [Создайте загрузочный сетевой диск](#create-boot-volume).
9. [Создайте дополнительный сетевой диск](#create-additional-volume).
10. [Создайте облачный сервер](#create-server).
11. [Создайте публичный IP-адрес](#create-public-ip).
12. [Ассоциировать публичный и приватный IP-адреса облачного сервера](#associate-ip).
13. [Получите IP-адрес облачного сервера](#get-ip).

## Конфигурационные файлы \{#config}

<details>
  <summary>Пример файла для настройки провайдеров</summary>

  <ConfigureProvidersConfig />
</details>

<details>
  <summary>Пример файла для создания сервера</summary>

  ```hcl
  resource "selectel_vpc_keypair_v2" "keypair_1" {
    name       = "keypair"
    public_key = file("~/.ssh/id_rsa.pub")
    user_id    = selectel_iam_serviceuser_v1.serviceuser_1.id
  }

  resource "openstack_compute_flavor_v2" "flavor_1" {
    name      = "custom-flavor-with-network-volume"
    vcpus     = 2
    ram       = 2048
    disk      = 0
    is_public = false

    lifecycle {
      create_before_destroy = true
    }

  }

  resource "openstack_networking_network_v2" "network_1" {
    name           = "private-network"
    admin_state_up = "true"
  }

  resource "openstack_networking_subnet_v2" "subnet_1" {
    network_id = openstack_networking_network_v2.network_1.id
    cidr       = "192.168.199.0/24"
  }

  data "openstack_networking_network_v2" "external_network_1" {
    external = true
  }

  resource "openstack_networking_router_v2" "router_1" {
    name                = "router"
    external_network_id = data.openstack_networking_network_v2.external_network_1.id
  }

  resource "openstack_networking_router_interface_v2" "router_interface_1" {
    router_id = openstack_networking_router_v2.router_1.id
    subnet_id = openstack_networking_subnet_v2.subnet_1.id
  }

  resource "openstack_networking_port_v2" "port_1" {
    name       = "port"
    network_id = openstack_networking_network_v2.network_1.id

    fixed_ip {
      subnet_id = openstack_networking_subnet_v2.subnet_1.id
    }
  }

  data "openstack_images_image_v2" "image_1" {
    name        = "Ubuntu 20.04 LTS 64-bit"
    most_recent = true
    visibility  = "public"
  }

  resource "openstack_blockstorage_volume_v3" "volume_1" {
    name                 = "boot-volume-for-server"
    size                 = "5"
    image_id             = data.openstack_images_image_v2.image_1.id
    volume_type          = "fast.ru-9a"
    availability_zone    = "ru-9a"
    enable_online_resize = true

    lifecycle {
      ignore_changes = [image_id]
    }

  }

  resource "openstack_blockstorage_volume_v3" "volume_2" {
    name                 = "additional-volume-for-server"
    size                 = "7"
    volume_type          = "universal.ru-9a"
    availability_zone    = "ru-9a"
    enable_online_resize = true
  }

  resource "openstack_compute_instance_v2" "server_1" {
    name              = "server"
    flavor_id         = openstack_compute_flavor_v2.flavor_1.id
    key_pair          = selectel_vpc_keypair_v2.keypair_1.name
    availability_zone = "ru-9a"

    network {
      port = openstack_networking_port_v2.port_1.id
    }

    lifecycle {
      ignore_changes = [image_id]
    }

    block_device {
      uuid             = openstack_blockstorage_volume_v3.volume_1.id
      source_type      = "volume"
      destination_type = "volume"
      boot_index       = 0
    }

    block_device {
      uuid             = openstack_blockstorage_volume_v3.volume_2.id
      source_type      = "volume"
      destination_type = "volume"
      boot_index       = -1
    }

    vendor_options {
      ignore_resize_confirmation = true
    }
  }

  resource "openstack_networking_floatingip_v2" "floatingip_1" {
    pool = "external-network"
  }

  resource "openstack_networking_floatingip_associate_v2" "association_1" {
    port_id     = openstack_networking_port_v2.port_1.id
    floating_ip = openstack_networking_floatingip_v2.floatingip_1.address
  }

  output "public_ip_address" {
    value = openstack_networking_floatingip_v2.floatingip_1.fixed_ip
  }
  ```
</details>

## 1. Опционально: настроить провайдеры \{#configure-providers}

Если вы настроили провайдеры Selectel и OpenStack, пропустите этот шаг.

<ConfigureProviders />

## 2. Добавить публичный SSH-ключ \{#add-public-ssh-key}

<AddPublicSsh />

## 3. Создать флейвор с сетевым диском \{#create-flavor}

<CreateFlavorWithNetworkVolume />

## 4. Создать приватную сеть и подсеть \{#create-networks}

<CreateNetworks />

## 5. Создать облачный роутер, подключенный к интернету \{#create-router}

<CreateRouter />

## 6. Создать порт для облачного сервера \{#create-port}

<CreatePort />

## 7. Получить образ \{#get-image}

<GetImage />

## 8. Создать загрузочный сетевой диск \{#create-boot-volume}

<CreateBootVolume />

## 9. Создать дополнительный сетевой диск \{#create-additional-volume}

<CreateAdditionalVolume />

## 10. Создать облачный сервер \{#create-server}

```hcl
resource "openstack_compute_instance_v2" "server_1" {
  name              = "server"
  flavor_id         = openstack_compute_flavor_v2.flavor_1.id
  key_pair          = selectel_vpc_keypair_v2.keypair_1.name
  availability_zone = "ru-9a"

  network {
    port = openstack_networking_port_v2.port_1.id
  }

  lifecycle {
    ignore_changes = [image_id]
  }

  block_device {
    uuid             = openstack_blockstorage_volume_v3.volume_1.id
    source_type      = "volume"
    destination_type = "volume"
    boot_index       = 0
  }

  block_device {
    uuid             = openstack_blockstorage_volume_v3.volume_2.id
    source_type      = "volume"
    destination_type = "volume"
    boot_index       = -1
  }

  vendor_options {
    ignore_resize_confirmation = true
  }
}
```

Здесь `availability_zone` — [сегмент пула](/infrastructure/locations/#pool), в котором будет создан облачный сервер, например `ru-9a`. Список доступных сегментов пула можно посмотреть в инструкции [Доступность продуктов в локациях](/infrastructure/product-availability-by-location/).

Посмотрите подробное описание ресурса [openstack\_compute\_instance\_v2](/terraform/openstack-provider-reference/compute-nova/resources/openstack_compute_instance_v2/).

## 11. Создать публичный IP-адрес \{#create-public-ip}

<CreatePublicIp />

## 12. Ассоциировать публичный и приватный IP-адреса облачного сервера \{#associate-ip}

<AssociateIp />

## 13. Получить IP-адрес облачного сервера \{#get-ip}

<GetIp />

<Formbricks />
