RDP на Ubuntu в Yandex.Cloud

Nikolay Matrosov
5 min readMar 7, 2021

--

Итак вам понадобилось развернуть удаленный рабочий стол на Ubuntu. Вот как это сделать.

Начнем с того, что нам понадобится Terraform. Скачать его можно отсюда. Или установить следующей командой, если у вас Mac.

brew install terraform

Что такое Terraform? Это инструмент реализующий подход «infratructure as a code», когда вы:

  • описываете все необходимые ресурсы в виде кода;
  • можете хранить это описание рядом с кодом, применять к нему те же подходы, например, code review;
  • можете воспроизводимо и быстро создавать новые среды.

Подробнее можно узнать на сайте.

Шаг 1. Конфигурация Terraform

Начнем с того, что опишем необходимые нам зависимости, а именно провайдер yandex-cloud/yandex. Документацию на него вы можете найти тут.

terraform {
required_providers {
yandex = {
source = "yandex-cloud/yandex"
}
}
required_version = ">= 0.13"
}

Шаг 2. Описание переменных

Далее нам потребуется описать переменные которые мы будем использовать.

variable "token" {
description = "Yandex Cloud security OAuth token"
default = "nope" #generate yours by this https://cloud.yandex.ru/docs/iam/concepts/authorization/oauth-token
}

variable "folder_id" {
description = "Yandex Cloud Folder ID where resources will be created"
default = "enter your folder id"
}

variable "cloud_id" {
description = "Yandex Cloud ID where resources will be created"
default = "there is cloud id"
}

variable "public_key_path" {
description = "Path to ssh public key, which would be used to access workers"
default = "~/.ssh/id_rsa.pub"
}

variable "private_key_path" {
description = "Path to ssh private key, which would be used to access workers"
default = "~/.ssh/id_rsa"
}

variable "xrdp_password" {
type = string
}

variable "user" {
type = string
default = "yc-user"
}

Для каждой переменной мы обязательно указываем ее тип и опционально значение по умолчанию.

Теперь нам нужно сконфигурировать переменные. Для этого нам понадобится создать файл с расшиением .tfvars и прописать в нем значения переменных. Не добавляйте этот файл в публичные репозитории. Значения переменных тут я опущу, но вам их нужно заполнить.

token = ""
cloud_id = ""
folder_id = ""
xrdp_password = ""

Шаг 3. Конфигурация провайдера для Yandex.Cloud

Теперь мы можем сконфигурировать провайдер yandex.

provider "yandex" {
token = var.token
cloud_id = var.cloud_id
folder_id = var.folder_id
}

Значения переменных берутся из файла *.tfvars, а если они там не заданы, то из поля default соотвествующей переменной.

Шаг 4. Создание сети

Теперь мы можем задать сущности виртуальной сети, где будет развернута наша ВМ.

resource "yandex_vpc_network" "vpc-xrdp" {
name = "vpc-xrdp"
}

resource "yandex_vpc_subnet" "xrdp-subnet-a" {
name = "xrdp-subnet-a"
zone = "ru-central1-a"
network_id = yandex_vpc_network.vpc-xrdp.id
v4_cidr_blocks = ["10.240.1.0/24"]
}

Создадим сеть и подсеть. Тут можно увидеть, как в Terraform можно ссылаться на поля созданных ресурсов.
yandex_vpc_network.vpc-xrdp.id —у ресурса типа yandex_vpc_network c именем vpc-xrdp взять значение поля id.

Шаг 5. Создание инстанса

Теперь можно перейти к созданию собственно виртуальной машины. Но сначала нам понадобится получить некоторые дополнительные данные, а именно образ из котрого мы будем разворачивать ВМ. Его мы найдем по семейству. Возьмем последний как самый актуальный.

data "yandex_compute_image" "ubuntu-20-04" {
family = "ubuntu-2004-lts"
}

И данные, которыем передадим в cloud-init для первоначальной конфигурации ВМ. Для этого считаем шаблон и подставим в него нужные переменные.

data "template_file" "cloud_init" {
template = file("cloud-init.tmpl.yaml")
vars = {
user = var.user
ssh_key = file(var.public_key_path)
}
}

Вот теперь можно определить ресурс инстанс виртуальной машины.

resource "yandex_compute_instance" "xrdp-vm" {
name = "xrdp"
folder_id = var.folder_id
platform_id = "standard-v2"
zone = "ru-central1-a"

resources {
cores = 4
memory = 8


}
boot_disk {
mode = "READ_WRITE"
initialize_params {
image_id = data.yandex_compute_image.ubuntu-20-04.id
type = "network-ssd"
size = 100

}
}
network_interface {
subnet_id = yandex_vpc_subnet.xrdp-subnet-a.id
nat = true
}

metadata = {
user-data = data.template_file.cloud_init.rendered
serial-port-enable = 1
}

provisioner "remote-exec" {
inline = [
"echo '${var.user}:${var.xrdp_password}' | sudo chpasswd",
"sudo apt-get update -y",
"sudo DEBIAN_FRONTEND=noninteractive apt-get install xrdp ubuntu-desktop -y",
"sudo systemctl enable xrdp",
"sudo ufw allow 3389/tcp",
"sudo /etc/xrdp/startwm.sh",
"sudo /etc/init.d/xrdp restart"

]
connection {
type = "ssh"
user = var.user
private_key = file(var.private_key_path)
host = self.network_interface[0].nat_ip_address
}
}

timeouts {
create = "10m"
}
}

Обратите внимание на выделенные строки. По порядку. Параметры с которыми будет создана ВМ — количество CPU и памяти. Далее тип и размер диска.

Последние же выделенные строки — это те команды которые мы выполним, зайдя на машину по ssh после ее создания. При помощи них мы доустановим необходимое ПО. В принципе аналогичного результата можно добиться и передав имена пакетов для установки и в cloud-init, но я хотел показать как пользоваться provisioner "remote-exec".

Шаг 6. Установка ПО на машине

Установим пароль для пользователя. По умолчанию в образах из маркетплейса он не задан.

echo '${var.user}:${var.xrdp_password}' | sudo chpasswd

Теперь нам нужно получить актуальный список пакетов и установить пакеты xrdp и ubuntu-desktop. Дополнительно укажем установщику, что установка проходит в неитерактивном режиме, чтобы во время нее он не задавал дополнительных вопросов пользователю.

sudo apt-get update -y
sudo DEBIAN_FRONTEND=noninteractive apt-get install xrdp ubuntu-desktop -y

Активируем сервис xrdp.

sudo systemctl enable xrdp

Откроем порт в файерволе.

sudo ufw allow 3389/tcp

Остается только выполнить скрипт запуска и перезапустить сервис.

sudo /etc/xrdp/startwm.sh
sudo /etc/init.d/xrdp restart

Шаг 7. Применение конфигурации

Отлично теперь нам нужно выполнить в консоле 2 команды:

terraform init
terraform apply

Готово.

Шаг 8. Подключение к удаленному столу

Теперь нам понадобится RDP-клиент. Я буду использовать официальный клиент Remote Desktop от Microsoft. Найти его можно в AppStore.

Далее открываем его и вводим ip-адрес только что созданной ВМ.

После этого мы увидим окно, где нам потребуется ввести имя пользователя (по умолчанию yc-user) и пароль. Его вы задавали в файле *.tfvars

IP-адрес должен быть вашей машины

Если все отработало верно, то вы увидите удалённый рабочий стол.

Полный код этого примера можно найти на гитхабе тут.

--

--