Compare commits

...
2 Commits
Author SHA1 Message Date
CubelaPetarandClaude Opus 5.5 91ed0b300c Add infra/ with student-vms OpenTofu root module
- infra/pve: host facts, IP plan, one-time setup
- infra/tofu/student-vms: 3 student VMs via tf-mod-pve v1.0.0
- infra/sandbox: template clones for throwaway test VMs
- README/TODO: Windows DC/AD instead of FreeIPA, new network
- .gitignore: only ignore secrets.auto.tfvars instead of all tfvars

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 13:58:21 +01:00
CubelaPetarandClaude Opus 5.5 2dfa8de5c6 Rename exerices/ to exercises/ and fix spelling in sheets
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 13:58:21 +01:00
17 changed files with 243 additions and 90 deletions

No files matched your search

+2 -6
View File
@@ -13,12 +13,8 @@
crash.log
crash.*.log
# Exclude all .tfvars files, which are likely to contain sensitive data, such as
# password, private keys, and other secrets. These should not be part of version
# control as they are data points which are potentially sensitive and subject
# to change depending on the environment.
*.tfvars
*.tfvars.json
# Secrets (API token, SSH user); see secrets.auto.tfvars.example
secrets.auto.tfvars
# Ignore override files as they are usually used to override resources locally and so
# are not checked in
+14 -29
View File
@@ -1,5 +1,5 @@
# Learning Plattform for Students
# Learning Platform for Students
## init
@@ -21,47 +21,32 @@ Build a reliable platform on a pve host to teach students Linux/Windows server a
## User Management
Apart from the pve host, the main core of the environment will be a _FreeIPA_ Server which combines
A Windows Server DC/AD is the identity and DNS server of the lab. Each student gets an AD account and is in the group `linux_students` (further groups: `linux_admins`, `linux_users`). Student VMs join the domain.
- identity management server (ldap, sso, acl, ...) via a 389 directory server
- DNS server (bind)
- NTP server
- Kerberos
- Dogtag for certificate management
- NFS server or 'advertise' one for home folders of all users and other userful shares when needed in an exercise
Additional DCs and firewalls/routers are built by the students as exercises.
## Repo layout
We will setup user accounts for each student on the ipa server and a home folder for each one which are shared via nfs
and automatically mounted on user login on any device in the domain/realm.
The student will always have their files available no matter the device they login with their own account.
Define designated groups, `linux_admins`, `linux_students`, `linux_users`, with each its own ACLs mediated via the ipa server.
- `exercises/`: exercise sheets
- `infra/pve/`: PVE host facts, IP plan, one-time setup
- `infra/tofu/<role>/`: one OpenTofu root module (and state) per role, e.g. `student-vms`
- `infra/sandbox/`: throwaway test VMs (template clones, no OpenTofu)
## Facts
**Domain:**
- domain: `lab.softbox.net`
- realm: `LAB.SOFTBOX.NET`
- ipa:
- hostname: `ipa.lab.softox.net`
- ip address: `10.11.12.65/24`
**Domain:** `lab.softbox.net`
**Students:**
- username: `firstname.surname`
- mail: `firstname.surname@softbox.de`
- user_ssh_public_key: Created in exercise sheet-00
- uid: `1000-1020`
- gid: `1000-1020`
- groups: `linux_students`
- mail: `firstname.surname@softbox.de`
- user_ssh_public_key: created in exercise sheet-00
- groups: `linux_students`
**VMs:**
- hostname: `vm_00`
- IP addresses: `10.11.12.200-220`
- hostname: `vm-00` … `vm-20`
- IP addresses: `10.100.200.80-100` (see [infra/pve/README.md](infra/pve/README.md))
## Schedule
+3 -8
View File
@@ -1,11 +1,6 @@
## TODOs
- [ ] change hostnames and correspondingly the dns entries of the student hosts to `vm_00` -> manage dns via opentofu
- [ ] include all users to freeipa and integrate freeipa as main identity and dns server. Deprecate current bind servers -> automate client installation
- [ ] migrate dns zone to freeipa and manage its bind server with opentofu
- [ ] create nfs shares for the home folder of each user
- [ ] write loop for student_vm deployment -> they are similar
- [ ] include automation which install freeipa-client on each vm via opentofu or ansible executed via opentofu
- [ ] set up the Windows DC/AD `dc01` (`10.100.200.70`, 2 vCPU, 4-8 GB) as identity and DNS server
- [ ] switch the student VMs' DNS to the DC and join them to the domain
- [ ] create AD accounts and home folders for all students
- [ ] write nice markdown template for sheets. With better code highlighting and better text formatting
@@ -11,38 +11,38 @@ output: pdf_document
In diesem Blatt lernst du wichtige Grundlagen, um die Sicherheit eines Linux Servers zu gewaehrleisten.
`ssh` (_secure shell_) ist eines der wichtigsten Tools die ein Linux Administrator beherrschen sollte.
`ssh` (_secure shell_) ist eines der wichtigsten Tools, die ein Linux Administrator beherrschen sollte.
Dieses erlaubt es uns, eine Shell zu einem remote Linux (im allgemeinen Unix) System zu oeffnen,
um dann administrative Taetigkeiten am Server durch zu fuehren.
um dann administrative Taetigkeiten am Server durchzufuehren.
Die Authentifizierung passiert hier in der Regel mit Username und Passwort.
Es gibt aber Situationen in denen es nicht ratsam ist, Usernamen und Passwort fuer die Authentifizierung zu nutzen.
Zum Besipiel, wenn der `ssh` Port, 22, oeffentlich zuegaenglich ist, und damit jeder den _OpenSSH_ Server des Linux Servers erreichen koennte.
Ein Passwort koennte durch eine brute-force Attacke erraten werden oder durch andere Wege komprimittiert werden.
Es gibt aber Situationen, in denen es nicht ratsam ist, Usernamen und Passwort fuer die Authentifizierung zu nutzen.
Zum Beispiel, wenn der `ssh` Port, 22, oeffentlich zugaenglich ist, und damit jeder den _OpenSSH_ Server des Linux Servers erreichen koennte.
Ein Passwort koennte durch eine brute-force Attacke erraten werden oder durch andere Wege kompromittiert werden.
Aus dem Grunde gibt es `ssh` Key Paare, welche es uns ermoeglichen uns ohne Passwort am Server zu authentifizieren.
Einer der keys ist hier ein **privater** Schluessel, den niemand haben sollte und der immer sicher aufbewahrt werden sollte.
Der zweite key ist **public** und darf somit von anderen gesehen/gelesen werden. Der public Key wird am Linux Server
in der Datei `/home/$USER/.ssh/authorized_keys` abgelegt, waehrend der private Key am eigenen Rechner hinterlegt wird,
ebenfalls im Ordner `/home/$USER/.ssh/`. Beim Versuch sich mittels `ssh` am Ziel Server anzumelden, gleicht der Server seinen public
Key mit dem private Key des `ssh`-Clients ab und wenn die beiden zu einander passen, wird Zugang gewaehrt.
Key mit dem private Key des `ssh`-Clients ab und wenn die beiden zueinander passen, wird Zugang gewaehrt.
Wir lernen, wie wir ssh key Paare erzeugen und am Ziel Server zu hinterlegen, welche es uns erlauben, uns ohne Passwort an einem OpenSSH server zu authentifizieren.
Wir lernen, wie wir ssh key Paare erzeugen und am Ziel Server hinterlegen, welche es uns erlauben, uns ohne Passwort an einem OpenSSH server zu authentifizieren.
Dies wird in Zukunft auch sehr nuetzlich sein, um Automatisierungstools gegen einen oder _mehrere_ Server laufen zu lassen.
Zusaetzlich lernen wir `fail2ban`, welches ein einfaches _intrusion detection system(IPS)_ ist, welches in der Lage ist Ports zu Diensten auf dem Server zu ueberwachen
und bei missbraeulichem Verhalten IP Addressen zu blocken. Zum Beispiel kann eine IP Adresse fuer eine Stunde geblockt werden, wenn der entsprechende `ssh`-Client drei mal das Passwort falsch eingibt.
Zusaetzlich lernen wir `fail2ban`, welches ein einfaches _intrusion prevention system_ (IPS) ist, welches in der Lage ist Ports zu Diensten auf dem Server zu ueberwachen
und bei missbraeuchlichem Verhalten IP Adressen zu blocken. Zum Beispiel kann eine IP Adresse fuer eine Stunde geblockt werden, wenn der entsprechende `ssh`-Client dreimal das Passwort falsch eingibt.
Um Datein zu bearbeiten benutze einen beliebigen Text Editor, wie zum Beispiel `nano` oder `vim`. Diese sind in der Regel auf den meisten Linux Betriebssystemen vorinstalliert.
Um Dateien zu bearbeiten benutze einen beliebigen Text Editor, wie zum Beispiel `nano` oder `vim`. Diese sind in der Regel auf den meisten Linux Betriebssystemen vorinstalliert.
## Aufgabe 1 - ssh security and config
**a.** Erstelle ein `ssh` Key Paar auf deinem lokalen Rechner, lege den public key auf deinem remote Linux Server ab
und melde dich ohne Passwort mit `ssh` am Server an. `ssh USER@EXAMPLE.COM`.
Tools, welche gentuzt werden sollen:
Tools, welche genutzt werden sollen:
- `ssh`
- `ssh-keygen` (wenn dieser Befehl benutzt wird, setze keien Passwort fuer das Key Paar, sonst musst ihr Dieses jedes mal eingeben, wenn die Keys genutzt werden)
- `ssh-keygen` (wenn dieser Befehl benutzt wird, setze kein Passwort fuer das Key Paar, sonst musst du dieses jedes Mal eingeben, wenn die Keys genutzt werden)
- `ssh-copy-id`
**b.** Passe die Konfiguration des _ssh daemons_ `sshd`, unter dem Pfad `/etc/ssh/sshd_config`, so an, dass
@@ -51,7 +51,7 @@ Tools, welche gentuzt werden sollen:
- die Passwort Authentifizierung nicht moeglich ist,
- und deiner Meinung nach die Sicherheit des `ssh`-Zugangs weiter erhoeht wird.
Nachdem der `ssh`-Dienst angepasst wurde, muss Dieser neugestartet werden, damit die Aenderugen geladen werden:
Nachdem der `ssh`-Dienst angepasst wurde, muss dieser neu gestartet werden, damit die Aenderungen geladen werden:
```bash
$ sudo systemctl restart ssh.service
@@ -63,7 +63,7 @@ $ sudo systemctl status ssh.service
Installiere `fail2ban` und konfiguriere es so, dass
- `ssh` ein aktives `jail` ist
- bei 3 maliger Passwortfalscheingabe, die IP Adresse des Clients fuer 2 Stunden gebannt wird
- bei dreimaliger Passwortfalscheingabe, die IP Adresse des Clients fuer 2 Stunden gebannt wird
Die Konfigurationsdateien von `fail2ban` sind im Pfad `/etc/fail2ban/` hinterlegt.
@@ -83,7 +83,7 @@ sudo apt install fail2ban
$ systemctl status fail2ban.service
```
3. Lese den Inhalt einer default Konfigurations:
3. Lies den Inhalt der default Konfiguration:
```bash
$ cd /etc/fail2ban/
@@ -96,13 +96,13 @@ $ head -20 jail.conf
$ cp jail.conf jail.local
```
5. Passe die `jail.local` Datei an, so dass die Vorgabe umegestzt ist.
5. Passe die `jail.local` Datei an, so dass die Vorgabe umgesetzt ist.
```bash
$ sudo nano/vim jail.local
```
Recherchiere gegebenfalls im Internet, um dies umzusetzen. (Tipp: `ssh` speichert seine logs nicht mehr standardmaessig im Pfad `/var/log/`,
Recherchiere gegebenenfalls im Internet, um dies umzusetzen. (Tipp: `ssh` speichert seine logs nicht mehr standardmaessig im Pfad `/var/log/`,
sondern nutzt `systemd-journald`)
6. Teste deine Konfig von einem auf dem `pve.lab.softbox.net` verfuegbaren Linux Host.
@@ -110,7 +110,7 @@ sondern nutzt `systemd-journald`)
## Aufgabe 3 - nginx web server
Wir installieren hier einen der am meisten genutztne Web server auf der Welt [`nginx`](https://nginx.org/) und machen damit den ersten Schritt zu einer web page.
Wir installieren hier einen der am meisten genutzten Web server auf der Welt [`nginx`](https://nginx.org/) und machen damit den ersten Schritt zu einer web page.
Installiere `nginx`:
@@ -125,13 +125,13 @@ $ sudo systemctl status nginx
```
Besuche die Seite [http://student1.lab.softbox.net](http://student1.lab.softbox.net "http://student1.lab.softbox.net/"), welche dir die `nginx` welcome page zeigen sollte.
Die Konfigurationsdateien von `nginx` unter dem Pfad `/etc/nginx/` zu finden. Die `html` (+ `css` + etc.) sind in der Regel unter dem Pfad `/var/www/` zu finden,
wobei Dieser in `nginx`-Konfigurationsdateien beliebig waehlbar ist.
Die Konfigurationsdateien von `nginx` sind unter dem Pfad `/etc/nginx/` zu finden. Die `html` (+ `css` + etc.) sind in der Regel unter dem Pfad `/var/www/` zu finden,
wobei dieser in `nginx`-Konfigurationsdateien beliebig waehlbar ist.
Pruefe auf welcher IP Adresse und welchem Port `nginx` _lauscht_ (im englischen: _listen_
Pruefe auf welcher IP Adresse und welchem Port `nginx` _lauscht_ (im Englischen: _listen_)
```bash
$ sudo ss -tulpn | grep nginx
```
**Zusatz:** Nutze `man ss`, um dich mit dem Befehl `ss` und den gewaehlten Optionen auseinanderzusetzen. Dies ist ein sehr praktischer Befehl, der sehr haeufig genutzt wird.
***Zusatz:** Nutze `man ss`, um dich mit dem Befehl `ss` und den gewaehlten Optionen auseinanderzusetzen. Dies ist ein sehr praktischer Befehl, der sehr haeufig genutzt wird.
File renamed without changes.
@@ -9,21 +9,21 @@ output: pdf_document
# Aufgabenblatt 01 - base commands & user/group management
In diesem Blatt lernst du grudnlegende Basis Befehle fuer die Verwaltung und 'Bedienung' eines Linux Servers ohne Bildschirmumgebung.
In diesem Blatt lernst du grundlegende Basisbefehle fuer die Verwaltung und 'Bedienung' eines Linux Servers ohne Bildschirmumgebung.
Zusaetzlich lernst du wie User, Gruppen, Besitzrechte und Berechtigungen ersetllt und vergeben werden.
Zusaetzlich lernst du wie User, Gruppen, Besitzrechte und Berechtigungen erstellt und vergeben werden.
Zuletzt wir das gelernte, um selbststaendig einen git Server aufzusetzen; das hoert sich moeglicherweise komplizierter an als es ist,
aber kann mit dem zuvor gelernten schon umgesetzt werden.
Zuletzt nutzen wir das Gelernte, um selbststaendig einen git Server aufzusetzen; das hoert sich moeglicherweise komplizierter an als es ist,
aber kann mit dem zuvor Gelernten schon umgesetzt werden.
Um Datein zu bearbeiten benutze einen beliebigen Text Editor, wie zum Beispiel `nano` oder `vim`. Diese sind in der Regel auf den meisten Linux Betriebssystemen vorinstalliert.
Um Dateien zu bearbeiten benutze einen beliebigen Text Editor, wie zum Beispiel `nano` oder `vim`. Diese sind in der Regel auf den meisten Linux Betriebssystemen vorinstalliert.
- Schreibe kurze Beschreibung zu den Grundlagen des User managements (user, groups, owner and permissions)
- erzaehle ueber die wichtigkeit dieser wenigen Befehle, welche uns ermoeglichen komplexe Dinge durchzufuehren
- erzaehle ueber die Wichtigkeit dieser wenigen Befehle, welche uns ermoeglichen komplexe Dinge durchzufuehren
## Aufgabe 1 - Basisbefehl
## Aufgabe 1 - Basisbefehle
- Lerne diese, sodass im sie im Schlaf bekannt sind.
- Lerne diese, sodass sie dir im Schlaf bekannt sind.
cd , ls , mv , cp , rm , mkdir , rmdir , echo , cat , grep , touch , find , fdisk , ls*** , cut , sort , uniq, ip
@@ -38,7 +38,7 @@ cd , ls , mv , cp , rm , mkdir , rmdir , echo , cat , grep , touch , f
- `groupadd`
- `groupmod`
- `groupdel`
- teach linux ownership and permissions via `chown`,`grpown`, `chmod`
- teach linux ownership and permissions via `chown`,`chgrp`, `chmod`
## Aufgabe 3 - git server - user/group management
@@ -52,7 +52,7 @@ Ownership und Permissions von `git`'s home folder angepasst werden.
### Notizen
- potentiel sollte auch die `umask` des Ordners angepasst werden
- potentiell sollte auch die `umask` des Ordners angepasst werden
@@ -13,7 +13,7 @@ In diesem Blatt lernst du
Um Datein zu bearbeiten benutze einen beliebigen Text Editor, wie zum Beispiel `nano` oder `vim`. Diese sind in der Regel auf den meisten Linux Betriebssystemen vorinstalliert.
Um Dateien zu bearbeiten benutze einen beliebigen Text Editor, wie zum Beispiel `nano` oder `vim`. Diese sind in der Regel auf den meisten Linux Betriebssystemen vorinstalliert.
## Aufgabe 1 - Nextcloud Installation
@@ -11,38 +11,38 @@ output: pdf_document
In diesem Blatt lernst du wichtige Grundlagen, um die Sicherheit eines Linux Servers zu gewaehrleisten.
`ssh` (_secure shell_) ist eines der wichtigsten Tools die ein Linux Administrator beherrschen sollte.
`ssh` (_secure shell_) ist eines der wichtigsten Tools, die ein Linux Administrator beherrschen sollte.
Dieses erlaubt es uns, eine Shell zu einem remote Linux (im allgemeinen Unix) System zu oeffnen,
um dann administrative Taetigkeiten am Server durch zu fuehren.
um dann administrative Taetigkeiten am Server durchzufuehren.
Die Authentifizierung passiert hier in der Regel mit Username und Passwort.
Es gibt aber Situationen in denen es nicht ratsam ist, Usernamen und Passwort fuer die Authentifizierung zu nutzen.
Zum Besipiel, wenn der `ssh` Port, 22, oeffentlich zuegaenglich ist, und damit jeder den _OpenSSH_ Server des Linux Servers erreichen koennte.
Ein Passwort koennte durch eine brute-force Attacke erraten werden oder durch andere Wege komprimittiert werden.
Es gibt aber Situationen, in denen es nicht ratsam ist, Usernamen und Passwort fuer die Authentifizierung zu nutzen.
Zum Beispiel, wenn der `ssh` Port, 22, oeffentlich zugaenglich ist, und damit jeder den _OpenSSH_ Server des Linux Servers erreichen koennte.
Ein Passwort koennte durch eine brute-force Attacke erraten werden oder durch andere Wege kompromittiert werden.
Aus dem Grunde gibt es `ssh` Key Paare, welche es uns ermoeglichen uns ohne Passwort am Server zu authentifizieren.
Einer der keys ist hier ein **privater** Schluessel, den niemand haben sollte und der immer sicher aufbewahrt werden sollte.
Der zweite key ist **public** und darf somit von anderen gesehen/gelesen werden. Der public Key wird am Linux Server
in der Datei `/home/$USER/.ssh/authorized_keys` abgelegt, waehrend der private Key am eigenen Rechner hinterlegt wird,
ebenfalls im Ordner `/home/$USER/.ssh/`. Beim Versuch sich mittels `ssh` am Ziel Server anzumelden, gleicht der Server seinen public
Key mit dem private Key des `ssh`-Clients ab und wenn die beiden zu einander passen, wird Zugang gewaehrt.
Key mit dem private Key des `ssh`-Clients ab und wenn die beiden zueinander passen, wird Zugang gewaehrt.
Wir lernen, wie wir ssh key Paare erzeugen und am Ziel Server zu hinterlegen, welche es uns erlauben, uns ohne Passwort an einem OpenSSH server zu authentifizieren.
Wir lernen, wie wir ssh key Paare erzeugen und am Ziel Server hinterlegen, welche es uns erlauben, uns ohne Passwort an einem OpenSSH server zu authentifizieren.
Dies wird in Zukunft auch sehr nuetzlich sein, um Automatisierungstools gegen einen oder _mehrere_ Server laufen zu lassen.
Zusaetzlich lernen wir `fail2ban`, welches ein einfaches _intrusion detection system(IPS)_ ist, welches in der Lage ist Ports zu Diensten auf dem Server zu ueberwachen
und bei missbraeulichem Verhalten IP Addressen zu blocken. Zum Beispiel kann eine IP Adresse fuer eine Stunde geblockt werden, wenn der entsprechende `ssh`-Client drei mal das Passwort falsch eingibt.
Zusaetzlich lernen wir `fail2ban`, welches ein einfaches _intrusion prevention system_ (IPS) ist, welches in der Lage ist Ports zu Diensten auf dem Server zu ueberwachen
und bei missbraeuchlichem Verhalten IP Adressen zu blocken. Zum Beispiel kann eine IP Adresse fuer eine Stunde geblockt werden, wenn der entsprechende `ssh`-Client dreimal das Passwort falsch eingibt.
Um Datein zu bearbeiten benutze einen beliebigen Text Editor, wie zum Beispiel `nano` oder `vim`. Diese sind in der Regel auf den meisten Linux Betriebssystemen vorinstalliert.
Um Dateien zu bearbeiten benutze einen beliebigen Text Editor, wie zum Beispiel `nano` oder `vim`. Diese sind in der Regel auf den meisten Linux Betriebssystemen vorinstalliert.
## Aufgabe 1 - ssh security and config
**a.** Erstelle ein `ssh` Key Paar auf deinem lokalen Rechner, lege den public key auf deinem remote Linux Server ab
und melde dich ohne Passwort mit `ssh` am Server an. `ssh USER@EXAMPLE.COM`.
Tools, welche gentuzt werden sollen:
Tools, welche genutzt werden sollen:
- `ssh`
- `ssh-keygen` (wenn dieser Befehl benutzt wird, setze keien Passwort fuer das Key Paar, sonst musst ihr Dieses jedes mal eingeben, wenn die Keys genutzt werden)
- `ssh-keygen` (wenn dieser Befehl benutzt wird, setze kein Passwort fuer das Key Paar, sonst musst du dieses jedes Mal eingeben, wenn die Keys genutzt werden)
- `ssh-copy-id`
**b.** Passe die Konfiguration des _ssh daemons_ `sshd`, unter dem Pfad `/etc/ssh/sshd_config`, so an, dass
@@ -51,10 +51,10 @@ Tools, welche gentuzt werden sollen:
- die Passwort Authentifizierung nicht moeglich ist,
- und deiner Meinung nach die Sicherheit des `ssh`-Zugangs weiter erhoeht wird.
Nachdem der `ssh`-Dienst angepasst wurde, muss Dieser neugestartet werden, damit die Aenderugen geladen werden:
Nachdem der `ssh`-Dienst angepasst wurde, muss dieser neu gestartet werden, damit die Aenderungen geladen werden:
```bash
$ sudo systemctl restart ssh.service
$ sudo systemctl status ssh.service
```
*Zusatz:** Nutze `man ss`, um dich mit dem Befehl `ss` und den gewaehlten Optionen auseinanderzusetzen. Dies ist ein sehr praktischer Befehl, der sehr haeufig genutzt wird.
**Zusatz:** Nutze `man ss`, um dich mit dem Befehl `ss` und den gewaehlten Optionen auseinanderzusetzen. Dies ist ein sehr praktischer Befehl, der sehr haeufig genutzt wird.
+41
View File
@@ -0,0 +1,41 @@
# PVE host
- Host: `pve` (`10.100.200.50`), Proxmox VE 9.2, 6 cores, 31 GiB RAM
- Storage: `local` (dir: ISOs, snippets), `local-lvm` (VM disks)
- Network: `vmbr0` on `10.100.200.0/24`, gateway and current DNS `10.100.200.4`
- Templates: `903` `temp-debian-13`
## IP plan (10.100.200.0/24)
| Address | Use | Size |
|---|---|---|
| `.4` | Gateway, current DNS | |
| `.50` | PVE host | |
| `.70` | DC/AD `dc01.lab.softbox.net` (planned) | 2 vCPU, 4-8 GB |
| `.80-.100` | Student VMs (`vm-00`, …), VMID `1080-1100`, 5-10 planned | 1 vCPU, 1 GB |
| `.101-.211` | In use by other devices (probably DHCP) | |
## One-time setup (as root, done)
```bash
# 1. Allow snippets on local storage
pvesm set local --content iso,vztmpl,backup,import,snippets
# 2. API user and token for OpenTofu; put the printed value into
# infra/tofu/<role>/secrets.auto.tfvars as pve_api_token = "tofu@pve!tofu=<value>"
pveum user add tofu@pve --comment "OpenTofu"
pveum aclmod / -user tofu@pve -role PVEAdmin
pveum user token add tofu@pve tofu --privsep 0
# 3. sudo for sbxadmin; passwordless rules for the snippet upload of the bpg/proxmox provider
usermod -aG sudo sbxadmin
cat > /etc/sudoers.d/sbxadmin-tofu <<'EOF'
sbxadmin ALL=(root) NOPASSWD: /usr/sbin/pvesm apiinfo
sbxadmin ALL=(root) NOPASSWD: /usr/bin/tee ^/var/lib/vz/snippets/[a-zA-Z0-9_][a-zA-Z0-9_.-]*$
EOF
chmod 440 /etc/sudoers.d/sbxadmin-tofu && visudo -c
# 4. Templates: tf-mod-pve/scripts/create_template.sh, copied to /root/templates/ with
# storage=local-lvm, ssh_keyfile=/root/.ssh/authorized_keys, only temp-debian-13 enabled
cd /root/templates && bash create_template.sh
```
+13
View File
@@ -0,0 +1,13 @@
# sandbox
Throwaway test VMs, not managed by OpenTofu. Clone a template on the PVE host (as root), use VMIDs `9990-9999`:
```bash
qm clone 903 9991 --name test-01 --full
qm set 9991 --ipconfig0 ip=dhcp
qm start 9991
# done testing
qm stop 9991 && qm destroy 9991
```
Login: `ssh admin@<ip>` (IP via `qm guest cmd 9991 network-get-interfaces`).
+36
View File
@@ -0,0 +1,36 @@
# This file is maintained automatically by "tofu init".
# Manual edits may be lost in future updates.
provider "registry.opentofu.org/bpg/proxmox" {
version = "0.118.1"
constraints = ">= 0.118.0, ~> 0.118"
hashes = [
"h1:/tyENGiIdJgBVlcOQOyHaBmLyQEoogFnTTMN+GJ6ayE=",
"h1:057hFYAlLv2HcjHR7TVoNnDmm57YWNZDNqhDvv6PS7I=",
"h1:CxLdcddSmTqP00oYkvWdN6d+qQSDTOhDzbM2/FzCPbY=",
"h1:E1uc/cddGUBfnYyLOxnmqpzd6yLL4RKHqZJVxRMn/DA=",
"h1:G34GMrwG/FejGMTxwJYKx4tghadFA+xqtrF40FbyOG8=",
"h1:M1nzf28WMPzm4p9sUJGrAUOcqfDyQwRjRIpFMaHzo+Q=",
"h1:MeUGboRbtAzb07dgljVCzUmU5hJ8BOfHBQOOtFzNziU=",
"h1:OCF6iuMldDOqn52ULPf22IJb0Ni3GFx6HdoiTAPIb3M=",
"h1:f46bI0fO0leCFEkYdEVcRrsjAAtSFEN6yZKu2fZymTI=",
"h1:fhAY0NwBwBBu/qUeTb1lAd3a7bffgouILhhjUNNNXCk=",
"h1:gaCA8Ez8zV/OXIVWIE1B11iQmKH7gILdn7Vm9KSRrbU=",
"h1:r52a2cEQ7ftGS1G6vHFMqWI6Bg6o0F/T5BsShH8O2DQ=",
"h1:wAD5hFQpgEptQYR5UK8Hbh8WoTcMGnRCxehLqN+3f9w=",
"zh:07405857f3dda91d1a065b0349547920f4f9b58ec214b19f7e54a07d776c1f88",
"zh:0bd362db77c5971fe0e92b0faf57ed9b50062d4321b5c7a09f492c57dffecb19",
"zh:2cb31f9d4ad2ae90f72f87e3cb77c2f745acbe4b17822821c385612647ea178d",
"zh:2e63ff741101e173feafb133f96273634831322984939115396763b6f860706b",
"zh:787bdda1b4e0924c334acebeb7491966b8e611aaa8e542ec003cb8cbfd9081f4",
"zh:7f2ece41d81a24988f5a357684b2b323cc5165022434e7f91e5a29f10a4182c7",
"zh:9a1e263e4111105c14ed1dc44a5c4e45f00f0f88cb726d16388771c1cdd9b26d",
"zh:a2c1ae4950667bdc0f023f3d12d175fec3cf1a809c4d990cf72f0a200606f6f8",
"zh:abd342c9153e712a8542b0fd03f6a0b25f954573184dfe8f5b05b08b1e26e254",
"zh:b5cc543d31183a63c782af7fab9a4a203b4eebf782db13af94ae65c9b7d51373",
"zh:befeb50e7346802d3c222541e91a06093933990acdfc89cf93364615fdac91c4",
"zh:d164da80b3f3339549942a3131b0717f14798ed514e8362c76874b68feba89f8",
"zh:dc265c6e4c3e656e014c524b50e0ff02761070cb9db7cb24f7b0ab57c12b9e97",
"zh:f26e0763dbe6a6b2195c94b44696f2110f7f55433dc142839be16b9697fa5597",
]
}
+15
View File
@@ -0,0 +1,15 @@
# student-vms
One Debian 13 VM per student (`vm-00`, `vm-01`, …, IPs `10.100.200.80-100`), created with [tf-mod-pve](https://github.com/CubelaPetar/tf-mod-pve). The VM list is in `vms.tf`.
Prerequisites: host setup from [`../../pve/README.md`](../../pve/README.md) and your SSH key authorized for `sbxadmin` on the host.
```bash
ssh-add ~/.ssh/id_ed25519 # provider uploads snippets via ssh-agent
cp secrets.auto.tfvars.example secrets.auto.tfvars # fill in the API token
tofu init
tofu plan
tofu apply
```
State is local (`terraform.tfstate`, gitignored). Back it up.
+11
View File
@@ -0,0 +1,11 @@
provider "proxmox" {
endpoint = "https://10.100.200.50:8006/"
api_token = var.pve_api_token
insecure = true # self-signed certificate
# Used to upload the cloud-init snippets, key comes from the ssh-agent
ssh {
agent = true
username = var.pve_ssh_user
}
}
@@ -0,0 +1,3 @@
# Copy to secrets.auto.tfvars (gitignored) and fill in
pve_api_token = "tofu@pve!tofu=<secret>"
pve_ssh_user = "sbxadmin"
+16
View File
@@ -0,0 +1,16 @@
variable "pve_api_token" {
type = string
description = "Proxmox API token, e.g. tofu@pve!tofu=<secret>"
sensitive = true
}
variable "pve_ssh_user" {
type = string
description = "SSH user on the PVE host for the snippet upload"
}
variable "ssh_public_key_file" {
type = string
description = "Public key added to the VM user admin"
default = "~/.ssh/id_ed25519.pub"
}
+10
View File
@@ -0,0 +1,10 @@
terraform {
required_version = ">= 1.10"
required_providers {
proxmox = {
source = "bpg/proxmox"
version = "~> 0.118"
}
}
}
+32
View File
@@ -0,0 +1,32 @@
# One VM per student: hostname => VMID and IP (10.100.200.80-100)
locals {
vms = {
"vm-00" = { vm_id = 1080, ip = "10.100.200.80" }
"vm-01" = { vm_id = 1081, ip = "10.100.200.81" }
"vm-02" = { vm_id = 1082, ip = "10.100.200.82" }
}
}
module "vm" {
source = "git::https://github.com/CubelaPetar/tf-mod-pve.git?ref=v1.0.0"
for_each = local.vms
node_name = "pve"
vm_id = each.value.vm_id
template_vm_id = 903 # temp-debian-13
hostname = each.key
domain = "lab.softbox.net"
tags = ["student"]
ssh_public_key = file(pathexpand(var.ssh_public_key_file))
cpu_cores = 1
memory = 1024
storage = "local-lvm"
disk_size = 16
net_bridge = "vmbr0"
ip_address = "${each.value.ip}/24"
gateway = "10.100.200.4"
# Current resolver until the DC/AD takes over DNS
nameservers = ["10.100.200.4"]
}