|
Bogdan Timofte
authored
3 months ago
|
1
|
# Madagascar Cluster Projects
|
|
|
2
|
|
|
|
3
|
Acest director este punctul unic de lucru pentru proiectele cluster-level actuale si viitoare.
|
|
|
4
|
|
|
|
5
|
## Baza de referinta
|
|
|
6
|
|
|
|
7
|
Workflow-ul de install, uninstall si reinstall documentat aici este bazat pe implementarea cea mai completa existenta in `autoNAS`.
|
|
|
8
|
|
|
|
9
|
Referinte principale:
|
|
|
10
|
- `cluster/projects/autoNAS/README.md`
|
|
|
11
|
- `cluster/projects/autoNAS/DEVELOPMENT.md`
|
|
|
12
|
- `cluster/projects/autoNAS/scripts/install.sh`
|
|
|
13
|
- `cluster/projects/autoNAS/scripts/autonas-uninstall.sh`
|
|
|
14
|
|
|
|
15
|
Observatie importanta:
|
|
|
16
|
- `autoNAS` confirma workflow-ul corect de uninstall-inainte-de-reinstall si curatare a fisierelor orfane
|
|
|
17
|
- `autoNAS` nu este inca aliniat complet la noua regula de locatie pentru comenzi operator-facing, deoarece instaleaza in prezent in `/usr/local/bin`
|
|
|
18
|
- pentru proiectele noi, regula ramane `/usr/local/sbin`; `autoNAS` trebuie tratat ca precedent functional pentru workflow, nu ca standard final de layout
|
|
|
19
|
|
|
|
20
|
## Namespace de organizatie
|
|
|
21
|
|
|
|
22
|
Pentru claritate si evitarea coliziunilor intre proiecte, toate locatiile standard trebuie namespaced cu identificatorul de organizatie:
|
|
|
23
|
|
|
|
24
|
- `xdev`
|
|
|
25
|
|
|
|
26
|
Regula generala este:
|
|
|
27
|
- folosim `<project-name>` pentru identitatea proiectului
|
|
|
28
|
- folosim `xdev` in calea de instalare pentru fisiere interne, configuratie, date si documentatie
|
|
|
29
|
|
|
|
30
|
## Reguli generale
|
|
|
31
|
|
|
|
32
|
- Toate proiectele noi se creeaza sub `cluster/projects/<project-name>`.
|
|
|
33
|
- Proiectele se deschid si se mentin din `cluster`, pentru a reduce divergenta intre workspace-uri si duplicarea documentatiei sau scripturilor.
|
|
|
34
|
- Fiecare proiect trebuie sa aiba cel putin:
|
|
|
35
|
- `README.md`
|
|
|
36
|
- script de instalare
|
|
|
37
|
- script de dezinstalare
|
|
|
38
|
- instructiuni de operare si upgrade
|
|
|
39
|
|
|
|
40
|
## Locatii well-known obligatorii
|
|
|
41
|
|
|
|
42
|
Instalarile trebuie sa foloseasca locatii predictibile si stabile:
|
|
|
43
|
|
|
|
44
|
- executabile si scripturi operator-facing: `/usr/local/sbin`
|
|
|
45
|
- binare sau scripturi interne ale proiectului: `/usr/local/lib/xdev/<project-name>`
|
|
|
46
|
- documentatie instalata pe host: `/usr/local/share/doc/xdev/<project-name>`
|
|
|
47
|
- fisiere de configurare persistente: `/etc/xdev/<project-name>`
|
|
|
48
|
- environment defaults: `/etc/default/xdev-<project-name>`
|
|
|
49
|
- unitati systemd: `/etc/systemd/system`
|
|
|
50
|
- stare persistenta si date operationale: `/var/lib/xdev/<project-name>`
|
|
|
51
|
- cache temporar: `/var/cache/xdev/<project-name>` daca este necesar
|
|
|
52
|
- loguri dedicate pe disc, daca proiectul chiar le scrie in fisier: `/var/log/xdev/<project-name>`
|
|
|
53
|
|
|
|
54
|
Regula practica:
|
|
|
55
|
- daca un operator trebuie sa ruleze comanda direct, ea merge in `/usr/local/sbin`
|
|
|
56
|
- daca fisierul este suport intern pentru proiect, el merge in `/usr/local/lib/xdev/<project-name>`
|
|
|
57
|
- daca fisierul este documentatie instalata local pentru host, el merge in `/usr/local/share/doc/xdev/<project-name>`
|
|
|
58
|
- daca fisierul reprezinta configuratie editabila, el merge in `/etc/xdev/<project-name>` sau `/etc/default/xdev-<project-name>`
|
|
|
59
|
- daca fisierul reprezinta stare, baza locala, lock, snapshot sau alta data operationala, el merge in `/var/lib/xdev/<project-name>`
|
|
|
60
|
|
|
|
61
|
## Locatia standard pentru scripturile de dezinstalare
|
|
|
62
|
|
|
|
63
|
Locatia standard canonica pentru scriptul de dezinstalare instalat pe host este:
|
|
|
64
|
|
|
|
65
|
- `/usr/local/lib/xdev/<project-name>/uninstall.sh`
|
|
|
66
|
|
|
|
67
|
Motivatie:
|
|
|
68
|
- uninstall-ul este in primul rand parte din mecanismul intern de lifecycle al proiectului
|
|
|
69
|
- trebuie sa poata fi apelat de installer pentru cleanup automat inainte de reinstall
|
|
|
70
|
- trebuie versionat impreuna cu restul fisierelor interne ale proiectului
|
|
|
71
|
- evita aglomerarea inutila a `/usr/local/sbin` cu scripturi care nu sunt folosite frecvent in operare zilnica
|
|
|
72
|
|
|
|
73
|
Regula de naming:
|
|
|
74
|
- scriptul canonic instalat pe host se numeste `uninstall.sh`
|
|
|
75
|
- directorul proiectului da contextul complet: `/usr/local/lib/xdev/<project-name>/uninstall.sh`
|
|
|
76
|
|
|
|
77
|
Expunere optionala pentru operator:
|
|
|
78
|
- daca vrem o comanda manuala simpla si predictibila, se poate instala un wrapper sau symlink in:
|
|
|
79
|
- `/usr/local/sbin/xdev-<project-name>-uninstall`
|
|
|
80
|
- acest wrapper trebuie sa apeleze scriptul canonic din `/usr/local/lib/xdev/<project-name>/uninstall.sh`
|
|
|
81
|
- wrapperul din `/usr/local/sbin` este optional; scriptul canonic din `/usr/local/lib/xdev/<project-name>/` este obligatoriu
|
|
|
82
|
|
|
|
83
|
## Instalare si dezinstalare
|
|
|
84
|
|
|
|
85
|
- Orice instalare trebuie sa fie insotita de un script de dezinstalare livrat de acelasi proiect.
|
|
|
86
|
- Scriptul de dezinstalare instalat pe host trebuie sa existe la `/usr/local/lib/xdev/<project-name>/uninstall.sh`.
|
|
|
87
|
- Scriptul de dezinstalare trebuie sa elimine toate fisierele instalate de proiect:
|
|
|
88
|
- executabile
|
|
|
89
|
- fisiere din `/usr/local/lib/xdev/<project-name>`
|
|
|
90
|
- documentatie din `/usr/local/share/doc/xdev/<project-name>`
|
|
|
91
|
- unitati systemd
|
|
|
92
|
- fisiere de configurare generate de proiect, daca sunt gestionate exclusiv de el, din `/etc/xdev/<project-name>` sau `/etc/default/xdev-<project-name>`
|
|
|
93
|
- directoare de stare, date sau cache create de proiect, daca nu contin date care trebuie pastrate explicit, din `/var/lib/xdev/<project-name>` sau `/var/cache/xdev/<project-name>`
|
|
|
94
|
- Scopul este prevenirea fisierelor orfane si a reinstalarilor peste artefacte ramase din versiuni anterioare.
|
|
|
95
|
|
|
|
96
|
## Regula de reinstall
|
|
|
97
|
|
|
|
98
|
- Toate reinstalarile se fac numai dupa dezinstalare completa.
|
|
|
99
|
- Dezinstalarea se face numai cu scriptul original de uninstall al proiectului, nu prin stergeri manuale partiale.
|
|
|
100
|
- Fluxul obligatoriu este:
|
|
|
101
|
|
|
|
102
|
```text
|
|
|
103
|
uninstall -> verificare curatare -> install
|
|
|
104
|
```
|
|
|
105
|
|
|
|
106
|
- Nu se face reinstall direct peste o instalare existenta, chiar daca pare functionala.
|
|
|
107
|
- Daca scriptul de uninstall lipseste, instalarea proiectului este incompleta si trebuie corectata inainte de orice upgrade sau reinstall.
|
|
|
108
|
|
|
|
109
|
## Cerinte pentru proiectele noi
|
|
|
110
|
|
|
|
111
|
Fiecare proiect nou trebuie sa includa explicit:
|
|
|
112
|
|
|
|
113
|
1. un `install` care foloseste locatiile well-known
|
|
|
114
|
2. un `uninstall` care inverseaza complet instalarea
|
|
|
115
|
3. un `README.md` cu:
|
|
|
116
|
- layout-ul fisierelor instalate
|
|
|
117
|
- comenzile de instalare
|
|
|
118
|
- comenzile de dezinstalare
|
|
|
119
|
- pasii de reinstall
|
|
|
120
|
- locatia uninstall-ului instalat pe host: `/usr/local/lib/xdev/<project-name>/uninstall.sh`
|
|
|
121
|
- locatiile pentru configuratie, documentatie si date
|
|
|
122
|
4. daca exista systemd:
|
|
|
123
|
- `daemon-reload` la install si uninstall
|
|
|
124
|
- enable/disable/stop clar definite
|
|
|
125
|
- la deployment, serviciile si timer-ele care trebuie sa ramana active se pornesc cu `systemctl enable --now`, nu doar cu `enable`
|
|
|
126
|
|
|
|
127
|
## Aplicare la proiectele existente
|
|
|
128
|
|
|
|
129
|
Proiectele deja mutate sub `cluster/projects/` trebuie aliniate progresiv la aceste reguli.
|
|
|
130
|
|
|
|
131
|
Prioritati:
|
|
|
132
|
- confirmarea unui script de uninstall pentru fiecare proiect
|
|
|
133
|
- standardizarea instalarii in `/usr/local/sbin` si `/usr/local/lib/xdev/<project-name>`
|
|
|
134
|
- eliminarea reinstalarilor facute peste fisiere existente
|
|
|
135
|
|
|
|
136
|
## Lectii confirmate in autoNAS
|
|
|
137
|
|
|
|
138
|
Problemele deja identificate si rezolvate in `autoNAS`, care trebuie considerate reguli pentru proiectele viitoare:
|
|
|
139
|
|
|
|
140
|
- reinstalarile peste versiuni vechi lasa fisiere orfane daca nu exista cleanup explicit
|
|
|
141
|
- instalarea trebuie sa poata rula cleanup de versiune anterioara inainte de install
|
|
|
142
|
- uninstaller-ul trebuie instalat pe host pentru a permite cleanup corect la upgrade sau reinstall
|
|
|
143
|
- uninstall-ul trebuie sa curete agresiv fisierele istorice ramase din versiuni mai vechi
|
|
|
144
|
- config-ul utilizatorului trebuie pastrat cand contine date reale, nu sters orbeste
|
|
|
145
|
- serviciile systemd trebuie oprite, dezactivate, sterse si urmate de `daemon-reload`
|
|
|
146
|
- la deployment, un serviciu necesar in productie nu trebuie lasat doar `enabled`; se foloseste `enable --now` pentru a evita deploy-uri cu servicii instalate dar nepornite
|
|
|
147
|
- unele resurse necesita cleanup manual explicit daca pot contine date operationale, de exemplu exports NFS sau mount points active
|
|
|
148
|
|
|
|
149
|
Fluxul validat de `autoNAS` este:
|
|
|
150
|
|
|
|
151
|
```text
|
|
|
152
|
detect previous install -> run original uninstall -> clean orphan files -> install new version -> preserve user data where required
|
|
|
153
|
```
|
|
|
154
|
|
|
|
155
|
## Regula operationala
|
|
|
156
|
|
|
|
157
|
Cand se modifica un proiect existent sau se adauga unul nou, se actualizeaza si documentatia proiectului astfel incat procedura de:
|
|
|
158
|
|
|
|
159
|
- install
|
|
|
160
|
- uninstall
|
|
|
161
|
- reinstall
|
|
|
162
|
|
|
|
163
|
sa fie explicita, repetabila si fara artefacte ramase pe host.
|
|
|
164
|
|
|
|
165
|
## Deploy cluster-wide
|
|
|
166
|
|
|
|
167
|
Pentru rollout final pe cluster nu facem deploy nod cu nod manual daca proiectul este destinat cluster-wide.
|
|
|
168
|
|
|
|
169
|
Regula practica este:
|
|
|
170
|
- fiecare proiect trebuie sa pastreze si varianta pe un singur nod pentru development si testing
|
|
|
171
|
- pentru rollout cluster-wide se foloseste orchestratorul comun din radacina:
|
|
|
172
|
- `cluster/scripts/deploy-project.sh <project-name>`
|
|
|
173
|
|
|
|
174
|
Sursa de adevar pentru noduri:
|
|
|
175
|
- `cluster/cluster-context/madagascar.json`
|
|
|
176
|
|
|
|
177
|
Exemple:
|
|
|
178
|
|
|
|
179
|
```bash
|
|
|
180
|
./scripts/deploy-project.sh pve-guests-state
|
|
|
181
|
./scripts/deploy-project.sh pve-net-hang-watchdog
|
|
|
182
|
./scripts/deploy-project.sh pve-backup-scheduler
|
|
|
183
|
./scripts/deploy-project.sh autoNAS
|
|
|
184
|
./scripts/deploy-project.sh pve-guests-state install --node ebony
|
|
|
185
|
```
|
|
|
186
|
|
|
|
187
|
Cerinta pentru proiecte:
|
|
|
188
|
- proiectele noi trebuie sa ofere fie `setup.sh`, fie `deploy.sh`
|
|
|
189
|
- `setup.sh` ramane entrypoint-ul standard pentru install/uninstall pe un singur nod
|
|
|
190
|
- orchestratorul comun decide nodurile pe baza `cluster-context/madagascar.json` si ruleaza proiectul pe toate tintele selectate
|