Implémenter le repositionnement automatique
Utilisez des scripts pour mettre en oeuvre le repositionnement automatique en cas d'échec d'une tâche d'application dans le gestionnaire de ressources. Les scripts de repositionnement automatique impliquent la surveillance des échecs de travail et la définition d'une procédure de repositionnement qui inclut la validation, les déclencheurs personnalisés et les actions.
Dans les environnements de production, il est essentiel d'établir une stratégie de déploiement robuste et flexible. Une bonne pratique commune consiste à intégrer le gestionnaire de ressources OCI à un système d'intégration et de développement en continu (CI/CD) pour gérer l'intégralité du cycle de vie du déploiement, y compris le repositionnement automatique.
Oracle Cloud Infrastructure (OCI) offre une plate-forme d'intégration et de développement en continu native offrant toutes les fonctions : OCI DevOps. Ce service fournit les outils et les pipelines nécessaires pour orchestrer de façon transparente les opérations de déploiement, de test, de surveillance et de repositionnement.
Script de repositionnement automatique
Pour vous aider à démarrer, nous avons fourni l'exemple de script Bash suivant, qui peut être utilisé dans un pipeline de déploiement OCI DevOps. Ce script présente un mécanisme permettant de repositionner automatiquement une pile du gestionnaire de ressources OCI en cas d'échec du déploiement.
Le script sert de point de départ que vous pouvez personnaliser en fonction de vos besoins particuliers afin de l'adapter aux besoins uniques de vos flux de travail de déploiement.
version: 0.1
component: command
timeoutInSeconds: 600
shell: bash
steps:
- type: Command
name: "Deployment Runner Functionality"
command: |
# The STACK_OCID variable is externally injected and remains unescaped.
STACK_OCID="${STACK_OCID}"
echo "Starting Resource Manager Apply Job for Stack: ${STACK_OCID}"
# 1. Create the Apply Job and capture its OCID.
job_id=$(
oci resource-manager job create-apply-job \
--execution-plan-strategy AUTO_APPROVED \
--display-name "DevOps-Apply-$(date +%s)" \
--stack-id "${STACK_OCID}" \
--wait-for-state 'ACCEPTED' \
--query 'data.id' \
--raw-output \
)
# Check if the job creation command returned a valid ID
if [ -z "$job_id" ]; then
echo "ERROR: Failed to create Resource Manager Apply job or command failed."
exit 1
fi
echo "Resource Manager Job OCID: $job_id"
# 2. Polling Loop to monitor job status
max_poll_time_seconds=600 # 10 minutes maximum wait time
poll_interval_seconds=10
elapsed_time=0
while [ $elapsed_time -le $max_poll_time_seconds ]; do
# Get the current job status.
status=$(
oci resource-manager job get \
--job-id "$job_id" \
--query 'data."lifecycle-state"' \
--raw-output \
)
echo "Time Elapsed: ${elapsed_time}s / ${max_poll_time_seconds}s - Current Job Status: $status"
if [ "$status" == "SUCCEEDED" ]; then
echo "Resource Manager Apply Job SUCCEEDED."
exit 0 # Success exit code
elif [ "$status" == "FAILED" ] || [ "$status" == "CANCELED" ]; then
echo "Resource Manager Apply Job FAILED or CANCELED."
# Check failure reason and conditionally trigger rollback
if [ "$status" == "FAILED" ]; then
# Fetch failure code
failure_code=$(
oci resource-manager job get \
--job-id "$job_id" \
--query 'data."failure-details".code' \
--raw-output \
)
if [ -z "$failure_code" ]; then
echo "No failure-details.code found in job output (field is empty or missing)"
echo "==== Full job JSON output for debugging: ===="
oci resource-manager job get \
--job-id "$job_id" \
else
echo "Failure code: $failure_code"
fi
if [ "$failure_code" == "TERRAFORM_EXECUTION_ERROR" ]; then
echo "Detected Terraform configuration error. Starting automatic rollback process..."
# Define a rollback function
automatic_rollback() {
# List all jobs, filter for successful Apply jobs, sort by time-created desc, and get latest job OCID
# Part 1: Fetch and count all succeeded APPLY jobs
matched_jobs=$(
oci resource-manager job list \
--stack-id "$STACK_OCID" \
--query 'data[?operation==`APPLY` && "lifecycle-state"==`SUCCEEDED`] | sort_by(@, &`"time-created"`)' \
)
job_count=$(echo "$matched_jobs" | jq 'length')
echo "Number of matching jobs found: $job_count"
# Part 2: Extract and print first OCID if any
last_succeeded_apply_job_ocid=$(echo "$matched_jobs" | jq -r '.[0].id // empty')
if [ -n "$last_succeeded_apply_job_ocid" ]; then
echo "Last succeeded apply job OCID: $last_succeeded_apply_job_ocid"
else
echo "No previous successful apply jobs found. Rollback skipped."
return 0
fi
echo "Invoking OCI CLI to create rollback job for OCID: $last_succeeded_apply_job_ocid"
oci resource-manager job create \
--from-json "{\"stackId\":\"${STACK_OCID}\",\"displayName\":\"DevOps-Apply-Rollback-$(date +%s)\",\"jobOperationDetails\":{\"operation\":\"APPLY_ROLLBACK\",\"executionPlanRollbackStrategy\":\"AUTO_APPROVED\",\"targetRollbackJobId\":\"$last_succeeded_apply_job_ocid\"}}" \
echo "======Apply Rollback Job Creation Complete========="
}
# Call the rollback function
automatic_rollback
fi
fi
exit 1 # Failure exit code
fi
# Wait before polling again
sleep $poll_interval_seconds
let "elapsed_time = elapsed_time + poll_interval_seconds"
done
# If the loop finished without SUCCEEDED or FAILED status
echo "Error: Resource Manager Apply Job timed out after ${max_poll_time_seconds} seconds."
exit 1La logique de repositionnement automatique implémentée dans le script comprend les étapes suivantes :
- Lancer le déploiement : Créez une tâche d'application pour déployer la configuration Terraform mise à jour.
- Surveiller le statut du déploiement : Surveillez continuellement le statut de la tâche d'application : Voir Obtention des détails d'une tâche.
- Évaluer l'échec : Si la tâche d'application échoue, évaluez des critères prédéfinis pour déterminer s'il faut déclencher un repositionnement automatique.
- Identifier l'état stable : Extrayez les tâches d'application réussies pour la pile et déterminez la tâche cible vers laquelle vous voulez repositionner : Voir Liste des tâches.
- Déclencher le repositionnement : Créez une tâche de repositionnement d'application pour restaurer la pile à l'état précédemment stable.