Newer Older
f16725e 3 months ago History
190 lines | 9.139kb
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