Patchen van ExaCS-clusters met OCI-CLI
09-09-2025Mark vertrelt: "In dit geval heb ik een interactief script gemaakt, zodat ik de hele patchcyclus in mijn terminal kan uitvoeren zonder via de console te hoeven klikken. Het laat me de omgeving kiezen, welke update ik wil prechecken/toepassen en geeft me de status van de patch.
Dit kan handig zijn als niet elke medewerker toegang heeft tot de OCI-console, maar wel het systeem moet patchen. Uw DBA of Service Desk Engineer kan dit bijvoorbeeld zonder tools doen. Voer gewoon het script uit! Laten we ons dus eens verdiepen in het script.
Ik ga me nu richten op het ophalen van de GRID/OS-patches voor één VM-cluster van de ExaCS-infrastructuur. Laten we beginnen met de vereisten.
Zorg ervoor dat u een Linux-machine hebt geïnstalleerd met oci-cli en jq. Raadpleeg deze documentatie voor het installeren en configureren van oci-cli.
In dit geval heb ik een ExaCS-infrastructuur met 4 verschillende clusters. Eén voor elke OTAP-omgeving (Ontwikkeling, Test, Acceptatie en Productie). Het doel is om alle omgevingen hetzelfde te houden.
Het script bouwen
Zorg ervoor dat u begint met het declareren van alle benodigde variabelen. In dit geval hebben we de OCID's voor alle ExaCS VM-clusters en de huidige datum in UTC nodig. Dat ziet er ongeveer zo uit:
# Make sure to enter your OCIDs
DV_OCID="ocid1.cloudvmcluster.oc1.eu-amsterdam-1.xxxxxx"
TS_OCID="ocid1.cloudvmcluster.oc1.eu-amsterdam-1.xxxxxx"
AC_OCID="ocid1.cloudvmcluster.oc1.eu-amsterdam-1.xxxxxx"
PR_OCID="ocid1.cloudvmcluster.oc1.eu-amsterdam-1.xxxxxx"
# Current date in UTC
TODAY=$(date -u +%F) # e.g. "2025-09-04"
We zullen deze variabelen later in het script gebruiken.
De volgende stap is het ophalen van alle beschikbare patches voor een cluster. Uiteraard willen we een gebruiksvriendelijke, geformatteerde uitvoer. Omdat oci-cli de uitvoer in JSON weergeeft, formatteren we deze naar een leesbare tabel. Hier is een voorbeeld:
# Fetch the patches for the Development cluster
PATCH_LIST=$(oci db cloud-vm-cluster list-updates \
--cloud-vm-cluster-id "$DV_OCID" \
--all \
--query "data[*].{id:id,description:description,version:version,release:\"time-released\",action:\"available-actions\"}" \
--output table)
# Let's show the output on screen
echo "$PATCH_LIST"
Wanneer u dit uitvoert, verschijnt er een tabel in uw terminal met de OCID van de patch, beschrijving, versie, releasetijd en beschikbare actie (ROLLING-APPLY/PRECHECK).
Het is nu belangrijk dat u de OCID van de specifieke patch die u wilt installeren opslaat, zodat we de precheck voor die patch kunnen starten. Hier leest u hoe u de precheck start.
oci db cloud-vm-cluster update \
--cloud-vm-cluster-id "$DV_OCID" \
--update-id "[SAVED PATCH OCID]" \
--update-action PRECHECK \
--force
We willen nu graag weten wanneer de precheck is voltooid. Zodra de precheck start, draaien we een script om de huidige status van de precheck op te vragen. Elke taak die wordt uitgevoerd, wordt al in de geschiedenis opgeslagen, maar met een specifieke levenscyclusstatus. De drie belangrijkste levenscyclusstatussen zijn MISLUKT, IN UITVOERING of GESLAAGD. Laten we eens kijken hoe dat eruitziet.
Het onderstaande script vraagt 60 minuten lang elke 60 seconden naar de status van die specifieke taak. Het blijft actief totdat de status 'IN UITVOERING' is. Het script is voltooid zodra de status MISLUKT of GESLAAGD is bereikt. Bij MISLUKT wordt het script afgesloten en bij GESLAAGD wordt de patch verder toegepast.
local max_attempts="${2:-60}" # Default: try for 60 minutes
local interval=60 # seconds between checks
local attempt=1
echo "Waiting for patch state to reach status SUCCEEDED..."
while (( attempt <= max_attempts )); do
vm_patch_status=$(oci db cloud-vm-cluster list-update-histories \
--cloud-vm-cluster-id "$DV_OCID" \
--output json | jq -r \
--arg today "$TODAY" \
'.data[] | select(."update-id" == "[SAVED_PATCH_ID]") | select(."update-action" == "PRECHECK") | select(."time-started" | startswith($today)) | ."lifecycle-state"' )
echo "Status is '$vm_patch_status'"
if [[ "$vm_patch_status" == "SUCCEEDED" ]]; then
echo "Precheck is succesfull!"
run_vm_apply # Function to start applying the patch
elif [[ "$vm_patch_status" == "FAILED" ]]; then
echo "Patch failed the precheck, please check the console for the error."
exit 0
fi
((attempt++))
sleep "$interval"
done
echo "Timeout reached. Resource did not reach SUCCEEDED state in $((max_attempts * interval / 60)) minutes."
exit 0
Ervan uitgaande dat de patch-precheck succesvol is, gaan we door met het toepassen van de patch. De opdracht lijkt op de opdracht PRECHECK. Laten we eens kijken.
oci db cloud-vm-cluster update \
--cloud-vm-cluster-id "$CLUSTER_OCID" \
--update-id "[SAVED PATCH OCID]" \
--update-action APPLY \
--force
Zodra de patch APPLY draait, kunt u dezelfde controlelus uitvoeren als hierboven vermeld. In plaats van de uitvoer te filteren op PRECHECK, filtert u op APPLY. De volledige opdracht ziet er zo uit. Ziet u het verschil?
apply_status() {
local max_attempts="${2:-60}" # Default: try for 60 minutes
local interval=60 # seconds between checks
local attempt=1
echo "Waiting for patch state to reach status SUCCEEDED..."
while (( attempt <= max_attempts )); do
vm_apply_status=$(oci db cloud-vm-cluster list-update-histories \
--cloud-vm-cluster-id "$DV_OCID" \
--output json | jq -r \
--arg today "$TODAY" \
'.data[] | select(."update-id" == "[SAVED_PATCH_ID]") | select(."update-action" == "APPLY") | select(."time-started" | startswith($today)) | ."lifecycle-state"' )
echo "Status is '$vm_apply_status'"
if [[ "$vm_apply_status" == "SUCCEEDED" ]]; then
echo "Patch has succesfully been applied!"
exit 0
elif [[ "$vm_apply_status" == "FAILED" ]]; then
echo "Patch failed to apply, please check the console for the error."
exit 0
fi
((attempt++))
sleep "$interval"
done
echo "Timeout reached. Resource did not reach SUCCEEDED state in $((max_attempts * interval / 60)) minutes."
exit 0
Zodra de patch succesvol is geïnstalleerd, krijg je daarvan een melding. Dat is alles! Met wat bash-scriptvaardigheden kun je alles combineren en je omgeving patchen met slechts één opdracht!
Zoals je ziet, kun je een variabele wijzigen om dit op al je clusters toe te passen.
Als je meer wilt weten over het volledige script dat ik voor de patchcycli heb geschreven, neem dan gerust contact met me op! Ik help je graag."