From 9babedf6cad258994c1479d36219e1aefc152d3a Mon Sep 17 00:00:00 2001 From: duffyduck Date: Thu, 5 Mar 2026 08:08:01 +0100 Subject: [PATCH] fixed, create monitor thats not exist before. only create update monitors, that will exist at start --- README.md | 88 +++++++++++++++++++++++ __pycache__/migrator.cpython-311.pyc | Bin 0 -> 35677 bytes __pycache__/models.cpython-311.pyc | Bin 0 -> 4873 bytes __pycache__/ssh_manager.cpython-311.pyc | Bin 0 -> 8491 bytes docs/ceph_crashed_daemons.png | Bin 0 -> 32217 bytes migrator.py | 92 ++++++++++++++++++------ 6 files changed, 157 insertions(+), 23 deletions(-) create mode 100644 __pycache__/migrator.cpython-311.pyc create mode 100644 __pycache__/models.cpython-311.pyc create mode 100644 __pycache__/ssh_manager.cpython-311.pyc create mode 100644 docs/ceph_crashed_daemons.png diff --git a/README.md b/README.md index 8a0f5e0..abcbc44 100644 --- a/README.md +++ b/README.md @@ -380,6 +380,94 @@ rm -f /tmp/monmap > **Hinweis:** Node-Namen und IPs an das eigene Setup anpassen. Aktuelle Versionen des Tools aktualisieren die MON-Map automatisch. +### Fehlerbehebung: Ghost-Monitor entfernen (z.B. "Unknown" MON auf falschem Node) + +Falls nach der Migration ein Monitor auf einem Node auftaucht, der eigentlich keinen MON haben sollte (z.B. `mon.pvetest04` zeigt "Unknown" im Dashboard), wurde versehentlich eine MON-Map auf einen Nicht-MON-Node injiziert. Aktuelle Versionen des Tools erkennen automatisch welche Nodes tatsächlich einen MON betreiben und überspringen die anderen. + +**Symptom:** Im Ceph-Dashboard oder bei `ceph -s` erscheint ein zusätzlicher Monitor mit Status "Unknown" oder "out of quorum" auf einem Node, der nie einen MON hatte. + +**Schritt 1: Ghost-Monitor aus dem Cluster entfernen** + +```bash +# Auf einem Node mit funktionierendem MON: +ceph mon remove pvetest04 # Name des Ghost-Monitors anpassen + +# Prüfen ob der Ghost weg ist: +ceph mon stat +ceph -s +``` + +**Schritt 2: Reste auf dem betroffenen Node aufräumen** + +```bash +# Auf dem Node, der den Ghost-Monitor hatte (z.B. pvetest04): +systemctl stop ceph-mon@$(hostname) +systemctl disable ceph-mon@$(hostname) + +# MON-Datenverzeichnis entfernen (falls vorhanden): +rm -rf /var/lib/ceph/mon/ceph-$(hostname) + +# Prüfen ob noch MON-Prozesse laufen: +ps aux | grep ceph-mon +# Wenn nur der grep-Prozess selbst erscheint, ist alles sauber: +# root 137377 0.0 0.0 6332 2176 pts/0 S+ 08:00 0:00 grep ceph-mon +# -> Kein ceph-mon läuft mehr, alles OK. +# +# Falls noch ein echter ceph-mon-Prozess läuft (z.B. /usr/bin/ceph-mon ...): +kill +``` + +**Schritt 3: ceph.conf bereinigen (falls nötig)** + +```bash +# Prüfen ob eine [mon.pvetest04]-Sektion existiert: +grep -A3 '\[mon.pvetest04\]' /etc/pve/ceph.conf + +# Falls ja, diese Sektion aus /etc/pve/ceph.conf entfernen: +nano /etc/pve/ceph.conf +# -> Die komplette [mon.pvetest04]-Sektion löschen + +# Ebenso die IP aus der mon_host-Zeile entfernen, falls dort gelistet: +grep mon_host /etc/pve/ceph.conf +``` + +> **Hinweis:** Dieses Problem tritt nur bei älteren Versionen des Tools auf. Aktuelle Versionen erkennen die tatsächlichen MON-Nodes anhand der `[mon.X]`-Sektionen in `ceph.conf`, der `mon_host`-Liste oder durch Prüfung des `/var/lib/ceph/mon/`-Verzeichnisses. + +### Fehlerbehebung: "X daemons have recently crashed" Warnung entfernen + +Nach der Migration kann im Ceph-Dashboard unter **Health** folgende Warnung erscheinen: + +``` +Status: HEALTH_WARN + ! clock skew detected on mon.pvetest03 + ! 23 daemons have recently crashed +``` + +![Ceph HEALTH_WARN: 23 daemons have recently crashed](docs/ceph_crashed_daemons.png) + +Die Crash-Meldungen stammen von den Daemon-Neustarts während der Migration und sind nicht kritisch. Ceph speichert Crash-Dumps unter `/var/lib/ceph/crash/` und meldet diese solange sie nicht archiviert wurden. + +**Crash-Dumps anzeigen:** + +```bash +ceph crash ls +``` + +**Alle Crash-Dumps als gelesen markieren (archivieren):** + +```bash +ceph crash archive-all +``` + +**Prüfen ob die Warnung weg ist:** + +```bash +ceph -s +# -> HEALTH_OK (oder nur noch clock skew, falls NTP nicht synchron) +``` + +> **Hinweis:** Falls zusätzlich `clock skew detected` angezeigt wird, NTP auf den betroffenen Nodes prüfen: `systemctl status chrony` oder `systemctl status ntp`. Nach einer Migration mit Neustarts kann die Uhrzeit kurzzeitig abweichen — das korrigiert sich in der Regel automatisch. + ## Hinweise - Das Tool muss als **root** ausgeführt werden diff --git a/__pycache__/migrator.cpython-311.pyc b/__pycache__/migrator.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d19a93a5e27e9dc845374977145a9775147bc14e GIT binary patch literal 35677 zcmeHwYit`yo*zk(5=phhmPEZDZppS@wj{r0OSZ?dWlQoy_ShcJtUX?xtfnN|5~*!c z_LwW(%^`b;W~1aZdp?X7@g%y#+?)pE;FQDU;tz9ykzEA)u_-iS9+3eI1Pf$?e2_7> zz{2<8^7~gco82V!n7PZhP^Ieb>guY0RagD%|EhogWl@pWhTr?GUj*C!&}RFebdmZw z^^z?1f(N9()kYpW3$nK6rBu6p+NLeSa~2#2Pc%#XfPb={0%)f z+-6S}T}h=~n;H!v!F%Jz;FZzP=tMvn(@SRukACs(q@AD**Z`&NwnMhx&XXMh=eR@8 z`-$_mOWq~B0{L=&pg=ANxMg?1J?@r0KXKjmAoE4BGSbi=_N=nA(+vMQk<8{lI#zZG3cFgIiUBao*H+`706L;x~{}^ z1-o_!Dg#y3Mz0}n74B7gY;q&JUt_&5SH}u$Hsq>B4K;FIph~U}6ymx8Pu0rRc%w~8 zH-AB4CDyIK(g=H}qhrz8(W&fLD~*mR;YdUpox;tq9Efx#^CFSSF=MO%JUY+A|F?cb zpV;Q?bG8wj@t4j0C2}*+qmNl%zM;x+cTZfi8J=eEe}&fB3=d zbRZNBbj>JXjIZhGU_hA-P0-~B)8P*~#-?T?(SXvSkHU_z$uw6(xXE1D&1!LjRcyJ<;ERdDQ zBd9%@uLPpAN@y%K$tbrA|E$^n1MT?47R5kL{bc*+xcbsavD@bI6rUxBBQpmEJi6|_ z@l3z%a}@Vwsz}?sQ+95X!!_rMlvrwUWz~{@!wP9ZW{x@AiuvUl_2acV=JGyAi@&5+ zvtPs^XO`#AQJ#@M^&B1NTqq4SrO{4~(mXjzGrt3)z#Wz5%~2Y?#jGDn+eupsbCj2# zRTvU>*mpvX@@Up%{dQPhQI7K5S%o2C^YY|kpbcN_@67n0&osjOUazG8`jm-Ck8wqb zG?RLyn^-T5{4C9qNuOvv(m)^-z+w`RB|S+RSHja0ts=P5IicSk2?ZXF=s8;3EJf*4 zwMQBnmu@Pvf&EfAH1$}DOoksxk0wW>(xdR~lq}r~NOCw7FdmK7c~6}>B^e7H#}{av zgkX6Pyq(=co4uqr!fnX>g{o*Gfnc*m;JPa#oq#PWJj)kXZPRAqz69S=io}3DgjZQ^QccydH z;)!qfBKpv#mS5pvt>i`DF9&hHH2P#}rSCI3;RnlQ^L z9(vOOB^n4$1wx&jow0WBokNuKTo|k6Q5}|wrO^kpPzNJe6?xT7-aAJre^($nhJ`c|#bTYAr{8<$808rb zL}M7b4?2dhz$)XTV`#7?vosr$ja;AxW&znK+Q}MOI^}7hLjQN|x|z^u&n1tS7~h*%=v#Af2fwmBJdA z^rbF!0ssjNj**BCR$IP8RI*Y`k&hw~QPLZn8JQlPnF)p_l0IX|jWB2km66syIZad(&I?o!=duL?^yYukK^c#LKT}%Nv%=jz1Tqqy%a&G!}oP;JiN8+V`7 z+$UA{NtVB9-Pg48*4jYacT)46%*vf^49mTD-M4ooylL5Q#ocE#_ZiiFhUMO~?%T66 zvNrJ?uncIvfvnOG$K6LX_Yu{7gynBs_cgBUSuI$rjQdV#z7tvb--)|#Y3^I9`xeW; zd)>EtrGK?$tvl}P)qK5K`S-=$`!)A|)xCe4{I7gv3sH``2pOk-v?vn#`t}gW0is~j z2)W<3WWRf9-Z|$?lV*w!R|b(Z2d*Ver9ZSQ_Qe`&nmKnm=e$dH%;$qJtc#i!c{$IV z``_AR=UhHw*QZ&e+~Sov+kK-IE4c|7=Y4}9k@KmfPaP=VsLx8yflM`*n445EmB=6~ zK#4Bdoo<()g@2cnQGM1v0lZJkOZ@NR5Z zml6&~yE;=$y}>ecU~R|KZ}KGR&TIv;-j&|{#n&LdL25A`T?&DClwyTlQe@;slZ@pB$?)YO&l#ZO*a4 z%;YSMW21K{#q@M2=It_)Vx_3TdS8zD)1{|wfqQH7u=k@hpzNeGG&&tnB%CtwO|lR~ z(nvVONT{S6QlSxQe$ow+o^cmR-y<3n?EVP7ew3DrGIJ6QmJ}#9D8)kRT99g>B9){g z{2-Y(9hr!b)R0kW2BoGnAt_d8P-;1-&H?0zEMj^8(6*6pE3bZXal_W?seet;LVu#H zQY+g7ilV4`)%ncxyz)h*c4A0vrH~M-Uez|ObZfQyR{Ng~X|=}|E+=Yw7cRZ>Re)S8 zs{TeSS1aCG?teOj1H$t={D?R%-qOTds(1^9pxUC6#le??v@S>q(f_1K-F1Am7ZJkq zJzsac&T|wM|2;}9recdXytc~PCzCHLI@c>YS^h*>gDURhAtBZ+zpshy?8a-4s}fHl z`e{8x_U=u-%I*aNVY&{&d9<_o(TXb|223pF@NY7tdU77{#xnOBlMG6GVyPCLnC$Jpll^sEa4lq#M|!y=R|^=O44mPt+EyGvZOxYuS+z%wN#iW zt3j8R)PLizR%-@VoS%7c;34iG()>fJe~9wdG(2s6S#xN;=1{_4_2f#TvPtzH;vwO$ zUB0OKTi6ZscWo*9ySDV>f+fe&IrO(5W5HR{$ZF{0HT0=96ypA~n*XfI!ml#`cyTxr zidt#;=<-qYH`;h?5d{7BX<|PIpkJ+_5ci+g{O48w`OTWxsro5U6E8fux|0^3;uV}y zYbeD1r#1g+l?B#9Q~l2)nLzLsrfG17TgJ@NK_W~UAufQ^B0{|1cK5^iyg3I5Mw28( zw$J6I$#Ia!jvR|xJxCUVNMAA6f=c)gr5MC12=Bc61`%x~jNix8^Uiq}$aP3zAFxul zfyk8uqVX-;z{&G05_a(quB`Se(H z3M-GPB!!wo>tSkHktPC6d=aH3=iR>R!|x0aKyDVCmIwk!HLx&zkL|+teR8Olr73tn%Jj`eL%yB>iVZuFRMG&t2-FJN+aJI zLcTS{A6*0rwJ#mU9285J-u~&Mg-1KVqW!$aezl?>W4?lpaq+w+o>y4_OPb<2&4cj& z5B1H5dIt?OtALCPccf?-BC6@|Y$(bFUJxC1^1)BiKZE?qAzO>pWQ>1P9zF#?c$w1D zv!KwJ1sM3sDb%B!rqP%+fcGFZR+BM+QDjQE^;h)NSBQ);4AFgDu=oYd^w@_1#qc(8OYQkZDG=nEP23Uy_`Sq+5w7p znoxYfoC~G7KP4Hy37t0ws-Lo;`phQ^H|3}x8kh5c?u%lFIY$Li zzk!%JK@W;J03`mH<^mJ?rto%Gr*Z(VWtL`wqzkpr>8n78Nl9^&Pnb?*GbW6+pj3%E z2VpQ)9ow*JR!-(k-WWKrx(pyKW%G$wmtK2#jV76N^o=*gnSc{xvoFO)u(iby@bU$w zK<68jx6nG}3`Kp2a&ZoOkshl~&(;jN^M9eo{tqI?Hi(r=G0oRRLfR@Oq&*N94r;~nQC{m3 zwF%Au+F%p>7@y$B)QV$kWrz^sVz(xCt75lKT&Kx0iww}?jX{(Gy4XGrv8&j9BEK#n4EbzCeslaw3kHyWlY{wIdnuxX<;XH;V3PiO?9Kb98_Iusuvhj z-Nq!wQg>{mGZK%^tdo{Y zB1|&|0+7Ai%~SS}(vQMog{ErxbgbS?nG{vdT=>SEYb zRW8so+fUPGWQ$c~O;gr_1n#BhC}-_UX%ZsZp0zhqje~rG45}3r;^L4d4yhuO092gH zHAmZNj<)l#!#TPMWeVc-pEyTJEJCE^w@!@zf9d$dw%{0t(brGhR)O&6$YQZ4aloF$ znPq35RS%{T0JQ!? zNoXJc$!?lgG86?!HD+v%`R$qa&KJ&kWUn#5O=V|6SD0gdPer$SLYOPuMDb7r0w+(| z#d@Y@zF^Bza;OFtYh~X~R2Q;n?N7$5QmehDRy*X9kXFJ zy!oOnAuG@Bk?;1V=8EJZx#C&n=O7)^svx^<%UY`#bk#YOUL$k)%8xUi&9{uO8un~$ z_Om;HJ3l?b<^^u)+aH_M&?CJ zkCVYj*3Vq7wS;-!oKJDsZK2*dQQq@_J*gbAv^^8IRGCXduk6hp1G#%eZnoBKw=Mo2 zYH$2bwY6l|w)pS9QwgovC2aY8TlQODd`VcNt$lPF}Ux#N)JK*TGKcU1nfa#q=d6Es4R5Ms>W&!rIcWO#%togj~ucs zJ)s`j{;F!u4qK^OyiGeJx7r*`4Z{eoHgL>%OsS!WSfB{4v6A#5m!y#qRBV41&7{8@ zlkt~fJM|A#1`%Vw1G{6(tAboT6(vf`5MxL#x zIKfVF^}Wo()?oBzG7I~{&P0e=)?mtaZ`MCjv*@u8ZEEFN9+pSfe)Lrg=gW2@EgNj& zNl2vmZ7ZTnHakh9ZFh^TZ;-6@ZrMJu178%Ap|e7im~x4tEK@emNit&mU`9C|+qZ)^ zlgf;mZIL#V_`mRnRxrf^tlCDug8fh*S+(iP2IGXaWq30lKgayE@(%6W@eXOVDQ6(6 zI0KPgFy|(kb#5a2zS;ClXDwze{7p-6T;bTEW3&aPbdm92d<`9M=w__=(IkxYq}2Ub zVd_lk7>(7X1%27*Emp(v%DvIZq|`AcwM3=@ff?zL)Z8q^YFnh!UD4^8u2gZIQ{f5e z(COxbQgf`+WIv}Pt%(3xxkj^)QyUEVenV^S7xrX9G&mgy&qia8yV7hW(txxS8K_e_ z1T-`onFz2}MPv2p@_80AzncK^BTLiPn3ENH5(SWkcv!dOV>WtvrkG?1D!I5mm8pY+ z+avvkOnPD-;H-Das!xiYh)DMc8^S^nh?p>N$1pR43{EOJ>yTim$*ciqNuCd-{H=fz z91lKV`#|nW*OXs;JsyzG8%C6{kcF-vMv!O>nlW@OLR~}1>Nia7up0;(FEWI;88z8n z?w1}h0FSclgiXPxrcEUdLE5pBSa)H7D;*xtH)%)XcVfTnP{X0;7HQ%NtPd9L|SkwR<#+bdX2l0 z4$$y5*k~X zLKLs*(`x!&9Eq0?YUP6qUT9;=q2c`=!nL!x824^s+)3_5qA$|Lzus23c7+QEuBa6h z;^MF-4y!Eem~kfy(L7I8qKcUsT!iY%UUbpEH54!OZ{*ucI#zF! zYP`b~Vd*aWt=m>q3aiy+=Ti?3JQyad2|-L5F0A-Jt6$51?s}o9f)p1nYQjZTxX6T| zgZ$w^wRCXhHX@MYb> z^}2&=d%oHiuRE>PonG=J%IfIF)g=7YOXp$Lu>AJVdY5{c(ZOA=lE16g++Dr-><$h* z#Qi_i{6AFvKl}#6=i>5@KECqg%F>nJC46Y0vuNDT#-7OpWYzzymK%YX?Lc4(!bbTI z_$2s&TJZy(kDd4Ea(Ba;UVr2Qp)mY?+zb9*i1XETp@3+&3gj;1_dP5p0=1m#q5smQOgdIX3Xf zhWu(Jx5=#waw=?sd{$tUp)gqlBxm!UxdPd3$hWp?VJ^eknk^xQ6e*W{Ys+VHNYQrG zN@2&X+#2Sh>|TbUZOfK07w2v#o;wFAUWw&dU#7G`7O|_&-0vlsIk2mac!R8;T#B~} z68}qs4~&dkN-DG7WhUC`@nXnz%mvGS>odkUf#J0=PWD)8DYrfWsSr`B`tQDwI+H6h z^M!ntaw;?L&pB3d%6;T2YfhycJw#f9tlwOg>Uh&Kt24^1K$*lGXZ>iun^l617MtH+ zjkP57x>fIWCJQTh&A4V8thAFEUu!PUD%S?L*+(O;tuA(u6SHQs1(NEdbgcVnZ*K@R zdq@U>e~t`0w>6d^x;wO~DG|FHtHdTCwlBzRFhQG_YSXM2L_{F7O_2SDNMGeDMU3=E zA*Q>`+=5DvQt2tHBU6SRiELE$YEuoQI;%44Ox>jXsdH2DNKF-=y4xeo5^%&9apPj* z4&I&(E3?y_5ecE9o3RRmaZ2CE4drb-8|wu#)Oa`bl!c**HX3Y+)Pg3BO-m32K)wXC z=z}fP1~D@=)+VKj3MjEh*Z__9I1OGZ`+4OZs(ufz9-GC8i_u|EK@ocdxfNIpf@f zuWb}tRF5F`UbS~V>rg8%E=8aGcDTmbklBbGNGQR<@OlwzjQaSABcp zz5|-?z=o~BbDA*)SL4DpO}M5C*XT`t@UpUFy|P2?JQJ_%(<=Ku8f2D)2NS*$lO18& zxcVC~p5Eny9~V6-TEZWLJ#FqxOi0-u_x`kZDHbnm(h9*E*geON|wTWD# zHq8za6C)l^anNMG?j-YdBZ48iKV|o57}(V=LFTxF z^e51`uxbOuuuT2Cz*qC+Zoor zXgG{*|Dbu4M?oxOTgyA+P7rQcvE0G6Dk?$$u;!w7!NZ;a_L|-gpaz*|dvSZJ8G24WFA?_Z~+ykn60601=luHPgVT0?3loL@(Fh^Lt zc&X&4-3#4`iW=I^)3sjFl@MF8k-1%KKZPe~>kcA)>ke6+6De?+OJ>rN6$n=l*dlT9 z1teA%5#r({O}wP00$Xn{#DxJ(7*K@)wnW{J3lB8mftm_TF~o>f-lnPKJ2 zXtNb7-^VTf`y7WaQx~>*hZ#d{mTS%t19>%Pf54to9$GN5d0jBd&2*l_FnS(sznFt> zC>^7h(?02kHeh3e83s1avM85bz{chrS@_!028gryPtIV|vq!|`UWGuslHWw$hjmgF58qwY<9||;1 zpv55k%S`o>`H`p$Wfmizvu0KRxy=@}8T9>sr0MkM$n&A?*Pwqq9~V9;TyT9;T)G(i z=)vNH<@534#+8Bf;(coIK3xiWXua-`diYAbZdj`u{^$ybs{CcUK~$-=ht|f`+LH*3 zLT-NAX`Q(lf?{83Mz6B;Mj(2poxn?M686!DmZF623(#>?OD9H!A zNfX?%_^c#{Y?;QRU>c9sJ$RYWm1av_VdrMd1EA;3CzuUlw$p|kwaEWnTa+;?H|wc# zOTScP_R9`Ssr>HHZP`;fHtj<)J;a>))x?hIhF&D#gT#yW#p`~Gq|tHge$Pqw$66WD zi%0HSeH)q0GPnTfSQed&r#7c?Q#bjNRhlO4aD&sfB!P;ZAexa?pPj=DLk^mjgkAj6 zEP6Io2WZ*jMy^x^Imp-jhTi~~11Nz9Q6lUc(_LdYJF+@Mx}a~O*^QR)-Si#P;8><0 zH5-p&RmUm}M@+5Pl;HHJ^0@6yb(WA4fYKvp-UyauUPggTNXn#_dZtaJm-<~a)g*UK znY@g#yA#TpSVy{U%gt~^?!?LtDVqfXCe7TmKsjO6~2q5nQk)+>}lWxLk)8>LjCR03&D%y%NrGGhi zfn;$;Z6(Yck-@-QAam=AAOT$nM+T|0WRjWp$jGcGHfL~^V=o1;Km|CVSTGIasX z<1SK*PsH6ln!87J_hc{-{aZ2+uhI;JdZ7Qs#IMGG8ID)n(kgCo-T@>LiC&H~GU)BN zcwG~(t1K|C;p}s84QCPJ;yFz`r;6tww|ObHu7erzuRb!i0>LB#QX(=3xEvR*Xu=g$ zxWa@qjm!#k`AhgE^L$ksHxtUkD24J~!Nx?8L6UMNPQr|6}-aotVsor>e` zZq41Ty1QXwKn}AG#odQB_hHq2I8oQAx~plsIpk06p3|=>+L8RJVZT~~aB0o?mFM{n z)dQCn;EVxV{40t|6SVcexa6Y!RqKA$zn7`Thq-DT4&W%n{Z}>rRh0$6+SL46)yu}C z>y1YfRZ^nr(pvvlLu%C}9>}>s(W+Rry(vZ&F6Q#iPIVvO#f@%X3evr4-`ADNQ(~3a4XWGn9#^ty+I75(Bc@_n~Y0Ex{Wm|e5=O%=o6KZ~k>_|)Y%%x`#J*bs!@^@iB zs!4IkTmu+HAIPU1YW&5(mQO%|pG%Ft_#rt^g{S2+x)2X2gDsJ4F=D$sv8s^aF*jsx z9fzsjz0t7;aA^sJP$;Y~?QNa0GPcMOeocFNVX7Xc@r$+UVl8V1ea)lw1p=L5fV}54 zr1o3t0vk(-J<_n*Ck$7okbN81^Dwl3j4maL2s^jwo&eHYz{qk?Aq=aeg*5b_j#)WQ zRghrz>yo{Gxbe0ke~WCio0?$~!E+hbHWcp!m*_Z^`&fZy1frSB<@_f;vU7Uv$|Knf zB3(A)w#sI%ay0~uj3~s#YnpgXWr0g+_-&HYXbufD#%cZ%sa8%i zQvhSOA6Nd^e3hO+*oo0eQ*0BlH(Z3v8D4!ctsI;1d07IM#jZI=3K4MG7~^`s#NdT`*{utM0x-Urq`;6dRE zT^EFXzupMLqsk#mZ(xVqikNDv`4}YlZ$y+YB z+~)f{xYu!PWrrsz31VxY8tKZ_VM!i^Epn(c=A<}j`wcOXvxHU*ie5J~eiWF3tuObj zDv=l05Ix_~9}I*bfKS;f$96G!e1|M`JsefKrh@kvitIw^?4&~(M%gCQggT=hDveu2 z!)+>j5l2C6JN8R$rEr4|?Q|idXF1E26o^=ar7gL{hwpH>LYsnz)nwkNEGIp5kMFu| zq`JtwhAYG+I%B3089H-@ONq2iI`4;r@If94!#qN^sJUn9wxHKJ!u)d)&P^6jb-|fP znwm}Tw2jb^)^RNk9Nk8cW=6N!lzA1Q+fVQ&K*?6u{k;5X`9krlLZ4PxyJ0Kz9D610 z(WC>Kbc!U{Z7f<6URCaXS-Ee$a^LEOwX@Id@yZ^pvIl;e#Dqkm>*?{AwO#AAU5sGsgNxUo>hD8HQ)_hx zK!4Q{wN_X9u^Yak`j&nKve93$T=KK-rS62k>7~DU-QT9(&Ol?|obAeLH^ex_0ooT6z;9F1(`&@2J8%uYC2YyPhp1 z!wQWEi%TU!Lu@%|g4hY)g|IUx@<`;rtnI&8D&V_=p3r}p8dm5o;h|yz4w3Lr2s@S0 z288_%Lz>2N#*n5%@dB|KCC)jRkJJjJIa80$5c)J04xmrxCe)m{9DH9P3*ERjdoDBQ z;w|PZ-+(Ho_5kg)^hA~qR<=Fzj&+e@3xm-zwlEm9BirU|hznPY#U<4bbOdsz-Y_5o zy;%TpooN}A-OoH$$`!&)BR^VV>2Exr!yt38qz0N>9n2z>KJJ1Vn$&WB!u7t!s?UhH6{ zkL#rq*|B}ERR3JXpSrfL2ZY+hmT#*e zTgbd4D7Jq~JL$R1@whAF4Q0*CjDBNy5xnJA<59|PVd&JBPc-Hp!8_`gCiDBqG&7|+ zuw~7=vtiv)t$R?b(Fct1HIKfmUIca{dP)DKiEeps7FH=-a=<-+Q8wm#*4FMFLD*vM zmu>M3f3Kx->%3^GyDbyG&>qYEcD8wcUv@8Aa_!G7Mee}X`a&qA9Ct~%XIdGyS$j;q ztX#G9gTcC_dYO)Lr#VlWp#k3LvfMFbCAd>JC$iWypY9us1@0VRjyn#1TF818J@=(S zEu?2l=xcMU{vX1+Ih0<&dWf~<@HViHoBLv=#N30abEx2sP+6ZkSgSEU(;v}ctuC1_ z#oADUHH(j><2xwREgzjLT`5h~VLn;~1!&2!PxCgZnXQ%~r`$a+$j2?~<|WH0%%mw! z|Gee#_pUaVz=uvNj6C=H5|!q70dtB%~7`N=kdB2+Yu) z=;>f&dNd002KH#4oviXBf>@@A?N{l*8S{{ zCJA#wz|UhHDS3QPYQV9~lk5vXY`;2_-m@L+kWMx5$6yLOg>u<9dCbKzQP&&Mk_lF- zZ{Wp&93SZQn+(t1lv?s)?mv{?xTHG|5B0n$>^Xe+z=5s<`yU?cdE@Un)_wd$*8wOR z(j~nq$$VORW0&5Pu)OAsF&{ZKNOxGzn>v8cXHc$QfxqI^dqt*T480M3Q=954;~w3;FkUJ!KpFw0Ab5yRl}*9KE`Se# zF|RsioDfn!IcSbkt^GK@;$m}5@T6CuVuZO;9h zf5b1gSMLga0P_x@_oAC%Ncj2$I&Yt``OBD155hB>Or>ViWTq}kb)31Y=uN}#M$T7e z49r+l*4Q(*fDMH}72Y3LxiLrEhJ-l1X^QQkfbaxeG+^OJGa^)$r3*LV)x(MMjV{K(7qY9ENDs2P_ z6K1n@OCf~Lh0II|7^K@?Zd5@TQs*T3rmt@4iyn7skrqia>x!fsbu$@uvQUR&W;8kp zLHZbdB2HF9C_F+-9HiEnKQ6_N;%2OV%SGxG7Np1$1ajE9Rbi_bw&T-W8DHpn<%0~? z;VEN+;?r^AElqe!72Zk+r3)7zMlP>h@FZ&L7JRz>LV*Y3ZbVr+M;{zfVz>Xwp3mCW zPOD9Q2()PiZYuAn<%eMsaCPBALMVSJ)U6A3%ktCUYK2;F@+&LUz7(3)1(K2rt(wrP zvY>w|j6*kM_+ensF%y&Y$F>Mq_?sy3z`+0_0JwuKJ!eU7j!pkOY;P2Bj2i_UQ%fnt zg>FsgR#`yx6?<3S*2-J()w9myT4$eHetYS*R^F_ZH@}E!1GnjGXl<*Ft4*s-T204- zkHLRw>Hd?jT6~Fzxcjo^zO1@0Q)x9%-g{ZzwqD+r5GoSF&~ndHycpfX1d=pi*J>$D zA1c}*dar;rKBAAj%uPlFqW6?FK6|fsxC4qiYUv&I)(~;r-OB_7p9; zU%Kno-E}BktvYVh;j+;OMDjf3*Th4J|FT6;OEmp7RwAEnysETck?Hjft53D^9#f3T)Id0iKSF_=;mkiif-Xq@-15kcb zoT#kd$TMBGA246?Jg-ufdzeQJ7kSh`WVjcm&xr7yYp-CcZCIx?B>b0G-KzgG!rC!@ zM4a$9-~$5tVs=ALR+`@P2ClUFh!9NEE$tVjM(sHBqFp=tPF%R93Aa??78^hM ze!FwL-RIO|3UPP8=I&SB{nmCTgcGaYXFgRpfnaI{jWQ>VGDJ{^dAz?BU}ClCT{`$t z(PGg;5hjID``UKZ`1l~U`weQmFU(&%z|cF20hk(ZHW7IG~CHiH3bkg#fM^CRrzoZeU+5#n7$g(54|9 zhEG}ZhHZDr1^cVUy=0Zuz24Zp;c!)7utPugf!2aA7Se?t=i7Geembc&bZr!vQr)(? zmJN?7!E39No*vg~_iq$hQV$%rB=C|2TjTBxpRMWmYnz*_y%43Wyb|{qJl3_f`Ma*xALCab@oO7 zFX0$UH@n0Ma%3zXC;7C7WszmoFxC&oASaz{llq^5j&2yEplPR7Q{2Jp)APu}X8^o?&lY~uY z`oL2)#RlS>jyM3X)dg)ayc$F>4XMZO74Bvg5 zSUNN6*~_SBfv9IhDe9R!Yap8>ur}YHdggU|Y*qVT+gw#dJXaN`oIbE`@Nwdq*e8Q{ zuG)-v#s}we8+iW?MVSd+^!{1i`)5^w!guTa%e?n5!@S>Y;SVE!M(>{Ew?XQjgFlZ_ zI>v>5P3TvJ{#R)-efg%k``B~m*F|yn1XPme#?z0C zB)ub$6w9+y0h|jXaQZSjMHXwgDi|4&!($^Oijy9s?QsgNQ%NVuk(17QkYy_SD7A^D zlGkGPwJ>E5CGMrDnW7eoS}B@9l+1(JT?x?TBt;5EbL2IZ54 zb`dHRx$z(Q2R0Kv#B89ygtJd|_H8)ruF7Q?qT!Gk<#)UM8#YACMeMNVWQXTbc2KX~ zWXH@%vA=6~`B(7>9be!XI)X;q$YUp+aNI&CJlzs2jv|+Tr5}u<%fEJn9iHrChs3Vk z8+o`)wC-m|mS~C&-9>X&u58%oNC49@(YSXbkDau4@)MqJiGSa5L4TBv^e7$KqwItp zr4ycRiLW^-T~l`IB|7Ga4|!eXFa~s$uja7>H9wVPI;$G8yH2k_$V12HsELj_;#-bl z*JV4sRyxvarDKj*+U;tfY&bmM{e0|eFi$wmjIcxhjJ@B!k#{Z61*VYVRRBT9M8|=( zvS;r-cYZNqzRhpyv7F!L8nCaSWppHH=(u&v=LO9MSo8k}ni=G!DVdMy9GHsmxmrjv zM=Tz2oU8D8%%+faTD@_fUT5E|7x`0ak||d}*3Ra>#KHJ@ii?0UZb)iU2+B%|?9MQ{NlXvL(C57E6zw z-<$Vl$eH(h@6G%pk%)5eeDU^e`D29R{)58d6ZDu*=Y1UaJtuQTPWH+Eim&P~`m2Fr zz=v|6LaM=H(8p1~pS#P+?6K7gRJrmW32TZf=o?gctST?6 z$_rt&($I9O3I(cfD(Z7#bwjGHQ#Jb&?o7t-L}VCTsz{pV1lP*6B4>OK|ER8)m6}v3 zb+!+ffG2$V3ozevlq>qcIsQL^JBk5HXi)Zl4jRS2S>ei$Z-Jbs=t*ca{HC+=Vq2{f(e5e;nN^PyY z-cTi6Th<{psY;!&B+D>JbHXs7DrwIhQYy=8!3nQRI^C4EocJ@fEU#0suBf`^a86W} zHbr+X_zYeYaUM~0qM`^cXjG7oi{dv8sp4tEq9`jR=niPQ>Lf)`s?`*oeTIg;@QG?1 z_CrPJs|h4YAU|-QfO0<z^;V{=VwMBU|56!}tOu_|tSC#<9PTWXU8;b~It+jr_~Jok$rEj0Z0t95Ef$ zfmw-$r5ZU1#K)FyOMgD{)#2^$dMrag(=fW#oj4>&KIzLC_H1R(A2C~mP__C!i4RJ%!^g9k;*2IcZk}6IdIF(9( zif0x2gU?CIbWLhhbP+;GSJW*h+6fpSlp$^|pv<57y{?%A6)xxC<6XEg;ABx`nCWr)WmF(RglKnxbUPh)){ZBQ`^Np3_fPS@FawU_ zTZ69?CIM&8Sd0SW?k>)J`tELnrgwKCk3dO$@9)VYu)j2XY)^T2-yw@(M&dg~G6q?Q z_X;ClOfZS%Cn%tOOmd51415uH`VM`u%4*#9)MH82sN8WvPwi8u;e(wZxu$xsHT+hz0%) z6q#cekYkQrL~aR5k7KW4ACh_aX}H^`I98b54StYKVc8Ov+rqMOduO2;Z^tH0vJA~4 z%l3HMC^T1(LT+>%qV~d36c4A3{El{{9~m?5HwR5J2F+p=7#9opFvW_4&H})P{ZoeG1P=yWH9Ua32Q`4ko|(ktITm8 z-sjdnKcETU?qVy-j#klCTHo-HH0~h@yLwT?$^%)`%Cgf}Z#=7%OQKgCoMZ<&?lH_o zT%@YhSVhvDII2NzpkpqN2&3(08^`aLR;pi=ug zkZuTJyxXY(Be!$GC>Vv81$%tLMazUqCM+^xrzed^%_k-SKuua?(oPGl-+mY}(~DMm zv7KH7=;+PWS6e1ogl3UNJA30T{a4P+=B;eLoy}u~Xlkw8?%-}|cl2)sbL6x30Mwy8 zG>hczGth?L-G#OQbl~&p97Jy~+J05$A?z%~%ZKMAI1AC}G34cX0S^WXD6RTaflAXeC*^TCyVEpltLX_&&Y{PI!Z_2ozX5- z^Kw6%Eetpwa1sy8a6(3eJ+4T#?dz*bwO*k*6{?5*LLC&sW?A15l!`3O--2tyrr;f3 zv@Aodo4FX)V_?*QcnptO9^MNMlMb&8BPECy&~1u6VKLfK^uz}Qj8`wctA!I|rfyok zt-c+>A*e}V&?1;p2@t3g4ZiKBM zw~B<-*Bo-Uk=#MT(lC})7D(zn>e<`w!TM1ZUScKx}vDVS2VFrdzi^ z%$O5P*2GeKVu@vM{?#qGia@jALedi+C*-Yxl#rE6^-*#U2`i%g)nIF|a4$#slZE z&dulJr7QpEX$`lekcqP+u@mcD!>OiXc)MrckiLcIXxAO=^vm4F>L_yurUtgTJ-hxh z|G9e`y`??`6WDZ4`zz4BfY0Z%xtk_;^CLHBp4MzGZFV;}i~3`Ge%?2>$DJhm*mr$jk%WR*qDTG)wjo;PWM^=0i&Iv%v4}wgTC24?j+gAz5^tkL1>g>V?w_1J?iqb&dc literal 0 HcmV?d00001 diff --git a/__pycache__/ssh_manager.cpython-311.pyc b/__pycache__/ssh_manager.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..035af69c0ab3171fe9919a7f50133dd722687e22 GIT binary patch literal 8491 zcmbtZU2GdycAh`}iV`JJzm^@1ELk!gONyf;cD9Pwv@Pv+)5u;+$=YtREX^5NT#KYK zGmLD4@}`SCs7BG%23c6ywGloPt^xSRn<7`kbMD-G=Kh@d?sv}}{as_DpF@)VVJ-1*A&&b`y4g-rCG+G2GPgN} zyUZ!PBFyubd1!H7NQ#$5o)fqqaEkN+r?~D39Csf-D_xcpVVVoOv)@cl|4@#nQzs7BWmhB_HZm?%&93O5sy*3BmSAWgf8RK)ORxpO;zM8YCM+FtIg|1T0_G$o@?q2 z*rw!B)rgNSyr+&XXo>emsl~LG$f`<|437F2=MwQbSxM-zg#|UH>GC3alwm&{pU>z9 zW`X|DENT^5$!LkxRXLfss#Qkxh+Huh=1uRp1sY>)K3?$-Q%#kdCnirGRylZun}r(+)4}DYqV`zcd_#-A=ouBy9PBdD=BTb4`LiN z%H7A{R@yO!W@WejC8Y!Hw6OZ!`gSXwuxVwU>$T_Itp@h!*RSkDzahLk@+9?6_T(q0 z2fRuTEZgu_s;GIPvYZObDVCD&qI#1&G^Rj?ZyX zD0MeRSlEET=o1$I4w1!qcgY27eA@pKaH zE2djhjf|Fxlasa+wa1+H-^hRrL4-N(XWO;hRdGqoiFw;`b_Ftus7Q(nKR13J{Je@_ zxT+Rt$L{GKTDWhwatN6&@MWSwK z41lJam^q~|?1d#Q0GDXZBw8R$F`iUx9BPeJ)D*o!lZq0YP@C#|=X zG(IA9n;ygRX59*RqlSSs04QOFb9of(Oj!9s{hqxf`8dM{Bgg&BUi&!-kmqyaXTm)I z@V*VgC0EW>g)j1U4e~Z5XT@o*pEK;%&@zpYr2$UEFs((B69HcLU2#^73zxt)#`X>g zOW5sSa+94wueOqM?t182Pb!`z_f7XSXX!*rsSK}GP95EZth)H7G zkq9w?{9YnPK>`91qAyAp7$fN4lMh?m5RC(~N3ruOKr+*+riE?unNLNtDIQw@ji^yr zEMyE*GJsv}0LK03f00ZsyB~engP`}Q$gq`TvlLgDygn87X+5wv{d(pK*fFl^x+#Jy zO@D=@>O)o5qWud`$ z@XPkzkA7Ne4wZWQOYPmIuHLfG)zS2rgLq0}d9obf+V&Mg1Nqs%O|HN7yLSqq(}lq4 zufGg-7lVh(9PgXpYh@|azM>U+&Tb4rRIbq3LZEVe8SEnKgH^#ExI4D`?#Hj(d1d8f zA<*ZzzD6pGcm`VU$Bb5=k4W66)OA`EH=py79BPT26gN-slt1Z$G^K@@F;}-+5b$Xk zJ-G<6*8;?n62R1sW%xFpT@sfhEG|(IuCZmKNs5?5PzF#-ITz`$EBnR;HKqW(vx#}t z3Xbc5{7eArnK%LID23$UQlpC6tb|Bf)~LIg$xnH01Q`%-l~PAhU`;?ppqD2*rERs$5f^i_H&0>Pm2+`&)Y{>|HK1M7|J27ZlO2Tm3boZRy6TNail zS0+mhjVmp;jxQfCg*sO|R>li~-cqn_Wp;U~;N8zikTz{Li#qlq2j5$IzjQ`wfSnAZu-+Tt`QkArW-2~!A z#b04Jrfb-(A^Ve`XbEsz#VHg~R>0xpxV@o~1VC^`tAU1_pm9>pcF5!7^3eGU=Ptf+ z?qYOmVkSCqZgR+$9z^__-hMxO9L>*PJP5Z*?ONG`8xHdeNhI}jv zLH|<@0vzUU@bx)4Y~Qmuthu8Yl=G2?!9#`Mp;BkxO12d0S{=MITnG&n0z=?4MofJ~ zOqM|X-Tu|s$AfnUS6(XwWXH8lOMTn4^htlD5wzqb+31hFC~kH(M}|R8JmrU7knx(` zma_?I5>wxMMJU2&;ytXM`?P{sVss>cki?vzNEW6U{TyQ9ot&5j%Gk!q4&N~Z>{q}? z+q-DiqsHgba{AgMLVK9EHXItAc8m&YgSHn@VDeE%$QDTGQ80+rZnm@L#nx63*XqPf z2-iZLx5qym&rA8lM(fJ>R%pB!8viRVSS7OjZYkKZ^5a{J%T0_y>Uf)WJ(~8D|A4rS zBe-G5;s{yne2zYVP&gzY9D-}_lY3dBQ$S77B-VsRVl_0XghSg8L03bix^M`4LtQvT zR9s0c9KxP}aEPM8O3F#QghSFz97GWgLDvw5H#@yE9GXwZWApPjp2-m3F8aZN(526* z^YfaFacO-dDDcq^lIVxXcAcr5C7f}OHh}7>u-C~C_Lid^p+>4q;j%U;iV3Yws{BB& zg>6pO-qctLSE6i&IH}lY@{zilckr0a5dk}H=`3~ZtA;KOZVFu>o{~W5()33{mk0}8 zwq+%BIkkSZ&~vJCg-#U$mFv5PF68oG93AEUzAG{!Zu)#ATU#PwakHPNeAoq9#}KrU zGw2tQaYCN}Uw=|~nOhRDZwh&PQQ$E<-9zraeK(6;3qZwReH%O?{C@5jr%Q{16`%9m zC633RVx1Qxy9tW^dzJ|7v_vZ@=Q!X}KiD0?Q#bLvrE9?M%C=U*CHDSV&@^K5+RW4> zeZffM7>Tbc2w!TzRpBNU`0%sVu0x|DR9T=3ve1ULXze@uYGCE4Tfme0zd&H~ktA#; zE$u7H>X~2le$7=R?n`XRBE*Hp_)(nUF}KN<|O|`v`{?``&^KdrWcU| zb64EnyWtSZGZOp@WDq8aTF0&*PXz3>2x6-L@R+6#EzhJw`p^Pvv|J6U=u>L;$b}4j zd)WT2#)5SEABcR|LW=z#lJH1a(7umBS%e3$)?&`A*=-^@q@*hoM9Ht80r}q2tBS@j~EuDH!@??pAK~Y<_6% z_*QVN7#u5j$E-j~LJQl8^30KMBf}iozPlsq*X-VIbh?~5apxg;cPCC@K-w5YUEImm z7&*}qc{VWyr`9ZTul-n9U$smRQ}~MLvmrz-9APdTdKem7leR*`#n5meFiZ}-dF$q? zl0Ul@3>Smpf;VirZ!a85d*aZst?unWY??c97~Uo*_920t8h7{LpJI|4!6jS^!zxQL zH#%S#v^c2h$l6`fQTI3G$!Egx@WasIwKfMFe}3!dt44mt2}k^wf;JY7;syK%j-5us z!lb47$#4h#10fYls?n(Fk4BSeB{NU?Ks5SpCN^KG@kFCaIv$O(L#ZhyQievb*66#W zDbaUu>kFOB$SlmOY;l^>m2`TZL5z7x8>a`@+GW^d?)x(;n<8-@;!}=6fCUs9d5#GR z_Vs@S#k_C-m87YHH1*Z@Bc;)?vM9O2Wey?_xIt}Ls?qirMpc{j^C#laRAKAl0Vo?&XOpQ#OzsRwUTz#v0nS-M4pr|{j2d)Ro7iS(Mil@%Ad#5-e zx;n`ZP-`GCD5vmmPbWXk#<@Ob&BOH|&Svr;Sv)o4oB>V0Jm_}y<mQMeRdvy!@c;f&QSo_$RNkd#7mSCioxmrT#-@(dBxn%t7QaWvI0{ zQyUl*?n(!+2a`TBx-PCyZ}hJ>7LS~)KE#YH(ImN!(EC0@uNsOPf})0?zEBG@7Ymo) zDa^c6ocbv%a*8JI$Y`}?nmP?fXKDkpqhTBzw1zWw0ua(Sx{G6Hs*hOXAiHYLf;gcY zyfH%{KLlaAjT;O22a&a`81^qwU62HQ3H!!7ZmrFe+MnZ=_E-HH1OgJCFAFYSLKhHC h9N${tTCA(Y^%Ux_vik=DkI_6^K4#@lcd2EA`9Bs2)`tK9 literal 0 HcmV?d00001 diff --git a/docs/ceph_crashed_daemons.png b/docs/ceph_crashed_daemons.png new file mode 100644 index 0000000000000000000000000000000000000000..9d48607795474bb7e930f3304bea7c2d6531026b GIT binary patch literal 32217 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/dev/null", + node.is_local, timeout=30, + ) + if rc == 0: + print(f" [{node.name}] ceph-mon gestartet") + else: + print(f" [{node.name}] WARNUNG ceph-mon: {err}") + + # Restart MGR (only on MON nodes) + self.ssh.run_on_node( new_host, - f"systemctl start ceph-mon@{node.name} 2>/dev/null", + f"systemctl restart ceph-mgr@{node.name} 2>/dev/null", node.is_local, timeout=30, ) - if rc == 0: - print(f" [{node.name}] ceph-mon gestartet") - else: - print(f" [{node.name}] WARNUNG ceph-mon: {err}") - # Restart MGR - self.ssh.run_on_node( - new_host, - f"systemctl restart ceph-mgr@{node.name} 2>/dev/null", - node.is_local, timeout=30, - ) - # Restart all OSDs on this node + # Restart all OSDs on this node (OSDs can be on any node) self.ssh.run_on_node( new_host, "systemctl restart ceph-osd.target 2>/dev/null", @@ -527,7 +533,45 @@ class Migrator: else: print(f" [{node.name}] FEHLER /etc/ceph/ceph.conf: {msg}") - def _update_ceph_mon_map(self, plan: MigrationPlan): + def _get_mon_node_names(self, plan: MigrationPlan) -> set[str]: + """Determine which nodes actually run a Ceph MON daemon.""" + mon_node_names = set() + + if plan.ceph_config: + # From [mon.hostname] sections in ceph.conf + for section_name in plan.ceph_config.mon_sections: + # section_name is like "mon.pvetest01" + name = section_name.replace("mon.", "", 1) + mon_node_names.add(name) + # From mon_host IP list — match IPs to nodes + if not mon_node_names and plan.ceph_config.mon_hosts: + mon_ips = set(plan.ceph_config.mon_hosts) + for node in plan.nodes: + if node.current_ip in mon_ips: + mon_node_names.add(node.name) + + # Fallback: check which nodes have the MON data directory + if not mon_node_names: + print(" [Ceph] Prüfe welche Nodes einen MON-Dienst haben...") + for node in plan.nodes: + if not node.is_reachable: + continue + new_host = node.new_ip if not node.is_local else node.ssh_host + rc, _, _ = self.ssh.run_on_node( + new_host, + f"test -d /var/lib/ceph/mon/ceph-{node.name}", + node.is_local, timeout=10, + ) + if rc == 0: + mon_node_names.add(node.name) + + if mon_node_names: + print(f" [Ceph] MON-Nodes erkannt: {', '.join(sorted(mon_node_names))}") + + return mon_node_names + + def _update_ceph_mon_map(self, plan: MigrationPlan, + mon_node_names: set[str] | None = None): """Update Ceph MON map with new addresses. When MON IPs change, the internal monmap (stored in MON's RocksDB) @@ -543,12 +587,14 @@ class Migrator: print(" [Ceph] Keine IP-Änderungen für MON-Map") return - # Build the list of MON nodes with their new IPs + # Build the list of MON nodes with their new IPs (only actual MON nodes) mon_nodes = [] reachable_nodes = [] for node in plan.nodes: if not node.is_reachable: continue + if mon_node_names and node.name not in mon_node_names: + continue new_ip = node.new_ip or node.current_ip mon_nodes.append((node.name, new_ip)) reachable_nodes.append(node)