Hinweis:
- Dieses Tutorial erfordert Zugriff auf Oracle Cloud. Informationen zur Registrierung für einen kostenlosen Account finden Sie unter Erste Schritte mit Oracle Cloud Infrastructure Free Tier.
- Es verwendet Beispielwerte für Oracle Cloud Infrastructure-Zugangsdaten, -Mandanten und -Compartments. Ersetzen Sie diese Werte nach Abschluss der Übung durch Werte, die für Ihre Cloud-Umgebung spezifisch sind.
Automatisieren Sie das Patching für Apache Tomcat oder eine Technologie von Drittanbietern mit OCI Fleet Application Management
Einführung
Mit dem Oracle Cloud Infrastructure (OCI) Fleet Application Management-Service können IT-Teams Software-Discovery und Patchvorgänge für jede in OCI bereitgestellte Software automatisieren. Der Service bietet vordefinierte Runbooks für das Erkennen und Patchen von Oracle-Technologien, einschließlich Oracle WebLogic Server, Oracle Linux und mehr. Außerdem können Sie mit den benutzerdefinierten Runbooks und den Funktionen Bring Your Own Product definieren, dass Ihr Produkt oder Ihre Technologien automatisch vom Service erkannt und gepatcht werden.
In diesem Tutorial verwenden wir Apache Tomcat als Beispiel für eine beliebte Drittanbietertechnologie, die Sie möglicherweise häufig patchen müssen. Die folgenden Abschnitte enthalten Schritt-für-Schritt-Anweisungen und wiederverwendbare Codebeispiele, die Sie beim Hinzufügen von Apache Tomcat zur automatischen Erkennung und Einspielen von Patches mit OCI Fleet Application Management unterstützen. Sie können denselben Prozess für jedes Drittanbieterprodukt verwenden, das Sie mit dem Service patchen möchten.
Hinweis: Wir beschreiben den Prozess mit der OCI-Konsole. Sie können jedoch auch die Oracle Cloud Infrastructure-Befehlszeilenschnittstelle (OCI-CLI) oder API verwenden. Informationen zum OCI Fleet Application Management finden Sie unter Flottenanwendungsmanagement.
Erste Schritte mit dem Patching von Apache Tomcat
Die Funktion Bring Your Own Product erleichtert die Integration neuer Produkte in OCI Fleet Application Management, wie Software, Technologien oder Anwendungskomponenten von Drittanbietern. Diese Funktion ermöglicht die Zentralisierung der Patchcompliance und anderer Lebenszyklusvorgänge über diese verschiedenen Komponenten hinweg mit dem Service.
Mit der Funktion Bring Your Own Product erstellen Sie zuerst Ihr benutzerdefiniertes Produkt im Service zusammen mit der Compliance-Policy und den verfügbaren Patches. Als Nächstes erstellen Sie mit benutzerdefinierten Runbooks sowohl die Discovery- als auch die Patching-Runbooks, sodass Sie die Complianceverwaltung in Zukunft automatisieren können.
Ziele
- Automatisieren Sie das Patching für Apache Tomcat oder eine Technologie von Drittanbietern mit OCI Fleet Application Management.
Aufgabe 1: Produkt erstellen
-
Melden Sie sich bei der OCI-Konsole an, navigieren Sie zu Beobachtbarkeit und Management, und wählen Sie Flottenanwendungsmanagement aus.
-
Klicken Sie auf Administration.
-
Klicken Sie unter Metadatenverwaltung auf Produkte und Produkt erstellen.
-
Geben Sie die folgenden Informationen für das neue Produkt ein.
- Produktname: Geben Sie den Produktnamen ein, und vermeiden Sie vertrauliche Informationen wie Schlüssel usw.
- Version(en): Geben Sie die Version ein.
- Patchtypen (Optional): Wählen Sie den Patchtyp aus.
- Kompatible Produkte (Optional): Fügen Sie kompatible Produkte hinzu.
- Komponenten (Optional): Wählen Sie Komponenten aus.
- Zugangsdatennamen (Optional): Wählen Sie den Zugangsdatennamen aus.
Aufgabe 2: Regel für Patchcompliance-Policys definieren
Für jedes neue Produkt wird automatisch eine Compliance-Policy für Softwarepatches erstellt. Die Standard-Policy enthält keine Policy-Regeln. Sie können die Policy bearbeiten, um Regeln hinzuzufügen und die Bedingung anzugeben, die ausgewertet werden soll, wenn ein bestimmtes Ziel konform (wenn wahr) oder nicht konform (else) ist. Mit verschiedenen Produktattributen können Sie die Regeln definieren, z.B. Produktversion, Patch-Typ, Patch-Dringlichkeit, Patch-Auswahlkriterien und Verlängerungsfrist. Der Patchcompliancestatus wird als Unbestimmt gemeldet, wenn Sie keine Policy-Regeln erstellen.
-
Gehen Sie zur OCI-Konsole, navigieren Sie zu Administration, und klicken Sie auf Compliance-Policy.
-
Wählen Sie die Compliance-Policy des Produkts aus, das Sie ändern müssen. (Syntax: Product name Compliance Policy).
-
Klicken Sie auf Policy-Regel erstellen.
-
Geben Sie die Produktversion und andere Attribute ein, die in der Bedingung verwendet werden sollen.
Die Policy-Regeln können beispielsweise die folgende Definition aufweisen:
- Regelname: Geben Sie
Apache Tomcat
ein. - Produktversion: Wählen Sie 10.1 und höher aus.
- Patchtyp: Wählen Sie Kritischer Patch aus.
- Schweregrad: Wählen Sie CriticalPatch aus.
- Patchauswahl: Wählen Sie Patchebene aus.
- Regelname: Geben Sie
Aufgabe 3: Patchmetadaten erstellen und Patch hochladen
Erstellen Sie die Patchmetadaten, um zukünftiges Patching für das hinzugefügte Produkt zu vereinfachen. Anschließend sollten Sie die verfügbaren Patches in OCI Object Storage hochladen. Je nach Technologie und den verfügbaren Patches für Ihr neues Produkt können Sie einen generischen Patch oder bestimmte Packages für verschiedene Betriebssystemkonfigurationen hochladen.
-
Navigieren Sie zur OCI-Konsole, navigieren Sie zu Flottenanwendungsmanagement, und klicken Sie auf Lifecycle Management, Patches.
-
Klicken Sie auf Patch hochladen.
-
Geben Sie folgende Informationen ein.
- Patchname: Geben Sie einen Namen ein.
- Produkt: Wählen Sie ein Produkt aus.
- Schweregrad: Wählen Sie einen Schweregrad aus.
- Wählen Sie Abhängige Patches aus, um die abhängigen Patches anzugeben, die zusammen mit dem aktuellen Patch gepatcht werden sollen. Beispiel: Bei Apache Tomcat kann der folgende Patch als
apache-tomcat-10.1.25.tar.gz
von hier heruntergeladen werden: Central Repository: org/apache/tomcat/tomcat/10.1.25.
Aufgabe 4: Discovery-Runbook für ein Produkt erstellen
Der Service verwendet ein Discovery Runbook, um die Software und Version des hinzugefügten Produkts zu identifizieren. Beispiel: Im Fall von Apache Tomcat kann das Runbook-Skript in Python zum Erkennen und Sammeln von Details zu Apache Tomcat-Instanzen auf einem System wie folgt aussehen:
Aufgaben im Discovery Runbook-Skript
Das Skript führt folgende Schritte aus:
- Scannt das Dateisystem nach Apache Tomcat-Instanzen.
- Methode (
_get_all_tomcats()
): Sucht Apache Tomcat-Instanzen.- Mit dem Befehl find wird das Dateisystem nach Verzeichnissen mit dem Namen webapps durchsucht, was für Apache Tomcat-Installationen charakteristisch ist.
- Entfernt das Suffix
/webapps
, um die Root des Apache Tomcat-Pfads abzurufen. - Filtert Pfade heraus, die Backup enthalten, um redundante oder irrelevante Ergebnisse zu vermeiden.
- Ausgabe: Gibt eine Liste der Apache Tomcat-Installationspfade zurück.
- Extrahiert Versionsdetails und Metadaten für jede Instanz.
- Erstellt ein detailliertes Instanz-Dictionary für eine Apache Tomcat-Instanz.
- Ermittelt und aggregiert alle Apache Tomcat-Instanzen.
- Erfasst Informationen zur zugehörigen Java-Umgebung.
- Gibt alle Daten im JSON-Format zurück, die Sie für Berichte oder die weitere Verarbeitung verwenden können.
- Verarbeitet Fehler.
Aufschlüsselung wichtiger Aufgaben
-
Suchen Sie Apache Tomcat-Instanzen.
-
Apache Tomcat-Versionsdetails extrahieren.
- Methode (
_get_details(path)
):- Führt das Skript
version.sh
im Bin-Verzeichnis jedes Apache Tomcat-Pfads aus. - Parst die Ausgabe, um Schlüsseldetails (z.B. Versionsnummer) in ein Dictionary zu extrahieren.
- Behandelt Fehler: Alle Ausnahmen während der Ausführung oder des Parsingvorgangs werden stillschweigend ignoriert.
- Führt das Skript
- Ausgabe: Gibt ein Dictionary mit Apache Tomcat-Metadaten zurück (z.B. Servernummer).
- Methode (
-
Zeitstempel für Dateiänderung abrufen.
- Methode
_get_timestamp(file_path)
:- Prüft, ob eine bestimmte Datei vorhanden ist, und ruft die letzte Änderungszeit ab.
- Formatiert den Zeitstempel im Format
dd-MMM-yyyy
HH:mm:ss
.
- Ausgabe: Gibt den formatierten Zeitstempel zurück.
- Methode
-
Java-Umgebungsdetails erfassen
- Methode
_get_java_details()
:- verwendet Systembefehle zum Abrufen der Java-Version und des Java Home-Pfads.
- Java-Version: Wird mit
java -version
abgerufen. - Java Home-Pfad: Aus den Java-Laufzeiteigenschaften extrahiert.
- Java-Version: Wird mit
- verwendet Systembefehle zum Abrufen der Java-Version und des Java Home-Pfads.
- Ausgabe: Gibt ein Dictionary mit
java_version
undjava_home
zurück.
- Methode
-
Erstellen Sie ein detailliertes Instanz-Dictionary.
- Methode
_instance(path)
:- Erstellt ein Dictionary, das eine einzelne Apache Tomcat-Instanz darstellt.
- Produktdetails: Name, Version, Zielpfad usw.
- Installierte Patches: Enthält die Version und das Datum der letzten Änderung des Verzeichnisses.
- Java-Eigenschaften: Umfasst
java_version
undjava_home
.
- Erstellt ein Dictionary, das eine einzelne Apache Tomcat-Instanz darstellt.
- Ausgabe: Gibt ein strukturiertes Dictionary für die Apache Tomcat-Instanz zurück.
- Methode
-
Ermitteln und aggregieren Sie alle Instanzen.
- Methode
_discovery_tomcat()
:- Ruft
_get_all_tomcats()
auf, um Apache Tomcat-Pfade zu suchen. - Iteriert über jeden Pfad und ruft
_instance(path)
auf, um Details zu erfassen. - Aggregiert alle Instanzen in einer Zielliste.
- Ruft
- Ausgabe: Gibt ein Dictionary mit allen erkannten Zielen zurück.
- Methode
-
Ausgabe generieren.
- Schreibt die ermittelten Apache Tomcat-Details in eine JSON-Datei.
- Speicherort:
/opt/fams/.scripts/tomcat_discovery.json
. - Format: Pretty-printed JSON.
- Speicherort:
- Druckt außerdem das JSON-Objekt zur sofortigen Sichtbarkeit auf der Konsole.
- Schreibt die ermittelten Apache Tomcat-Details in eine JSON-Datei.
Skriptablauf
-
Apache Tomcat-Instanzen suchen: Die Methode
_get_all_tomcats()
scannt das Dateisystem. -
Details für jede Instanz abrufen: Die Methoden
_get_details()
und_instance()
extrahieren relevante Metadaten. -
Java-Details erfassen: Die Methode
_get_java_details()
ruft die Java-Umgebungseigenschaften ab. -
Daten aggregieren: Die Methode
_discovery_tomcat()
kombiniert die Informationen für alle Instanzen. -
Ausgabe generieren: Die Ergebnisse werden im JSON-Format gespeichert und gedruckt.
Beispielausgabe:
{ "targets": [ { "product": "Tomcat", "version": "9.0", "target\_name": "/usr/local/tomcat", "resource\_name": "", "components": [], "available\_patches": [], "installed\_patches": [ { "patch\_name": "9.0.50", "patch\_applied\_dt": "19-Nov-2024 12:45:30", "patch\_description": "", "patch\_type": "", "severity": "" } ], "properties": [ { "property\_name": "java\_home", "property\_value": "/usr/lib/jvm/java-11-openjdk" }, { "property\_name": "java\_version", "property\_value": "11" } ] } ] }
-
Fehlerhandling:
- Silent-Fehler bei den meisten Ausnahmen (z. B. fehlende Dateien, Befehlsfehler).
- Dieser Ansatz verhindert, dass das Skript vorzeitig beendet wird, kann jedoch Fehler während der Ausführung verdecken.
Beispiel: Apache Tomcat Discovery-Skript in Python
import json
import os
import subprocess
import datetime
class TOMCAT:
def \_get\_all\_tomcats(self):
command = ['find', '/', '-type', 'd', '-name', 'webapps']
sp = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
tomcat\_paths = sp.stdout.decode("utf-8").strip().replace('/webapps', '').split('\n')
tomcat\_paths=[path for path in tomcat\_paths if not 'backup' in path]
return tomcat\_paths
def \_get\_details(self, path):
tomcat\_details = dict()
try:
command = f'{path}/bin/version.sh'
sp = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = sp.communicate(timeout=10)
info\_list = stdout.decode("utf-8")
for line in info\_list.splitlines():
if ':' in line:
key, value = line.split(':', 1)
tomcat\_details[key.strip()] = value.strip()
return tomcat\_details
except Exception as E:
pass
def \_get\_timestamp(self, file\_path):
if os.path.exists(file\_path):
timestamp = os.path.getmtime(file\_path)
modified\_date = datetime.datetime.fromtimestamp(timestamp).strftime("%d-%b-%Y %H:%M:%S %z")
return modified\_date
def \_get\_java\_details(self):
try:
java\_details = dict()
command = "java -version 2>&1 | head -n 1"
sp = subprocess.run(command, shell=True, stdout=subprocess.PIPE)
java\_version = sp.stdout.decode("utf-8").split('"')[1]
# Getting Java Home
command = "java -XshowSettings:properties -version 2>&1 | sed '/^[[:space:]]\*java\.home/!d;s/^[[:space:]]\*java\.home[[:space:]]\*=[[:space:]]\*//'"
sp = subprocess.run(command, shell=True, stdout=subprocess.PIPE)
java\_home = sp.stdout.decode("utf-8").replace("\n", '')
java\_details['java\_home'] = java\_home
java\_details['java\_version'] = java\_version.split('\_')[0]
return java\_details
except Exception as E:
pass
def \_instance(self, path):
properties = []
tomcat\_details = self.\_get\_details(path)
instance = {"product": "Tomcat"}
instance.update({"version": '.'.join(tomcat\_details['Server number'].split('.')[:2])})
instance.update({"target\_name": path})
instance.update({"resource\_name": ""})
instance.update({"components": []})
instance.update({"available\_patches": []})
installed\_patches = [
{
"patch\_name": tomcat\_details['Server number'],
"patch\_applied\_dt": self.\_get\_timestamp(path),
"patch\_description": "",
"patch\_type": "",
"severity": ""
}
]
instance.update({"installed\_patches": installed\_patches})
for key, value in self.\_get\_java\_details().items():
properties.append({"property\_name": key, "property\_value": value})
instance.update({"properties": properties})
return instance
def \_discovery\_tomcat(self):
targets = []
tomcat\_paths = self.\_get\_all\_tomcats()
for path in tomcat\_paths:
instances = targets.append(self.\_instance(path))
discovery\_output = ({"targets": targets})
return discovery\_output
if \_\_name\_\_ == "\_\_main\_\_":
SCRIPTS\_DIR = "/opt/fams/.scripts"
os.makedirs(SCRIPTS\_DIR, exist\_ok=True)
tomcat = TOMCAT()
tomcat\_output = tomcat.\_discovery\_tomcat()
json\_obj = json.dumps(tomcat\_output, indent=4)
print(json\_obj)
with open("{}/tomcat\_discovery.json".format(SCRIPTS\_DIR), 'wb') as outfile:
outfile.write(json\_obj.encode())
Nachdem alle Fehler behoben wurden, werden die Produkte mit einer Flotte oder mehreren Flotten verknüpft, um Discovery und Betrieb zu automatisieren. Sobald ein Produkt auf der Liste der zulässigen Benutzer für eine Flotte steht, findet und aktualisiert sein Standard-Discovery Runbook automatisch den Softwarebestand mit Zielen des bereitgestellten Produkts über alle verwalteten Ressourcen hinweg.
So erstellen Sie ein Runbook:
-
Gehen Sie zur OCI-Konsole, navigieren Sie zu Flottenanwendungsmanagement, und klicken Sie auf Aktionen und Steuerelemente.
-
Klicken Sie auf Runbooks und Runbook erstellen.
-
Geben Sie Name, Beschreibung, Lebenszyklusvorgang, Runbook-Typ ein, und wählen Sie Betriebssystemtyp und Geschätzte Abschlusszeit aus.
-
Erstellen Sie Ihr Runbook mit dem visuellen Designer, laden Sie eine YAML- oder JSON-Datei hoch, oder referenzieren Sie Ihr vorhandenes Automatisierungsskript über Bash- oder Python-Skriptaufgaben im Runbook. Beispiel: Das bereitgestellte Beispiel ist ein Runbook zur Erkennung von Apache Tomcat.
-
Wählen Sie für Runbooks mit Typ-Discovery die Option Als Discovery-Ausgabeaufgabe markieren aus, damit der Service die Ausgabe der Aufgabe lesen und parsen kann, um den Softwarebestand aufzufüllen.
Hinweis: Der Service kann die Ausgabe nur dann parsen, wenn das Format der Ausgabe auf der Discovery-Ausgabevorlage basiert.
Im Folgenden finden Sie die JSON-Ausgabe (
runbook\_Apache Tomcat\_discovery.json
) für das Produkt.{ "id": "ocid1.famsrunbook.oc1.eu-frankfurt-1.xxxxxxxx", "displayName": "Apache Tomcat\_discovery", "description": null, "type": "USER\_DEFINED", "runbookRelevance": "PRODUCT", "operation": "DISCOVERY", "osType": "LINUX", "platform": "Apache Tomcat", "isDefault": false, "estimatedTime": "1", "lifecycleState": "INACTIVE", "lifecycleDetails": "{\"subState\":\"DRAFT\",\"message\":\"Draft runbook\"}", "timeCreated": "2024-11-19T13:03:20.376Z", "timeUpdated": "2024-11-19T13:03:20.376Z", "associations": { "tasks": [ { "stepName": "Apache\_Tomcat\_discovery\_task", "associationType": "TASK", "taskRecordDetails": { "scope": "LOCAL", "executionDetails": { "executionType": "SCRIPT", "variables": null, "content": { "sourceType": "OBJECT\_STORAGE\_BUCKET", "namespaceName": "xxxxxx", "namespaceName": "xxxxxx", "bucketName": "demo\_bucket", "objectName": "apache\_tomcat\_discovery\_demo.zip", "checksum": "xxxxxxxxxxxxx" }, "command": "unzip -o -q apache\_tomcat\_discovery\_demo.zip; chmod +x apache\_tomcat\_discovery.py ; python apache\_tomcat\_discovery.py", "credentials": [] }, "description": null, "platform": "Apache Tomcat", "isCopyToLibraryEnabled": false, "osType": "LINUX", "properties": { "numRetries": 0, "timeoutInSeconds": 3000 }, "isDiscoveryOutputTask": true, "isApplySubjectTask": false, "name": "Apache Tomcat\_discovery\_task" }, "stepProperties": { "runOn": null, "condition": null, "actionOnFailure": "ABORT", "pauseDetails": null, "notificationPreferences": null }, "outputVariableMappings": [] } ], "groups": [ { "type": "PARALLEL\_RESOURCE\_GROUP", "name": "Parallel\_resource\_container", "properties": { "runOn": null, "condition": null, "actionOnFailure": "ABORT", "pauseDetails": null, "notificationPreferences": null } } ], "executionWorkflowDetails": { "workflow": [ { "groupName": "Parallel\_resource\_container", "type": "PARALLEL\_RESOURCE\_GROUP", "steps": [ { "type": "TASK", "stepName": "Apache\_Tomcat\_discovery\_task" } ] } ] }, "rollbackWorkflowDetails": null, "version": "1.0" }, "compartmentId": "xxxxxx", "region": "xxxxxxx", "freeformTags": {}, "definedTags": { "Oracle-Tags": { "CreatedBy": "xxxxxx", "CreatedOn": "2024-11-08T15:48:59.329Z" } }, "systemTags": {} }
-
Fügen Sie weitere Aufgaben hinzu, um Ihr Runbook nach Bedarf anzupassen.
Aufgabe 5: Runbook zum Einspielen eines Patches erstellen
In Aufgabe 4 wird beschrieben, wie Sie ein benutzerdefiniertes Runbook mit Ihrer Patching-Sequenz erstellen.
Nachdem Sie ein Produkt mit den verfügbaren Patches und der standardmäßigen Erkennungslogik erstellt haben, können Sie jetzt ein Runbook für das Patching erstellen, das die für diese Technologie spezifische Automatisierungssequenz und den IT-Prozess Ihres Unternehmens enthält. Anschließend definieren Sie einen Wartungsplan, um zu definieren, wann das Runbook ausgelöst wird, um nicht konforme Ziele zu patchen, die in Ihrer Flotte identifiziert werden.
Das Bash-Skript (apache_tomcat_patching.sh
), mit dem das Upgrade einer Apache Tomcat-Installation automatisiert wird, lautet wie folgt. Außerdem finden Sie die Aufgaben, die dem Skript zugeordnet sind.
-
Variablen initialisieren
target_path
: Dieser Export aus einertarget.json
-Datei im VerzeichnisDATA_DIR
mitjq
.patches_file
: Mit dieser Variable kann die neuestepatches.json
-Datei im System dynamisch identifiziert werden.patch_url
: Gibt das Verzeichnis für Patches an (/opt/fams/wls_patch
).
-
Patchdetails anzeigen und parsen: Lesen Sie den Inhalt der Datei
patches.json
für Folgendes:- Um die erforderliche Patchversion zu extrahieren (
required_version
). - Bestimmt den Dateinamen des Patches (
file_name
).
- Um die erforderliche Patchversion zu extrahieren (
-
Erforderliche Dateien prüfen
apache_tomcat_functions.sh
:- Stellen Sie sicher, dass ein Helper-Skript vorhanden ist (
apache_tomcat_functions.sh
). - Wenn die Datei fehlt, wird das Skript mit einem Fehler beendet.
- Stellen Sie sicher, dass ein Helper-Skript vorhanden ist (
- Zielpfadvalidierung:
- Stellen Sie sicher, dass das Verzeichnis
target_path
vorhanden ist. - Wenn es nicht vorhanden ist, wird das Skript mit einem Fehler beendet.
- Stellen Sie sicher, dass das Verzeichnis
-
Aktuelle Version prüfen: Führen Sie das Skript
version.sh
von Apache Tomcat aus, um die aktuell installierte Version abzurufen (curr_version
). -
Upgrade vorbereiten
- Vorhandene Installation sichern: Rufen Sie
create_backup
auf, um die vorhandene Apache Tomcat-Installation zu sichern. - Tomcat stoppen: Stoppen Sie Apache Tomcat mit einer Funktion (
stop_tomcat
).
- Vorhandene Installation sichern: Rufen Sie
-
Apache Tomcat-Installation aktualisieren
- Neue Version extrahieren: Extrahieren Sie das neue Apache Tomcat-Package (
file_name
) in das Zielverzeichnis. - Konfigurationsdateien kopieren:
- Kopieren Sie kritische Dateien (z.B. Konfiguration, Logs) mit
copy_main_files
aus der alten Installation in eine neue. - Beheben Sie Fehler in diesem Schritt, indem Sie das Backup wiederherstellen.
- Kopieren Sie kritische Dateien (z.B. Konfiguration, Logs) mit
- Umbenennen und fertigstellen: Benennen Sie das neue Verzeichnis um, um das alte Installationsverzeichnis zu ersetzen.
- Neue Version extrahieren: Extrahieren Sie das neue Apache Tomcat-Package (
-
Validieren und neu starten
- Upgrade prüfen: Prüfen Sie die upgegradete Version, indem Sie
version.sh
erneut ausführen. - Apache Tomcat neu starten: Starten Sie Apache Tomcat mit
start_tomcat
.
- Upgrade prüfen: Prüfen Sie die upgegradete Version, indem Sie
-
Bearbeitungsfehler
- Geben Sie aussagekräftige Fehlermeldungen in verschiedenen Phasen an (Beispiel: fehlende Dateien, Verzeichnis nicht gefunden, Upgradefehler).
- Setzen Sie Änderungen zurück, wenn kritische Vorgänge nicht erfolgreich sind (z.B. Kopieren von Dateien oder Umbenennen von Verzeichnissen).
Folgende Hauptfunktionen werden verwendet:
stop_tomcat
: Stoppt den Tomcat-Service.create_backup
: Erstellt ein Backup des vorhandenen Tomcat-Verzeichnisses.copy_main_files
: Überträgt erforderliche Dateien von der alten Installation in die neue.start_tomcat
: Startet den aktualisierten Tomcat-Service.
Was bewirkt es?
Das Skript bietet einen strukturierten und automatisierten Ansatz für das Upgrade einer Apache Tomcat-Instanz, die Minimierung von Ausfallzeiten und die Gewährleistung eines Rollback-Mechanismus bei einem Ausfall. Sie basiert auf den vordefinierten Funktionen (apache_tomcat_functions.sh
), um Aufgaben wie das Stoppen oder Starten von Apache Tomcat und die Dateiverarbeitung zu verwalten.
Im Folgenden finden Sie das Bash-(apache\_tomcat\_patching.sh
-)Beispielskript mit den Methoden zum Einspielen von Patches.
\#
target\_path=$(cat ${DATA\_DIR}/target.json | jq -r '.target.target\_name')
patches\_file="$(find / -type f -name 'patches.json' | tail -1)"
patch\_url=/opt/fams/wls\_patch
\#
echo "Details of patches.json from path $patches\_file"
cat $patches\_file
required\_version=$(jq -r '.patches[0].name' $patches\_file)
file\_name=$(jq -r '.patches[0].location.object\_name' $patches\_file)
echo "Checking for tomcat\_functions.sh file "
if [ -f ./apache\_tomcat\_functions.sh ]; then
source ./apache\_tomcat\_functions.sh
echo -e "apache\_tomcat\_functions.sh file exists \n"
else
echo "apache\_tomcat\_functions.sh file does not exist..Exiting"
exit 1
fi
echo "Checking if Target Path $target\_path exists"
if [ ! -d "$target\_path" ]; then
echo "$target\_path doesnt exist.....Exiting"
exit 1
else
echo "$target\_path exists"
fi
script\_dir=/opt/fams/.scripts/
echo "Target Directory: " $target\_path
echo "Target Version Download location: " $patch\_url
echo "Target Patch: " $required\_version
\# directories where tomcat is installed
curr\_version=$(sh $target\_path/bin/version.sh | grep 'Server number:' | awk '{print $3}')
echo "\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*"
tomcat\_vars
if [ $curr\_version != "" ]; then
echo -e "Version $curr\_version is currently installed in Target Path $target\_path \n"
dir\_path=$(basename "$target\_path") #old tomcat directory
#file\_name=$(basename "$patch\_url") #zip filename for new version
#Stopping tomcat
stop\_tomcat $target\_path
#killing process
#kill\_tomcat
echo "\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*"
echo -e "Upgrading Tomcat $curr\_version to patch $required\_version.................\n"
# Backing old tomcat
cd $target\_path/..
create\_backup $dir\_path
# Downloading New Tomcat Version
# echo -e "Downloading Tomcat version $required\_version.......................\n"
# download\_required\_version $patch\_url
# echo "\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*"
# # Extracting tomcat directories
echo -e "Extracting Tomcat version from $file\_name file ......................."
tar -xf "$patch\_url/$file\_name"
echo -e " COMPLETED : Extracted successfully \n"
# Copying important files from old tomcat to new tomcat directories
tomcat\_dir=$(basename "$file\_name" .tar.gz) # new tomcat directory
echo -e "Copying important files from $dir\_path directory to $tomcat\_dir ......................."
copy\_main\_files $backup\_dir $tomcat\_dir
status=$?
if [ $status -eq 0 ]; then
# Renaming tomcat directory
echo -e "Renaming $tomcat\_dir directory to $dir\_path......................."
mv $tomcat\_dir $target\_path
else
echo -e "Process failed while Copying important files from $dir\_path directory to $tomcat\_dir.\n"
mv $backup\_dir $dir\_path
exit 1
fi
if [ $? -eq 0 ]; then
upgraded\_version=$(sh $target\_path/bin/version.sh | grep 'Server number:' | awk '{print $3}')
echo -e " COMPLETED : Renaming directory \n"
echo -e "Successfully upgraded tomcat to $upgraded\_version from $curr\_version \n"
# Starting tomcat
echo -e "Starting Tomcat......................."
start\_tomcat $target\_path
else
echo -e "Process failed while renaming $tomcat\_dir directory to $target\_path.\n"
exit 1
fi
else
echo -e "Required version is empty, Exiting \n"
exit 1
fi
#done
stop\_tomcat(){
tomcat\_dir=$1
echo "Stopping Tomcat Service"
sh $tomcat\_dir/bin/shutdown.sh
}
start\_tomcat(){
tomcat\_dir=$1
echo "Starting Tomcat Service"
sh $tomcat\_dir/bin/startup.sh
}
kill\_tomcat(){
myarray=( `ps aux | grep tomcat | awk '{print $2}'` )
for i in "${myarray[@]}"
do
echo "Killing Process $i"
kill -9 $i
done
}
tomcat\_vars(){
\# curr\_ver=$(jq --arg ident "$dir" -r '.targets[] | select(.target\_name == $ident) |.version' $script\_dir/tomcat\_discovery.json)
\# echo "Current Version: "$curr\_version
tomcat\_home=$(jq -r '.targets[].target\_name' $script\_dir/tomcat\_discovery.json)
echo "Tomcat Home: "$tomcat\_home
}
create\_backup(){
dir\_path=$1
\# curr\_version=$2
echo " Backing up directory: $dir\_path"
prefix=backup
backup\_dir="${dir\_path}\_${prefix}"
mkdir -p "$backup\_dir"
cp -r "$dir\_path"/\* "$backup\_dir"/
if [ "$?" -eq 0 ]; then
echo -e " COMPLETED : Backup directory $backup\_dir created \n"
rm -r "$dir\_path"
fi
}
download\_required\_version(){
download\_url=$1
wget -nc $download\_url
}
copy\_main\_files(){
old\_tomcat=$1
new\_tomcat=$2
cp -r ./$old\_tomcat/conf/\* ./$new\_tomcat/conf/
cp -r ./$old\_tomcat/webapps/\* ./$new\_tomcat/webapps/
if [ "$?" -eq 0 ]; then
echo -e " COMPLETED : Copying files into directory \n"
return 0 # Success
else
return 1 # Failure
fi
}
copy\_rollback\_files(){
old\_tomcat=$1
new\_tomcat=$2
cp -r $old\_tomcat/conf/\* /$new\_tomcat/conf/
cp -r $old\_tomcat/webapps/\* /$new\_tomcat/webapps/
echo -e " COMPLETED : Copying files into directory \n"
}
create\_rollback\_backup(){
curr\_tomcat=$1
rollback\_tomcat=$2
echo " Backing up directory: $dir\_path"
prefix=$curr\_version
backup\_dir="${curr\_tomcat}\_${prefix}"
mkdir -p "$backup\_dir"
cp -r "$dir\_path"/\* "$backup\_dir"/
echo -e " COMPLETED : Backup directory $backup\_dir created \n"
rm -r "$dir\_path"
}
Aufgabe 6: Flotte erstellen
Erstellen Sie eine Flotte, und bringen Sie Ihr Produkt auf die zugehörige Ausnahmeliste, um das Softwareinventar zu ermitteln, den Compliancestatus des Softwarepatches zu kennen und die Compliance des Softwarepatches zu beheben.
-
Gehen Sie zur OCI-Konsole, navigieren Sie zu Flottenanwendungsmanagement, Flotten, und klicken Sie auf Flotte erstellen.
-
Geben Sie den Namen und die Beschreibung für die Flotte ein, und fügen Sie Ressourcen hinzu.
-
Aktivieren Sie die automatische Bestätigung der Zielressourcen.
Aufgabe 7: Beheben der Softwarepatchcompliance
Klicken Sie auf Jetzt beheben, um die Softwarepatchcompliance für eine Flotte auf der Detailseite zu beheben, oder erstellen Sie auf der Seite Zeitpläne des Lebenszyklusmanagements einen Zeitplan.
Wenn Sie auf Jetzt beheben klicken, wird der Compliancejob in den nächsten 15 Minuten ausgeführt. Wenn Sie die Zeitplanoption auf der Seite Zeitpläne auswählen, können Sie einen Job für die Zukunft erstellen oder einen rekursiven Zeitplan festlegen. Geben Sie durch Definieren eines Wartungsplans an, wann das Runbook ausgelöst werden soll, um nicht konforme Ziele zu patchen, die in Ihrer Flotte identifiziert werden.
Danksagungen
- Autoren – Shabbir Hussain (Technisches Personal des Beratungsmitglieds), Fabio Bonisoli (Produktmanager für Fleet Application Management)
Weitere Lernressourcen
Sehen Sie sich andere Übungen zu docs.oracle.com/learn an, oder greifen Sie im Oracle Learning YouTube-Channel auf weitere kostenlose Lerninhalte zu. Besuchen Sie außerdem education.oracle.com/learning-explorer, um Oracle Learning Explorer zu werden.
Die Produktdokumentation finden Sie im Oracle Help Center.
Automate Patching for Apache Tomcat or a Third-Party Technology with OCI Fleet Application Management
G23641-01
December 2024