PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Script um bestimmte Ausdrücke in Dateien zu ändern



crackerjack
26.02.18, 09:53
Hallo zusammen,

ich habe eine kleine Frage und hoffe der ein oder andere kann mir weiterhelfen ...

ich habe einen Server der via NFS-Mount 2 Verzeichnisse von anderen Servern gemountet hat

/srv/www/htdocs - geht auf Server1
/srv/www/htdocs2 - geht auf Server2

soweit alles ok.
Diese beiden Pfadangaben sind natürlich auch in sämtlichen Apache Konfigurationsdateien eingetragen.
Wenn jetzt z.B. Server1 mal neu gestartet werden soll, wurde bisher immer per Hand das Docroot auf htdocs2 geändert und der Apache anschließend neu geladen;
mittlerweile sind die vhost-Dateien aber so groß geworden, dass man doch mal den ein oder anderen Eintrag übersieht.

Nun mein Anliegen:
ich bräuchte ein Script, welches automatisch in allen Dateien in einem Verzeichnis den Begriff "/srv/www/htdocs" in "/srv/www/htdocs2" ändert, und anschließend den Apache neu lädt ...
meine ersten Versuche habe ich mit "sed" gemacht, aber so richtig funktioniert das alles nicht ...

Hat vielleicht der ein oder andere nen Tip für mich?
Danke im voraus.
VG

marce
26.02.18, 09:59
meine ersten Versuche habe ich mit "sed" gemacht, aber so richtig funktioniert das alles nicht ...
sed ist das "passende" Mittel.

"Es funktioniert nicht" war aber sicherlich nicht die Fehlermeldung oder das Ergebnis, das Du bekommen hast.

... und nur "sed" war sicherlich nicht das, was Du exakt versucht hast...


Alternativ nicht direkt das htdocs per NFS einbinden sondern dies via einem Symlink auf den NFS-Server setzen - dann kannst Du problemlos durch ändern des Symlinks den NFS-Server wechseln ohne an der Apache-Konfig herumbasteln zu müssen.

fork
26.02.18, 10:02
find /etc/apache2/sites-enabled -type f -exec sed -r -i -e 's#/var/www/htdocs#/var/www/htdocs2#' '{}' +

Wenn Du das zweimal machst, ist Deine VHost-Konfig kaputt.

Habe ein Backup bevor Du das ausführst!

marce
26.02.18, 10:03
Zusätzliche Alternative: NFS-Server via HeartBeat und Floating-IP HA aufsetzen.

crackerjack
26.02.18, 10:12
find /etc/apache2/sites-enabled -type f -exec sed -r -i -e 's#/var/www/htdocs#/var/www/htdocs2#' '{}' +

Wenn Du das zweimal machst, ist Deine VHost-Konfig kaputt.

Habe ein Backup bevor Du das ausführst!

... genau ...
meine Tests waren mit diesen Aufrufen:
sed -i 's/htdocs/htdocs/g' *.conf

wenn ich das allerdings zweimal ausführe habe ich auf einmal ein "htdocs22" ... auch nicht Sinn der Sache bzw. Apache-Konfig kaputt ;-)

und es müßte ja auch später wieder zurückgeändert werden wenn der Server1 nach dem Neustart wieder da ist ...
das machts nicht einfacher

DrunkenFreak
26.02.18, 10:30
Ich würde einfach einen Link von /srv/www/htdocs2 auf htdocs setzen. Dann brauchst du nicht in irgendwelchen Dateien rumfriemeln. Die elegante und leider auch aufwändigere Lösung steht allerdings in #4.

nopes
26.02.18, 10:42
So ziemlich genau dafür wurde einst mod_macro (https://httpd.apache.org/docs/2.4/mod/mod_macro.html) geschrieben.

fork
26.02.18, 11:08
Ja. Das mit dem sed ist hier nicht gut.

Das mit dem Symlink ist besser. Ein kleiner Automatismus geht z. B. so: (per cron jede Minute ausführen)



#!/bin/bash

# symlink von /srv/www/htdocs nach /srv/www/htdocs_server1 oder /srv/www/htdocs_server2

NORMALER_SERVER=server1
BACKUP_SERVER=server2

AKTUELLER_SERVER=$(readlink /srv/www/htdocs)
AKTUELLER_SERVER="${AKTUELLER_SERVER: -7}" # Leerzeichen zwischen : und - !!!

# Nicht erreichbare NFS-Shares blockieren gerne, deswegen mit timeout
#
# prüfen ob der Server1-mount nicht erreichbar ist und ob Server2-mount erreichbar ist ...
if !timeout 10 [ -f /var/www/htdocs_$NORMALER_SERVER/index.php ] &&
timeout 10 [ -f /var/www/htdocs_$BACKUP_SERVER/index.php; then
# wenn ja, link löschen und neu setzen.
rm -f /var/www/htdocs
ln -sf /var/www/htdocs_$BACKUP_SERVER /var/www/htdocs
fi


Da fehlt jetzt noch ein bisschen was. Z. B. das er den Link nur setzt, wenn er nicht schon gesetzt ist und dass der Link wieder zurück gesetzt wird, wenn der Hauptserver wieder da ist. Das überlasse ich mal Dir.

marce
26.02.18, 11:24
... oder man denkt komplett um und überlegt, ob "ext. Filesystem via NFS" nicht durch "Proxy-Request auf anderen Server" ersetzt wird.

crackerjack
26.02.18, 12:00
Ja. Das mit dem sed ist hier nicht gut.

Das mit dem Symlink ist besser. Ein kleiner Automatismus geht z. B. so: (per cron jede Minute ausführen)



#!/bin/bash

# symlink von /srv/www/htdocs nach /srv/www/htdocs_server1 oder /srv/www/htdocs_server2

NORMALER_SERVER=server1
BACKUP_SERVER=server2

AKTUELLER_SERVER=$(readlink /srv/www/htdocs)
AKTUELLER_SERVER="${AKTUELLER_SERVER: -7}" # Leerzeichen zwischen : und - !!!

# Nicht erreichbare NFS-Shares blockieren gerne, deswegen mit timeout
#
# prüfen ob der Server1-mount nicht erreichbar ist und ob Server2-mount erreichbar ist ...
if !timeout 10 [ -f /var/www/htdocs_$NORMALER_SERVER/index.php ] &&
timeout 10 [ -f /var/www/htdocs_$BACKUP_SERVER/index.php; then
# wenn ja, link löschen und neu setzen.
rm -f /var/www/htdocs
ln -sf /var/www/htdocs_$BACKUP_SERVER /var/www/htdocs
fi


Da fehlt jetzt noch ein bisschen was. Z. B. das er den Link nur setzt, wenn er nicht schon gesetzt ist und dass der Link wieder zurück gesetzt wird, wenn der Hauptserver wieder da ist. Das überlasse ich mal Dir.


.. also bei mir scheitert es momentan noch (schon) beim erstellen des Symlinks ... gibt es da etwas spezielles zu beachten?
seh momentan den Wald vor lauter Bäumen nicht ...

marce
26.02.18, 12:04
... und auch hier wieder die Frage: Was hast Du genau gemacht und was war die Fehlermeldung?

Immer dran denken: Vor Deinem PC sitzt nur Du - wir müssen mit dem leben, was Du lieferst.

crackerjack
26.02.18, 12:31
... und auch hier wieder die Frage: Was hast Du genau gemacht und was war die Fehlermeldung?

Immer dran denken: Vor Deinem PC sitzt nur Du - wir müssen mit dem leben, was Du lieferst.

also ich habe nen "ln -s \server1:\export /srv/www/htdocs3" ( htdocs3 zum testen ) in mehreren Variationen ( \\server1:\export, //server1:\Export, usw ) ausgeführt, mit dem Ergebnis das er da keine Dateien findet;

marce
26.02.18, 13:09
na, das kann ja nicht funktionieren.

mounte Server1 nach /mnt/nfs_server1
mounte Server2 nach /mnt/nfs_server2

... und dann ln -s /mnt/nfs_server1 /srv/www/htdocs1

... sollte in /srv/www/ der Symlink auch mehrfach auftreten macht es ggf. Sinn noch einen Zwischenpunkt einzuführen - also /srv/www/[abcd] -> /mnt/nfs_link -> /mnt/nfs_server1 - dann musst Du nur den mittleren Link umhängen und alles wird gut.

marce
26.02.18, 13:50
So ziemlich genau dafür wurde einst mod_macro (https://httpd.apache.org/docs/2.4/mod/mod_macro.html) geschrieben.
Oder "trivial" https://httpd.apache.org/docs/2.4/env.html - hab's noch nie ausprobiert, aber damit kann man wohl auch einfache Unix-System-Umgebungsvariablen verwenden - und sich z.B. einen APACHEDOCROOTBASEPATH=/mnt/nfs_server_1/ defnieren und verwenden.
(da sollte man aber den anderen Usern auf dem System mehr als gut vertrauen - oder halt sich seine Start-/Stop-Scripte sauber anschauen und anpassen)

Bedingt für Änderungen halt immer noch einen Apache-Restart während der "Link-Umhänge-Trick" da ohne solchen auskommt.

crackerjack
26.02.18, 14:09
also das mounten und Symlink erstellen hat jetzt soweit geklappt, allerdings bekomme ich nen "Access denied" wenn ich den Content aufrufe ...

muss man beim Apache noch irgendetwas beachten wenn das Docroot auf einen symb. Link zeigt der via NFS gemountet ist ??

marce
26.02.18, 14:51
das kommt auf die Ursache des "Access denied" an - von "AllowOverrides", Dateirechten bis zu "Requires" kann da vieles rein spielen.

-> Blick in's Logfile.

Huhn Hur Tu
27.02.18, 11:28
Grundsaetzlich ist ein HA Konstrukt selberbauen eine schlechte Idee, aber wenn, dann bitte mit weniger komplextitaet.
Eine Idee hierzu ist den HTDOC Pfad per env Variable Sourcen, also

Source this
- export HTDOC_PATH="/pfad/zum/htoc"

Use this in configs
- document_root = HTDOC_PATH

auf diese weise aenderst du den Pfad ohne in Dateien rumzupfuschen, was dir frueher oder spaeter um die Ohren fliegt.

marce
27.02.18, 12:21
Du meinst wohl eher "keine schlechte Idee", oder?

Huhn Hur Tu
28.02.18, 08:00
Alles selberbasteln ist zwar ganz nett um zu lernen, aber sicher nicht um produktive Systeme zu verwalten. Solange es einfache fertige Software gibt sollte man diese verwenden und es ist meist eine "schlechte" Idee selber zu fummeln, denn es wird einer nach Dir kommen und Dir Pest und Cholera an den Hals wuenschen wenn man sich erst in Bash Kunstwerke eingearbeitet werden muss.

- Einfach ist gut
- Standardisiert ist besser


Leider ist es so, und da schliesse ich mich nicht aus, dass man mit Bash ganz nette Dinge machen kann, diese irgendwann aber ausufern und unwartbar werden, denn sonst wird auf HA ein "hahaha lol"

marce
28.02.18, 08:20
Naja, mit der "einfache fertige Software" sieht's im Bereich "NFS HA" halt irgendwie eher mau aus.

(solange man nicht gleiche seine komplette Infrastruktur ggf. auch im Bereich der drunterliegenden Hardware umbauen will)

SPOFs sind halt immer doof.

nakata
01.03.18, 00:51
Hi,

direkt in dateien ändern geht eigentlich gemütlich mit einer fixen mischung aus bash und perl:
find <path> | xargs perl -p -i -e ‘s/oldstring/newstring/g’

Apache hat per default die no follow symlinks directive gesetzt. von daher sollte an dieser stelle erstmal permission denied geworfen werden, wenn das nicht geändert wurde.
Davon aber stellt sich die Frage warum man nicht einfach ceph statt nfs verwendet. Lässt sich im Zweifel auch gemütlich via ansible oder puppet steuern.