- Add sless.tf: three sless_job resources with depends_on chain
- vm-install-packages: jq, python3-pip, htop, unzip
- vm-install-nginx: nginx 1.18 (HTTP 200 verified)
- vm-install-docker: Docker CE 29.3.1 + Compose v5.1.1
- Add functions/install-{packages,nginx,docker}/handler.py
- _wait_apt_lock: cloud-init status --wait + systemctl mask
fixes Ubuntu 22.04 first-boot apt lock (unattended-upgrades)
- DPkg::Lock::Timeout=600 on all apt-get calls
- Add variables.tf (install_run_id, vm_public_key, vm_private_key)
- Add outputs.tf (install_*_result)
- Bump nubes provider 5.0.49 -> 5.0.51
- doc/progress.md: document step 6 with bug analysis
109 lines
3.8 KiB
Terraform
109 lines
3.8 KiB
Terraform
# 2026-03-29 — sless.tf: провайдер sless и sless_job ресурсы для установки ПО на ВМ.
|
|
#
|
|
# Схема работы:
|
|
# 1. terraform apply создаёт FunctionJob CR в k8s
|
|
# 2. Провайдер загружает код из source_dir в S3
|
|
# 3. Оператор собирает Docker-образ (kaniko) и запускает Job
|
|
# 4. Job подключается к ВМ по SSH и устанавливает ПО
|
|
# 5. terraform apply завершается: outputs содержат статус каждого шага
|
|
#
|
|
# Для повторного запуска: увеличь install_run_id в terraform.tfvars → terraform apply
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Провайдер
|
|
# ---------------------------------------------------------------------------
|
|
|
|
provider "sless" {
|
|
endpoint = "https://sless.kube5s.ru"
|
|
token = var.api_token # тот же JWT что и в provider "nubes"
|
|
nubes_endpoint = "https://deck-api-test.ngcloud.ru/api/v1/index.cfm"
|
|
}
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Общие locals: SSH-параметры для подключения к ВМ
|
|
# ---------------------------------------------------------------------------
|
|
|
|
locals {
|
|
# TODO: заменить externalConnect → internalConnect когда DevOps настроят
|
|
# сеть между k8s кластером и Nubes vDC (сейчас только внешний IP доступен).
|
|
vm_ip = nubes_vc_vm_v3.vm.state_out_flat["externalConnect"]
|
|
|
|
ssh_env = {
|
|
VM_IP = local.vm_ip
|
|
SSH_USER = "ubuntu"
|
|
# TODO(vault): заменить на чтение из Vault когда сервис заработает; пока тестовый стенд — прямой файл.
|
|
SSH_KEY = file("${path.module}/vm_key")
|
|
}
|
|
}
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Job 1: базовые пакеты (jq, pip3 и др.)
|
|
# ---------------------------------------------------------------------------
|
|
|
|
resource "sless_job" "install_packages" {
|
|
count = var.install_packages ? 1 : 0
|
|
|
|
name = "vm-install-packages"
|
|
runtime = "python3.11"
|
|
entrypoint = "handler.install"
|
|
source_dir = "${path.module}/functions/install-packages"
|
|
memory_mb = 128
|
|
|
|
env_vars = local.ssh_env
|
|
event_json = jsonencode({
|
|
packages = var.base_packages
|
|
update = true
|
|
})
|
|
|
|
run_id = var.install_run_id
|
|
wait_timeout_sec = 600
|
|
|
|
depends_on = [nubes_vc_vm_v3.vm]
|
|
}
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Job 2: nginx
|
|
# ---------------------------------------------------------------------------
|
|
|
|
resource "sless_job" "install_nginx" {
|
|
count = var.install_nginx ? 1 : 0
|
|
|
|
name = "vm-install-nginx"
|
|
runtime = "python3.11"
|
|
entrypoint = "handler.install"
|
|
source_dir = "${path.module}/functions/install-nginx"
|
|
memory_mb = 128
|
|
|
|
env_vars = local.ssh_env
|
|
event_json = jsonencode({})
|
|
|
|
run_id = var.install_run_id
|
|
wait_timeout_sec = 600
|
|
|
|
depends_on = [nubes_vc_vm_v3.vm, sless_job.install_packages]
|
|
}
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Job 3: Docker CE
|
|
# ---------------------------------------------------------------------------
|
|
|
|
resource "sless_job" "install_docker" {
|
|
count = var.install_docker ? 1 : 0
|
|
|
|
name = "vm-install-docker"
|
|
runtime = "python3.11"
|
|
entrypoint = "handler.install"
|
|
source_dir = "${path.module}/functions/install-docker"
|
|
memory_mb = 128
|
|
|
|
env_vars = local.ssh_env
|
|
event_json = jsonencode({
|
|
compose = true
|
|
})
|
|
|
|
run_id = var.install_run_id
|
|
wait_timeout_sec = 900
|
|
|
|
depends_on = [nubes_vc_vm_v3.vm, sless_job.install_packages, sless_job.install_nginx]
|
|
}
|