RDP на Ubuntu в Yandex.Cloud
Итак вам понадобилось развернуть удаленный рабочий стол на 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
Если все отработало верно, то вы увидите удалённый рабочий стол.
Полный код этого примера можно найти на гитхабе тут.