Blogs

Patchen van ExaCS-clusters met OCI-CLI

09-09-2025
Het is belangrijk om je ExaCS-clusters up-to-date te houden. In dit artikel legt collega Mark Kempers, Infrastructuur Specialist bij MCX, een aantal basisstappen uit.

Mark 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."