Builds a Proxmox VE image that MAAS can deploy to bare metal, plus first-boot
automation that configures the node and joins it to a Proxmox cluster with no
manual steps.
The image starts from the official Debian cloud image and installs proxmox-ve
on top of it, rather than capturing a raw disk from the Proxmox ISO. That keeps
MAAS in control of partitioning, networking, SSH keys and cloud-init, and makes
moving between Proxmox releases a variable change instead of a rewrite.
Contents:
* Makefile driving the whole flow: build, verify, preseed, upload
* customize-proxmox.sh, run inside the Packer build VM, which layers Proxmox
onto the Debian cloud image and resets the pmxcfs node identity so one image
can produce many nodes
* pve-maas-init, a first-boot state machine covering /etc/hosts, node-unique
identifiers, the root password, vmbr0 conversion, cluster create/join and
the local-lvm thin pool; each stage is resumable across reboots
* curtin-hooks, which stops curtin installing a kernel over APT and pins
interface names by MAC so they match what MAAS recorded at commissioning
* a MAAS curtin preseed template and cloud-init examples
* deploy-cluster.sh, which builds a whole cluster through the MAAS API
* verify-image.sh, 22 static checks on the produced tarball
Cluster identity lives entirely in deploy-time cloud-init user-data, so a single
image and preseed can build any number of independent clusters.
Verified end to end against MAAS 3.7.2: proxmox-ve 9.2.0 / pve-manager 9.2.11 /
kernel 7.0.14-15-pve, deployed to two machines that formed a quorate cluster with
local-lvm on both, with no manual intervention.
The README documents four failure modes found along the way that all fail
silently: curtin rejecting "kernel: null", pvenetcommit overwriting the network
configuration at boot, interface renaming leaving the link down, and a systemd
ordering cycle that made systemd delete the service's start job.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
522 lines
20 KiB
Markdown
522 lines
20 KiB
Markdown
> **Not:** Kanonik dokumantasyon [README.md](README.md) (Ingilizce). Bu Turkce
|
|
> surum geride kalmis olabilir.
|
|
|
|
# maas-proxmox
|
|
|
|
MAAS ile bare-metal sunuculara deploy edilebilen **Proxmox VE** imajlari uretir.
|
|
Deploy edilen dugum ilk acilista kendini yapilandirir: `vmbr0` koprusunu kurar,
|
|
`local-lvm` thin havuzunu olusturur ve istenirse bir Proxmox kumesine otomatik katilir.
|
|
|
|
Varsayilan hedef: **Proxmox VE 9.x** (Debian 13 "trixie" tabanli).
|
|
|
|
---
|
|
|
|
## Nasil calisiyor?
|
|
|
|
```
|
|
Debian 13 cloud image (qcow2)
|
|
│
|
|
├─ packer-maas / debian sablonu (QEMU + KVM)
|
|
│ ├─ cloud-init, netplan, curtin uyumlulugu [upstream]
|
|
│ ├─ disk/cpu/ram yamasi (4G -> 16G) [bu proje]
|
|
│ └─ customize-proxmox.sh [bu proje]
|
|
│ ├─ Proxmox APT deposu + anahtarlik
|
|
│ ├─ proxmox-default-kernel + proxmox-ve
|
|
│ ├─ Debian cekirdegi / os-prober kaldirilir
|
|
│ ├─ pmxcfs dugum kimligi sifirlanir
|
|
│ └─ overlay: pve-maas-init + systemd unit + curtin-hooks
|
|
│
|
|
└─ proxmox-ve-9.tar.gz ──► maas boot-resources create
|
|
│
|
|
▼
|
|
MAAS deploy (curtin)
|
|
│
|
|
▼
|
|
pve-maas-init.service (ilk acilis)
|
|
hosts → identity → rootpw →
|
|
network → cluster → storage
|
|
```
|
|
|
|
Neden Proxmox ISO'su degil de Debian uzerine kurulum? MAAS imaji disk bolumlemesini,
|
|
ag yapilandirmasini, kullanici/SSH anahtarlarini ve cloud-init'i **curtin** ile kendisi
|
|
yonetir. Debian tabanli imaj bu akisa dogal olarak uyar; ISO'dan yakalanan ham disk
|
|
imaji (`dd.gz`) ise MAAS'in disk duzenini tamamen devre disi birakir.
|
|
|
|
---
|
|
|
|
## Dogrulanmis durum
|
|
|
|
Bu depo canli bir ortamda ucdan uca test edildi:
|
|
|
|
| | |
|
|
|---|---|
|
|
| Imaj | proxmox-ve 9.2.0 / pve-manager 9.2.11 / kernel 7.0.14-15-pve |
|
|
| MAAS | 3.7.2 (snap), Ubuntu 24.04 region+rack |
|
|
| Deploy | `custom/proxmox-ve-9`, amd64/generic, LVM duzeni (kok 12GiB) |
|
|
| Sonuc | 2 dugumlu kume, `Quorate: Yes`, her iki dugumde `local-lvm` thin havuzu |
|
|
| Otomasyon | vmbr0 donusumu, root parolasi, dugum adi, kume olusturma + katilma - hepsi elle mudahalesiz |
|
|
|
|
## Gereksinimler
|
|
|
|
**Build host** (imajin derlendigi makine):
|
|
|
|
* Ubuntu 22.04+ (24.04 LTS onerilir), x86_64
|
|
* **Nested virtualization / KVM erisimi** — VM ise CPU tipi `host` olmali
|
|
* 4+ vCPU, 8+ GB RAM, 25+ GB bos disk
|
|
* `sudo` yetkisi
|
|
|
|
**Deploy tarafi:**
|
|
|
|
* MAAS 3.2+ (custom image destegi)
|
|
* Curtin 21.0+
|
|
* Region controller uzerinde bu depodaki curtin preseed dosyasi (asagida)
|
|
|
|
---
|
|
|
|
## Hizli baslangic
|
|
|
|
```bash
|
|
# 1) Build host bagimliliklari (packer, qemu, nbdkit, ovmf, ...)
|
|
sudo ./scripts/install-deps.sh
|
|
|
|
# 2) Imaji derle (~20-40 dk, ag hizina bagli)
|
|
sudo make image
|
|
# -> build/proxmox-ve-9.tar.gz
|
|
|
|
# 3) MAAS curtin preseed dosyasini uret
|
|
make preseed
|
|
# -> build/curtin_userdata_custom_amd64_generic_proxmox-ve-9
|
|
|
|
# 4) Preseed'i MAAS region controller'a kopyala
|
|
sudo make install-preseed
|
|
# (varsayilan: /var/snap/maas/current/preseeds/ ; deb kurulumunda
|
|
# MAAS_PRESEED_DIR=/etc/maas/preseeds kullanin)
|
|
|
|
# 5) Imaji MAAS'a yukle
|
|
make upload MAAS_PROFILE=admin
|
|
```
|
|
|
|
Ardindan MAAS arayuzunde makineyi deploy ederken OS olarak
|
|
**Custom → Proxmox VE 9** secin, ya da CLI ile:
|
|
|
|
```bash
|
|
maas $PROFILE machine deploy $SYSTEM_ID \
|
|
osystem=custom distro_series=proxmox-ve-9 \
|
|
user_data="$(base64 -w0 maas/examples/01-first-node.yaml)"
|
|
```
|
|
|
|
---
|
|
|
|
## Makefile degiskenleri
|
|
|
|
| Degisken | Varsayilan | Aciklama |
|
|
|---|---|---|
|
|
| `PVE_VERSION` | `9` | Proxmox VE ana surumu (imaj adinda kullanilir) |
|
|
| `DEBIAN_SERIES` | `trixie` | PVE'nin dayandigi Debian kod adi |
|
|
| `DEBIAN_VERSION` | `13` | Debian ana surum numarasi |
|
|
| `PVE_REPO` | `pve-no-subscription` | `pve-no-subscription` / `pve-enterprise` / `pve-test` |
|
|
| `PVE_EXTRA_PACKAGES` | `ifupdown2 open-iscsi chrony ...` | Imaja eklenecek ek paketler |
|
|
| `IMAGE_NAME` | `proxmox-ve-9` | MAAS'taki `custom/<ad>` ve preseed dosya adi |
|
|
| `ARCH` / `BOOT` | `amd64` / `uefi` | Mimari ve onyukleme modu |
|
|
| `DISK_SIZE` | `16G` | Build VM disk boyutu (upstream sablondaki 4G yetersiz) |
|
|
| `BUILD_CPUS` / `BUILD_MEM` | `4` / `4096` | Build VM kaynaklari |
|
|
| `DEBIAN_IMAGE_CHANNEL` | `stable` | `stable` sabit URL kullanir (packer onbellegi isabet eder); `daily` upstream varsayilani |
|
|
| `GZIP_LEVEL` | `6` | Tarball sikistirma seviyesi (upstream 9; 6 belirgin hizli, imaj ~%2-3 buyuk) |
|
|
| `APT_PROXY` | *(bos)* | Yerel APT onbellegi, or. `http://10.0.2.2:3142` - bkz. `make deps-cache` |
|
|
| `PM_REF` | `main` | Kullanilacak `canonical/packer-maas` surumu (dal, etiket ya da commit SHA) |
|
|
| `MAAS_PROFILE` | `admin` | `maas` CLI profil adi |
|
|
| `MAAS_PRESEED_DIR` | `/var/snap/maas/current/preseeds` | Preseed dizini |
|
|
| `TIMEOUT` | `3h` | Packer build zaman asimi |
|
|
|
|
### Derlemeyi hizlandirma
|
|
|
|
Sure agirlikli olarak VM icindeki paket kurulumunda geciyor. Uygulanan
|
|
optimizasyonlar (varsayilan olarak acik):
|
|
|
|
* **eatmydata** - dpkg'nin her paket icin yaptigi `fsync` cagrilari devre disi.
|
|
Imaj derlemede guvenli, cunku build VM'inin diski zaten atilabilir.
|
|
* **initramfs erteleme** - `update-initramfs` kurulum boyunca diverte edilir ve
|
|
en sonda yalnizca bir kez calistirilir (cekirdek + firmware + dkms
|
|
tetikleyicileri normalde defalarca calistiriyor).
|
|
* **Kararli cloud image** - sabit URL sayesinde packer'in onbellegi isabet eder;
|
|
`daily` her gun degistigi icin her derlemede ~350MB yeniden inerdi.
|
|
* **`GZIP_LEVEL=6`** - upstream `--best` (9) kullaniyor; 6 ile `pigz` cok
|
|
cekirdekli calisip belirgin hizlaniyor.
|
|
|
|
Tekrarlanan derlemeler icin en buyuk ek kazanc yerel APT onbellegi:
|
|
|
|
```bash
|
|
sudo make deps-cache # apt-cacher-ng kurar
|
|
sudo make image APT_PROXY=http://10.0.2.2:3142 # ~700MB indirme onbellekten
|
|
```
|
|
|
|
`10.0.2.2`, packer'in user-mode aginda build host'un adresidir. Proxy verildiginde
|
|
Debian depolari `https` yerine `http` kullanacak sekilde yeniden yazilir (onbellek
|
|
CONNECT tunelini saklayamaz); paket imzalari yine dogrulandigi icin guvenlik
|
|
kaybi yoktur.
|
|
|
|
### Yeni bir Proxmox surumune gecmek
|
|
|
|
Once ne oldugunu gorun - derleme yapmadan, saniyeler icinde:
|
|
|
|
```bash
|
|
make check-upstream
|
|
```
|
|
|
|
Depodaki guncel `proxmox-ve` / `pve-manager` surumlerini, elinizdeki imajin
|
|
kunyesiyle (`/etc/pve-maas/image-info`) yan yana gosterir.
|
|
|
|
**Durum 1 - ayni Debian tabani icinde surum yukseltmesi (9.2 -> 9.3 -> ...)**
|
|
|
|
Hicbir sey degistirmeniz gerekmez. Imajda surum sabitlemesi yok; her derleme
|
|
depodaki en guncel `proxmox-ve` paketini alir:
|
|
|
|
```bash
|
|
sudo make image && make verify && make upload
|
|
```
|
|
|
|
Imaj adi (`proxmox-ve-9`) ve preseed dosyasi ayni kaldigi icin MAAS'taki kayit
|
|
yerinde guncellenir, preseed'e dokunmaniza gerek kalmaz.
|
|
|
|
**Durum 2 - Debian tabanini degistiren ana surum (or. PVE 10 / Debian 14)**
|
|
|
|
Bu **otomatik degildir**; bu depodaki degiskenleri degistirmek tek basina yetmez.
|
|
Sebep: temel aldigimiz `canonical/packer-maas` sablonunun icinde Debian surumune
|
|
ozel sabit kosullar var -
|
|
|
|
```
|
|
debian/scripts/networking.sh: if [ ${DEBIAN_VERSION} == '12' ] || [ ${DEBIAN_VERSION} == '13' ]
|
|
debian/scripts/setup-boot.sh: if [ ${DEBIAN_VERSION} == '13' ]
|
|
```
|
|
|
|
Bilinmeyen bir surumde bu kosullar `else` dalina duser ve 2020 tarihli bir
|
|
cloud-init paketi kurulur; imaj sessizce bozulur. Bu yuzden ana surum gecisi
|
|
**upstream'in yeni Debian'i desteklemesini bekler**. Sirasi:
|
|
|
|
1. `canonical/packer-maas` yeni Debian'i destekliyor mu?
|
|
(`debian/scripts/` icindeki `DEBIAN_VERSION` kosullarina bakin)
|
|
2. Proxmox anahtarligi yayinlanmis mi?
|
|
`https://enterprise.proxmox.com/debian/proxmox-archive-keyring-<suite>.gpg`
|
|
3. Depoda paketler var mi?
|
|
`curl -s http://download.proxmox.com/debian/pve/dists/<suite>/Release | grep Components`
|
|
4. Sonra:
|
|
|
|
```bash
|
|
sudo make image PVE_VERSION=10 DEBIAN_SERIES=forky DEBIAN_VERSION=14 PM_REF=main
|
|
make preseed PVE_VERSION=10
|
|
```
|
|
|
|
Yeni preseed dosyasinin adi da degisir (`..._proxmox-ve-10`) - MAAS'a kurmayi
|
|
unutmayin.
|
|
|
|
### Upstream surum sabitlemesi
|
|
|
|
`PM_REF`, test edilmis bir `canonical/packer-maas` commit'ine sabitlenmistir.
|
|
`main` birakmak, upstream'de yapilan bir degisikligin derlemenizi haber vermeden
|
|
bozmasi anlamina gelir. Ileri tasirken `PM_REF=main` ile derleyip **deploy ederek**
|
|
test edin, sonra yeni SHA'yi Makefile'a yazin.
|
|
|
|
---
|
|
|
|
## Dugumun ilk acilis davranisi
|
|
|
|
Imajda `pve-maas-init.service` etkin gelir. Servis su asamalari sirayla, her birini
|
|
yalnizca bir kez calistirir (`/var/lib/pve-maas/<asama>.done`):
|
|
|
|
| Asama | Ne yapar |
|
|
|---|---|
|
|
| `hosts` | `/etc/hosts` icinde `<yonetim-ip> <fqdn> <hostname>` satirini kurar (pvecm bunu sart kosar), postfix `myhostname` degerini duzeltir |
|
|
| `identity` | Dugume ozel kimlikleri yeniden uretir (iSCSI IQN) |
|
|
| `rootpw` | `root@pam` parolasini ayarlar |
|
|
| `network` | MAAS'in yapilandirdigi arayuzu `vmbr0` koprusune donusturur, cloud-init/netplan ag yapilandirmasini devre disi birakir |
|
|
| `cluster` | Kume olusturur (`create`) veya mevcut kumeye katilir (`join`) |
|
|
| `storage` | VG'deki bos alanda LVM-thin havuzu acar ve `local-lvm` olarak tanimlar |
|
|
|
|
Bir asama basarisiz olursa servis hata verir ve **sonraki acilista kaldigi yerden
|
|
devam eder**. Durum:
|
|
|
|
```bash
|
|
systemctl status pve-maas-init
|
|
journalctl -u pve-maas-init -b
|
|
ls -l /var/lib/pve-maas/
|
|
```
|
|
|
|
Yapilandirma `/etc/pve-maas/pve-maas.conf` (varsayilanlar) ve
|
|
`/etc/pve-maas/conf.d/*.conf` (cloud-init ile yazilan, ezici degerler) dosyalarindan
|
|
okunur. Tum secenekler icin [`overlay/etc/pve-maas/pve-maas.conf`](overlay/etc/pve-maas/pve-maas.conf).
|
|
|
|
### Proxmox + MAAS birlesiminin tuzaklari
|
|
|
|
Bu imaj asagidaki uc sorunu bilerek cozer. Kendi turevinizi yazacaksaniz
|
|
bunlari bozmayin:
|
|
|
|
**1. systemd siralama dongusu.** `pve-maas-init.service` icin
|
|
`After=cloud-final.service` + `WantedBy=multi-user.target` yazmak bu imajda
|
|
donguye yol aciyor ve systemd dongoyu kirmak icin *bizim* servisimizi siliyor:
|
|
|
|
```
|
|
multi-user.target: Found ordering cycle on pve-maas-init.service/start
|
|
Job pve-maas-init.service/start deleted to break ordering cycle
|
|
```
|
|
|
|
Servis sessizce hic calismaz. Cozum: unit'te cloud-init siralamasi yok;
|
|
script kendi icinde `cloud-init status --wait` ile bekliyor.
|
|
|
|
**2. `pvenetcommit.service`.** Proxmox ag degisikliklerini once
|
|
`/etc/network/interfaces.new` dosyasina yazar; `pvenetcommit` her acilista bu
|
|
dosyayi `interfaces` uzerine **tasir**. Build sirasinda olusan bir `.new`
|
|
dosyasi imajda kalirsa dugumun ilk acilisinda yapilandirmayi ezer. Hem imajda
|
|
hem de ag donusumunden sonra siliniyor.
|
|
|
|
**3. Arayuz adi uyusmazligi.** MAAS commissioning'i Ubuntu ephemeral ortaminda
|
|
yapar ve karti orada gordugu adla kaydeder (or. `enp6s18`). Deploy edilen
|
|
Debian 13 / Proxmox ise udev'in farkli isimlendirme semasi yuzunden ayni karta
|
|
`ens18` diyebilir. Bu durumda cloud-init acilista yeniden adlandirmayi dener,
|
|
`[busy]` hatasi alir ve **arayuzu kapali birakir** - dugum agini tamamen
|
|
kaybeder:
|
|
|
|
```
|
|
Failed to rename devices: [busy] Error renaming mac=... from ens18 to enp6s18
|
|
```
|
|
|
|
`curtin-hooks`, MAAS'in ag yapilandirmasindaki MAC -> ad eslemesini
|
|
`/etc/systemd/network/10-maas-<ad>.link` olarak yazar; udev karti en bastan
|
|
dogru adla olusturur ve yeniden adlandirma gerekmez.
|
|
|
|
### Ilk acilista ag sahipligi
|
|
|
|
Imaj `networking.service`'i (ifupdown2) **devre disi** ve `/etc/network/interfaces`
|
|
dosyasini yalnizca `lo` icerecek sekilde gonderir. Ilk acilista agi tamamen MAAS
|
|
yonetir (curtin'in yazdigi netplan + systemd-networkd). `pve-maas-init` ag asamasi
|
|
`vmbr0` yapilandirmasini yazdiktan sonra netplan/networkd'yi devre disi birakip
|
|
`networking.service`'i kendisi etkinlestirir.
|
|
|
|
Bu sirala onemli: ifupdown2 etkin gelirse, imajdan gelen eski arayuz tanimiyla
|
|
acilista gercek arayuzu kapatir ve dugum daha otomasyon calismadan agini kaybeder.
|
|
|
|
### Ag donusumu
|
|
|
|
`PVE_NET_APPLY=reboot` (varsayilan) ile dugum, cloud-init MAAS'a "deploy tamamlandi"
|
|
sinyalini gonderdikten **sonra** bir kez yeniden baslar ve `vmbr0` ile acilir.
|
|
Yeniden baslatma istemiyorsaniz `PVE_NET_APPLY=reload` ifupdown2'nin `ifreload -a`
|
|
komutunu kullanir.
|
|
|
|
Bond/VLAN gibi karmasik topolojilerde `PVE_NET_MANAGE=false` yapip
|
|
`/etc/network/interfaces` dosyasini cloud-init ile kendiniz yazin —
|
|
bkz. [`maas/examples/04-advanced-network.yaml`](maas/examples/04-advanced-network.yaml).
|
|
|
|
### Depolama
|
|
|
|
MAAS'in disk duzeni bir LVM VG birakiyorsa (MAAS'ta **LVM storage layout** secip
|
|
kok LV'yi kucultun), artan alanda `data` adinda bir thin havuz acilir ve `local-lvm`
|
|
olarak tanimlanir. Ayri bir disk kullanmak icin:
|
|
|
|
```
|
|
PVE_THINPOOL_DISK=/dev/sdb
|
|
PVE_THINPOOL_VG=pve
|
|
```
|
|
|
|
Bos alan `PVE_THINPOOL_MIN_GB` (varsayilan 16 GiB) altindaysa asama sessizce atlanir;
|
|
dugum yalnizca dizin tabanli `local` deposuyla calisir.
|
|
|
|
---
|
|
|
|
## Kume otomasyonu
|
|
|
|
`pvecm add` parolayi etkilesimli sorar, bu yuzden ayni isi yapan API ucu kullanilir:
|
|
|
|
```
|
|
pvesh create /cluster/config/join --hostname <peer> --password <pw> --fingerprint <fp>
|
|
```
|
|
|
|
**Ilk dugum** ([`01-first-node.yaml`](maas/examples/01-first-node.yaml)):
|
|
|
|
```yaml
|
|
PVE_CLUSTER_MODE=create
|
|
PVE_CLUSTER_NAME=pve-cluster-01
|
|
```
|
|
|
|
**Katilan dugumler** ([`02-join-node.yaml`](maas/examples/02-join-node.yaml)):
|
|
|
|
```yaml
|
|
PVE_CLUSTER_MODE=join
|
|
PVE_CLUSTER_PEER=192.0.2.11
|
|
PVE_CLUSTER_PEER_PASSWORD='...'
|
|
PVE_CLUSTER_FINGERPRINT='AA:BB:...' # onerilir
|
|
```
|
|
|
|
Katilan dugum, hedef dugumun 8006 portu acilana kadar bekler
|
|
(`PVE_CLUSTER_WAIT`, varsayilan 900 s) ve basarisiz denemeleri tekrarlar
|
|
(`PVE_CLUSTER_RETRIES`). Katilim bittikten sonra `conf.d` icindeki parolalar
|
|
temizlenir (`PVE_CLUSTER_WIPE_SECRETS=true`).
|
|
|
|
### Birden fazla bagimsiz kume
|
|
|
|
Imaj tamamen jeneriktir - kume kimligi **yalnizca** deploy anindaki cloud-init
|
|
user-data'sindan gelir. Ayni imaj ve ayni preseed ile istediginiz kadar ayri
|
|
kume kurabilirsiniz; **yeniden derleme gerekmez**.
|
|
|
|
Elle yapmak zahmetli oldugu icin ([`scripts/deploy-cluster.sh`](scripts/deploy-cluster.sh))
|
|
tum akisi otomatiklestirir: ilk dugumu `create` ile deploy eder, ayaga kalkmasini
|
|
bekler, sertifika parmak izini okur ve kalan dugumleri o parmak iziyle `join`
|
|
modunda deploy eder.
|
|
|
|
**MAAS region controller uzerinde** calistirin (`maas` CLI profili ve dugumlerin
|
|
8006 portuna erisim gerekir):
|
|
|
|
```bash
|
|
# Once ne uretecegini gorun - hicbir sey deploy etmez
|
|
./deploy-cluster.sh --name pve-prod --nodes pve1,pve2,pve3 --dry-run
|
|
|
|
# Gercek kurulum
|
|
./deploy-cluster.sh --name pve-prod --nodes pve1,pve2,pve3
|
|
|
|
# Ikinci, tamamen bagimsiz kume - ayni imaj, ayni preseed
|
|
./deploy-cluster.sh --name pve-dr --nodes dr1,dr2,dr3
|
|
```
|
|
|
|
Listedeki **ilk dugum kumeyi olusturur**, digerleri ona katilir. Her kume kendi
|
|
root parolasini alir (vermezseniz uretilir ve ekrana yazilir).
|
|
|
|
Ayri bir corosync agi kullaniyorsaniz:
|
|
|
|
```bash
|
|
./deploy-cluster.sh --name pve-prod --nodes pve1,pve2,pve3 --link0-prefix 10.10.20.
|
|
```
|
|
|
|
Her dugumun o onekle baslayan adresi MAAS'tan bulunup `PVE_CLUSTER_LINK0` olarak
|
|
yazilir. (Bu yol henuz canli test edilmedi.)
|
|
|
|
Cok dugumlu kumelerde `--serial` ile katilanlar teker teker deploy edilir.
|
|
Varsayilan paralel moddur; es zamanli katilim denemeleri olursa `pve-maas-init`
|
|
zaten 5 kez, 30 saniye arayla tekrar dener.
|
|
|
|
**Kumeleri MAAS'ta ayirmak icin** etiket kullanmak ise yarar:
|
|
|
|
```bash
|
|
maas $PROFILE tag create name=pve-prod
|
|
maas $PROFILE tag update-nodes pve-prod add=$SYSTEM_ID
|
|
maas $PROFILE machines read tags=pve-prod | jq -r '.[].hostname'
|
|
```
|
|
|
|
### Guvenlik notlari
|
|
|
|
* Hedef dugumun **root@pam parolasi duz metin olmak zorundadir** — API dogrulamasi
|
|
hash kabul etmez. Bu deger cloud-init user-data icinde MAAS'ta saklanir; MAAS
|
|
user-data'ya erisimi olan herkes gorebilir. Kisa omurlu bir parola kullanip
|
|
kurulumdan sonra degistirmeyi dusunun.
|
|
* `PVE_CLUSTER_FINGERPRINT` vermezseniz parmak izi hedef dugumden okunur (TOFU) —
|
|
ilk baglantida MITM'e aciktir. Uretimde parmak izini onceden verin.
|
|
* Dugumun kendi `root` parolasi icin `PVE_ROOT_PASSWORD_HASH` kullanin
|
|
(`openssl passwd -6`), duz metin `PVE_ROOT_PASSWORD` yerine.
|
|
* `PVE_ROOT_PASSWORD*` hic verilmezse root parolasi kilitli kalir: web arayuzune
|
|
`root@pam` ile girilemez ve bu dugum baska bir dugumun katilim hedefi olamaz.
|
|
|
|
---
|
|
|
|
## Dizin yapisi
|
|
|
|
```
|
|
Makefile derleme / preseed / yukleme hedefleri
|
|
scripts/install-deps.sh build host bagimliliklari
|
|
scripts/customize-proxmox.sh.in build VM icinde calisan Proxmox kurulum sablonu
|
|
scripts/deploy-cluster.sh MAAS uzerinden komple bir kume kurar (cok kumeli senaryolar)
|
|
scripts/verify-image.sh uretilen imajin icerik dogrulamasi
|
|
overlay/ imaja kopyalanan dosyalar
|
|
usr/local/sbin/pve-maas-init ilk acilis durum makinesi
|
|
etc/pve-maas/pve-maas.conf varsayilan yapilandirma (tum secenekler)
|
|
etc/systemd/system/... pve-maas-init.service
|
|
curtin/curtin-hooks curtin'in apt ile cekirdek kurmasini engeller
|
|
maas/curtin_userdata_custom.in MAAS curtin preseed sablonu
|
|
maas/examples/*.yaml cloud-init user-data ornekleri
|
|
build/ uretilen dosyalar (git'e girmez)
|
|
```
|
|
|
|
---
|
|
|
|
### packer-maas uzerindeki degisiklikler
|
|
|
|
`make image`, `build/packer-maas` altina klonlanan upstream sablonda tek bir yama
|
|
yapar: `debian-cloudimg.pkr.hcl` icindeki `disk_size` (4G -> `DISK_SIZE`), `cpus` ve
|
|
`memory` degerleri. Upstream 4G ile gelir; Debian cloud image (~3G) uzerine Proxmox VE
|
|
kurulumu bu alana sigmaz. Uretilen `.tar.gz` yalnizca kullanilan dosyalari icerdigi
|
|
icin buyuk sanal disk son imaji buyutmez.
|
|
|
|
Yama her `make image` calistiginda `git checkout -f` sonrasi yeniden uygulanir;
|
|
upstream'i `PM_REF` ile bir commit SHA'ya sabitleyerek surprizleri onleyebilirsiniz.
|
|
|
|
---
|
|
|
|
## Sorun giderme
|
|
|
|
**Deploy "Failed deployment" ile bitiyor**
|
|
Preseed dosyasi dogru adla region controller'da mi? Ad, yuklenen imajin adiyla
|
|
birebir eslesmelidir: `curtin_userdata_custom_<arch>_<subarch>_<image-name>`.
|
|
`make preseed` ciktisindaki dosya adini kullanin.
|
|
|
|
**Deploy tamam ama web arayuzune girilemiyor**
|
|
`root@pam` parolasi ayarlandi mi? `journalctl -u pve-maas-init -b | grep rootpw`.
|
|
Ayrica `vmbr0` ayaga kalkmis mi: `ip -br addr`.
|
|
|
|
**Dugum kumeye katilmadi**
|
|
`journalctl -u pve-maas-init -b` ciktisina bakin. Sik nedenler: hedef dugum 8006'da
|
|
erisilemiyor, root parolasi yanlis, parmak izi eslesmiyor, ya da hedef dugumun
|
|
`/etc/hosts` kaydi eksik oldugu icin `pvecm` orada hata veriyor.
|
|
Servisi elle tekrar calistirmak icin:
|
|
|
|
```bash
|
|
rm -f /var/lib/pve-maas/cluster.done /var/lib/pve-maas/complete
|
|
systemctl start pve-maas-init
|
|
```
|
|
|
|
**Deploy "Deployed" diyor ama dugume hic erisilemiyor**
|
|
Dugumun konsoluna bakin (Proxmox'ta `qm terminal <vmid>`). Login istemi geliyorsa
|
|
sistem acilmis, sorun agda demektir. Kurtarma modunda diski inceleyin:
|
|
|
|
```bash
|
|
maas $PROFILE machine rescue-mode $SYSTEM_ID
|
|
# ephemeral ortama SSH ile baglanip:
|
|
mount /dev/vgroot/lvroot /mnt/t
|
|
cat /mnt/t/etc/network/interfaces # vmbr0 yazilmis mi?
|
|
ls -l /mnt/t/var/lib/pve-maas/ # hangi asamalar tamamlandi?
|
|
cat /mnt/t/var/log/cloud-init-output.log # cloud-init user-data'yi aldi mi?
|
|
journalctl -D /mnt/t/var/log/journal -u pve-maas-init
|
|
```
|
|
|
|
`/var/lib/pve-maas/` bosken ag da kapaliysa, `networking.service` ile MAAS'in
|
|
netplan yapilandirmasi cakisiyor demektir; imajda bu servis devre disi olmali.
|
|
|
|
**Dugum adi imajdaki hostname olarak gorunuyor**
|
|
Olmamasi gerekir — pmxcfs veritabani imajdan silinir ve ilk acilista guncel
|
|
hostname ile yeniden uretilir. Boyle bir durumda `/var/lib/pve-cluster/config.db`
|
|
imajda kalmis demektir; `make image` ciktisinda "Proxmox dugum kimligi sifirlaniyor"
|
|
adimini kontrol edin.
|
|
|
|
**Deploy "Installing OS" sonrasi "Configuring OS" asamasinda patliyor**
|
|
Kurulum kaydina bakin:
|
|
|
|
```bash
|
|
maas $PROFILE node-script-result download $SYSTEM_ID current-installation \
|
|
filetype=txt filters=/tmp/install.log output=all | tail -60
|
|
```
|
|
|
|
`install_kernel -> AttributeError: 'NoneType' object has no attribute 'get'`
|
|
goruyorsaniz preseed'de `kernel: null` kullanilmis demektir. MAAS ile gelen
|
|
curtin surumlerinin bir kismi bunu desteklemez. Bu depodaki preseed bunu
|
|
kullanmaz; cekirdek kurulumu imajdaki `/curtin/curtin-hooks` ile devre disi
|
|
birakilir. Preseed'i elle duzenlediyseniz geri alin.
|
|
|
|
**Build "proxmox-ve paketi bulunamadi" diyor**
|
|
`PVE_SUITE`/`DEBIAN_SERIES` ile `PVE_REPO` uyumsuz. Depoyu dogrulayin:
|
|
`curl -s http://download.proxmox.com/debian/pve/dists/<suite>/Release | grep Components`
|
|
|
|
---
|
|
|
|
## Kaynaklar
|
|
|
|
* [canonical/packer-maas](https://github.com/canonical/packer-maas) — temel Packer sablonlari (AGPL-3.0)
|
|
* [MAAS: Build custom images](https://canonical.com/maas/docs/how-to-build-custom-images)
|
|
* [Proxmox VE: Install on Debian](https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_13_Trixie)
|
|
* [Proxmox VE: Cluster Manager](https://pve.proxmox.com/wiki/Cluster_Manager)
|
|
* [pvecm(1)](https://pve.proxmox.com/pve-docs/pvecm.1.html)
|