RDP на Ubuntu в Yandex.Cloud
Итак, вам понадобилось развернуть удаленный рабочий стол на Ubuntu. Вот как это сделать.
Начнем с того, что нам понадобится Terraform. Скачать его можно отсюда. Или установить следующей командой, если у вас Mac.
brew install terraform
Что такое Terraform? Это инструмент реализующий подход «infratructure as a code», когда вы:
- описываете все необходимые ресурсы в виде кода;
- можете хранить это описание рядом с кодом, применять к нему те же подходы, например, code review;
- можете воспроизводимо и быстро создавать новые среды.
Подробнее можно узнать на сайте.
Конфигурация Terraform
Начнем с того, что опишем необходимые нам зависимости, а именно провайдер  yandex-cloud/yandex. Документацию на него вы можете найти  тут.
terraform {
  required_providers {
    yandex = {
          source = "yandex-cloud/yandex"
        }
    }
  required_version = ">= 0.13"
}
Описание переменных
Далее нам потребуется описать переменные которые мы будем использовать.
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 = ""
Конфигурация провайдера для Yandex.Cloud
Теперь мы можем сконфигурировать провайдер  yandex.
provider "yandex" {
    token = var.token
    cloud_id = var.cloud_id
    folder_id = var.folder_id
}
Значения переменных берутся из файла  *.tfvars, а если они там не заданы, то из поля  default  соотвествующей переменной.
Создание сети
Теперь мы можем задать сущности виртуальной сети, где будет развернута наша ВМ.
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.
Создание инстанса
Теперь можно перейти к созданию собственно виртуальной машины. Но сначала нам понадобится получить некоторые дополнительные данные, а именно образ из котрого мы будем разворачивать ВМ. Его мы найдем по семейству. Возьмем последний как самый актуальный.
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".
Установка ПО на машине
Установим пароль для пользователя. По умолчанию в образах из маркетплейса он не задан.
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
Применение конфигурации
Отлично теперь нам нужно выполнить в консоле 2 команды:
terraform init
terraform apply
Готово.
Подключение к удаленному столу
Теперь нам понадобится RDP-клиент. Я буду использовать официальный клиент Remote Desktop от Microsoft. Найти его можно в AppStore.
Далее открываем его и вводим ip-адрес только что созданной ВМ.
После этого мы увидим окно, где нам потребуется ввести имя пользователя (по умолчанию  yc-user) и пароль. Его вы задавали в файле  *.tfvars
IP-адрес должен быть вашей машины
Если все отработало верно, то вы увидите удалённый рабочий стол.
Полный код этого примера можно найти на гитхабе тут.