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

import Formbricks from '@theme/MDXComponents/Formbricks'
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 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 CopyIcon from '@selectel/docux/icons/copy'

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

<CreateResourcesAlert />

<br />

1. Опционально: [настройте провайдеры](#configure-providers).

2. [Добавьте публичный SSH-ключ](#create-ssh-keypair).

3. [Создайте приватную сеть и подсеть](#create-networks).

4. [Создайте облачный роутер, подключенный к интернету](#create-router).

5. [Создайте порт для облачного сервера](#create-port).

6. [Получите образ](#get-image).

7. [Создайте загрузочный сетевой диск](#create-boot-volume).

8. [Создайте облачный сервер](#create-server).

9. [Создайте публичный IP-адрес](#create-public-ip).

10. [Ассоциируйте публичный и приватный IP-адреса облачного сервера](#associate-ip).

11. [Получите адрес облачного сервера](#get-ip).

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

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

  ```hcl
  terraform {
    required_providers {
      selectel  = {
        source  = "selectel/selectel"
        version = "~> 6.0"
      }
      openstack = {
        source  = "terraform-provider-openstack/openstack"
        version = "2.1.0"
      }
    }
  }

  provider "selectel" {
    domain_name = "123456"
    username    = "user"
    password    = "password"
    auth_region = "ru-7"
    auth_url    = "https://cloud.api.selcloud.ru/identity/v3/"
  }

  resource "selectel_vpc_project_v2" "project_1" {
    name = "project"
  }

  resource "selectel_iam_serviceuser_v1" "serviceuser_1" {
    name         = "username"
    password     = "password"
    role {
      role_name  = "member"
      scope      = "project"
      project_id = selectel_vpc_project_v2.project_1.id 
    }
  }

  provider "openstack" {
    auth_url    = "https://cloud.api.selcloud.ru/identity/v3"
    domain_name = "123456"
    tenant_id   = selectel_vpc_project_v2.project_1.id
    user_name   = selectel_iam_serviceuser_v1.serviceuser_1.name
    password    = selectel_iam_serviceuser_v1.serviceuser_1.password
    region      = "ru-7"
  }
  ```
</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_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-7b"
      availability_zone    = "ru-7b"
      enable_online_resize = true

      lifecycle {
        ignore_changes = [image_id]
      }

  }

  resource "openstack_compute_instance_v2" "server_1" {
    name              = "server"
    flavor_id         = "1063"
    key_pair          = selectel_vpc_keypair_v2.keypair_1.name
    availability_zone = "ru-7b"

    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
    }

    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, пропустите этот шаг.

1. Убедитесь, что в панели управления вы [создали сервисного пользователя](/terraform/configure-terraform-environment/#add-service-user) с ролями [`member`](/access-control/role-reference/#member) в области доступа Аккаунт и [`iam.admin`](/access-control/role-reference/#iam-admin).

2. Создайте директорию для хранения конфигурационных файлов и отдельный файл с расширением `.tf` для настройки провайдеров.

3. В файл для настройки провайдеров добавьте провайдеры Selectel и OpenStack:

   ```hcl
   terraform {
     required_providers {
       selectel  = {
         source  = "selectel/selectel"
         version = "~> 6.0"
       }
       openstack = {
         source  = "terraform-provider-openstack/openstack"
         version = "2.1.0"
       }
     }
   }
   ```

   Здесь `version` — версии провайдеров. Актуальную версию можно посмотреть в документации Selectel (в [Terraform Registry](https://registry.terraform.io/providers/selectel/selectel/latest/docs) и [GitHub](https://github.com/selectel/terraform-provider-selectel)) и OpenStack (в [Terraform Registry](https://registry.terraform.io/providers/terraform-provider-openstack/openstack/latest) и [GitHub](https://github.com/terraform-provider-openstack/terraform-provider-openstack)).

   Подробнее о продуктах, услугах и сервисах, которыми можно управлять с помощью провайдеров, в инструкции [Провайдеры Selectel и OpenStack](/terraform/providers/).

4. Инициализируйте провайдер Selectel:

   ```hcl
   provider "selectel" {
     domain_name = "123456"
     username    = "user"
     password    = "password"
     auth_region = "ru-7"
     auth_url    = "https://cloud.api.selcloud.ru/identity/v3/"
   }
   ```

   Здесь:

   * `domain_name` — номер аккаунта Selectel. Можно посмотреть в [панели управления](https://my.selectel.ru/) в правом верхнем углу;
   * `username` — имя [сервисного пользователя](/terraform/configure-terraform-environment/#add-service-user) с ролями [`member`](/access-control/role-reference/#member) в области доступа Аккаунт и [`iam.admin`](/access-control/role-reference/#iam-admin). Можно посмотреть в [панели управления](https://my.selectel.ru/iam/service-users): в верхнем меню нажмите **IAM** → раздел **Сервисные пользователи** (раздел доступен только Владельцу аккаунта и пользователю с ролью `iam.admin`);
   * `password` — пароль сервисного пользователя. Можно посмотреть при создании пользователя или [изменить на новый](/access-control/manage/edit-user-data-or-role/);
   * `auth_region` — [пул](/infrastructure/locations/#pool) для авторизации в формате `ru-7`, не используйте пулы в формате `SPB-2`. Пул для авторизации может не совпадать с пулом, в котором вы создаете ресурсы.
     Список доступных пулов можно посмотреть в инструкции [Доступность продуктов в локациях](/infrastructure/product-availability-by-location/).

5. Создайте проект:

   ```hcl
   resource "selectel_vpc_project_v2" "project_1" {
     name = "project"
   }
   ```

   Посмотрите подробное описание ресурса [selectel\_vpc\_project\_v2](/terraform/selectel-provider-reference/resources/vpc_project_v2/).

6. Создайте сервисного пользователя для доступа к проекту и назначьте ему роль [`member`](/access-control/role-reference/#member) в области доступа Проект:

   ```hcl
   resource "selectel_iam_serviceuser_v1" "serviceuser_1" {
     name         = "username"
     password     = "password"
     role {
       role_name  = "member"
       scope      = "project"
       project_id = selectel_vpc_project_v2.project_1.id
     }
   }
   ```

   Здесь:

   * `username` — имя пользователя;
   * `password` — пароль пользователя. Пароль должен быть не короче восьми символов и содержать латинские буквы разных регистров и цифры;
   * `project_id` — ID проекта. Можно посмотреть в [панели управления](https://my.selectel.ru/vpc/): в верхнем меню нажмите **Продукты** и выберите **Облачные серверы** → откройте меню проектов → в строке нужного проекта нажмите <CopyIcon />.

   Посмотрите подробное описание ресурса [selectel\_iam\_serviceuser\_v1](/terraform/selectel-provider-reference/resources/iam_serviceuser_v1/).

7. Инициализируйте провайдер OpenStack:

   ```hcl
   provider "openstack" {
     auth_url    = "https://cloud.api.selcloud.ru/identity/v3"
     domain_name = "123456"
     tenant_id   = selectel_vpc_project_v2.project_1.id
     user_name   = selectel_iam_serviceuser_v1.serviceuser_1.name
     password    = selectel_iam_serviceuser_v1.serviceuser_1.password
     region      = "ru-7"
   }
   ```

   Здесь:

   * `domain_name` — номер аккаунта Selectel. Можно посмотреть в [панели управления](https://my.selectel.ru/) в правом верхнем углу;
   * `region` — [пул](/infrastructure/locations/#pool), например `ru-7`. Все ресурсы будут создаваться в этом пуле. Список доступных пулов можно посмотреть в инструкции [Доступность продуктов в локациях](/infrastructure/product-availability-by-location/).

8. Если одновременно с настройкой провайдеров вы [создаете ресурсы](/terraform/manage-resources/), то для ресурсов OpenStack добавьте аргумент `depends_on`. Например, для ресурса openstack\_networking\_network\_v2:

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

     depends_on = [
       selectel_vpc_project_v2.project_1,
       selectel_iam_serviceuser_v1.serviceuser_1
     ]
   }
   ```

9. Опционально: если вы хотите использовать зеркало, создайте отдельный конфигурационный файл Terraform CLI и добавьте в него блок:

   ```hcl
   provider_installation {
     network_mirror {
       url = "https://tf-proxy.selectel.ru/mirror/v1/"
       include = ["registry.terraform.io/*/*"]
     }
     direct {
       exclude = ["registry.terraform.io/*/*"]
     }
   }
   ```

   Подробнее о настройках зеркал в инструкции [CLI Configuration File](https://developer.hashicorp.com/terraform/cli/config/config-file) документации HashiCorp.

10. Откройте CLI.

11. Инициализируйте конфигурацию Terraform в директории:

    ```bash
    terraform init
    ```

12. Проверьте, что конфигурационные файлы составлены без ошибок:

    ```bash
    terraform validate
    ```

13. Отформатируйте конфигурационные файлы:

    ```bash
    terraform fmt
    ```

14. Проверьте, какие ресурсы будут созданы:

    ```bash
    terraform plan
    ```

15. Примените изменения и создайте ресурсы:

    ```bash
    terraform apply
    ```

16. Подтвердите создание — введите **yes** и нажмите **Enter**. Созданные ресурсы отобразятся в панели управления.

17. Если для создания ресурсов оказалось недостаточно квот, [увеличьте квоты](/access-control/projects/quotas/#change-quotas).

## 2. Создать пару SSH-ключей \{#create-ssh-keypair}

<AddPublicSsh />

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

<CreateNetworks />

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

<CreateRouter />

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

<CreatePort />

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

<GetImage />

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

```hcl
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-7b"
    availability_zone    = "ru-7b"
    enable_online_resize = true

    lifecycle {
      ignore_changes = [image_id]
    }

}
```

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

```hcl

resource "openstack_compute_instance_v2" "server_1" {
  name              = "server"
  flavor_id         = "1063"
  key_pair          = selectel_vpc_keypair_v2.keypair_1.name
  availability_zone = "ru-7b"

  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
  }

  vendor_options {
    ignore_resize_confirmation = true
  }
}

```

Здесь:

* `availability_zone` — [сегмент пула](/infrastructure/locations/#pool), в котором будет создан облачный сервер, например `ru-7b`. [Облачные серверы с выделенными ядрами](/cloud-servers/about/dedicated-cores/) доступны только в сегментах пула ru-3b, ru-7a и ru-7b.
* `flavor_id` — ID флейвора с выделенными ядрами.
  Флейворы соответствуют [конфигурациям облачного сервера](/cloud-servers/create/configurations/) и определяют количество vCPU, RAM и размер локального диска. Например, `1063` — флейвор фиксированной конфигурации линейки Standard с 12 vCPU и 48 ГБ RAM для создания облачного сервера с выделенными ядрами.
  Флейворы с поддержкой выделенных ядер есть в линейках Standard и HighFreq.
  Список доступных флейворов можно посмотреть в подразделе [Список флейворов фиксированной конфигурации во всех пулах](/cloud-servers/create/configurations/#server-flavors-full-list) инструкции [Конфигурации облачных серверов](/cloud-servers/create/configurations/).

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

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

<CreatePublicIp />

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

<AssociateIp />

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

<GetIp />

<Formbricks />
