Utilisation des fonctionnalités RunBefore et RunAfter à l’aide de l’outil Azure Application Consistent Snapshot
Cet article sert de guide pour utiliser les fonctionnalités --runbefore
et --runafter
de l’outil Azure Application Consistent Snapshot, que vous pouvez utiliser avec Azure NetApp Files.
Présentation
AzAcSnap peut exécuter des commandes externes avant ou après son exécution principale en utilisant respectivement les options --runbefore
ou --runafter
.
--runbefore
exécute une commande d’interpréteur de commandes avant l’exécution principale d’azacsnap et fournit certains des paramètres de ligne de commande azacsnap à l’environnement de l’interpréteur de commandes.
Par défaut, azacsnap
patiente jusqu’à 30 secondes pour que la commande d’interpréteur de commandes externe se termine avant de mettre fin au processus et de revenir à l’exécution normale d’azacsnap.
Ce retard peut être modifié en ajoutant un nombre de secondes d’attente après un caractère %
(par exemple, --runbefore "mycommand.sh%60"
permet de patienter jusqu’à 60 secondes pour que mycommand.sh
se termine).
--runafter
exécute une commande d’interpréteur de commandes après l’exécution principale d’azacsnap et fournit certains des paramètres de ligne de commande azacsnap à l’environnement de l’interpréteur de commandes.
Par défaut, azacsnap
patiente jusqu’à 30 secondes pour que la commande d’interpréteur de commandes externe se termine avant de mettre fin au processus et de revenir à l’exécution normale d’azacsnap.
Ce comportement peut être modifié en ajoutant un nombre de secondes d’attente après un caractère %
(par exemple, --runafter "mycommand.sh%60"
permet de patienter jusqu’à 60 secondes pour que mycommand.sh
se termine).
La liste suivante de variables d’environnement est générée par azacsnap
et passée à l’interpréteur de commandes dupliqué (fork) pour exécuter les commandes fournies comme paramètres à --runbefore
et --runafter
:
$azCommand
= option de commande passée à -c (par exemple, backup, test, etc.).$azConfigFileName
= nom de fichier de configuration.$azPrefix
= valeur --prefix.$azRetention
= valeur --retention.$azSid
= valeur --dbsid.$azSnapshotName
= nom d’instantané généré par azacsnap.
Remarque
Il existe uniquement une valeur pour $azSnapshotName
dans l’option --runafter
.
Exemple d’utilisation
Par exemple, l’utilisation de cette nouvelle fonctionnalité sert à charger un instantané sur un objet blob Azure à des fins d’archivage à l’aide de l’outil azcopy (Copier ou déplacer des données vers Stockage Azure avec AzCopy).
L’entrée crontab suivante est une ligne unique qui exécute azacsnap
à minuit cinq. Remarquez l’appel à snapshot-to-blob.sh
qui passe le nom et le préfixe de l’instantané :
5 0 * * * ( . ~/.bash_profile ; cd /home/azacsnap/bin ; ./azacsnap -c backup --volume data --prefix daily --retention 1 --configfile HANA.json --trim --ssl openssl --runafter 'env ; ./snapshot-to-blob.sh $azSnapshotName $azPrefix')
Cet exemple de script d’interpréteur de commandes présente une strophe spéciale à la fin pour empêcher AzAcSnap de mettre fin à la commande externe en raison du délai d’expiration décrit précédemment. Ainsi, l’exécution d’une commande durable est possible, notamment le chargement de fichiers volumineux avec azcopy, sans risquer un arrêt prématuré.
Les instantanés ont besoin d’être montés sur le système qui effectue la copie, avec au minimum des privilèges d’accès en lecture seule. L’emplacement de base du point de montage pour les instantanés doit être fourni à la variable sourceDir
dans le script.
cat snapshot-to-blob.sh
#!/bin/bash
# Utility to upload-to/list Azure Blob store.
# If run as snapshot-to-blob.sh will upload a gzipped tarball of the snapshot.
# If run as list-blobs.sh will list uploaded blobs.
# e.g. `ln -s snapshot-to-blob.sh list-blobs.sh`
# _START_ Change these
SAS_KEY_FILE="${HOME}/bin/blob-credentials.saskey"
# the snapshots need to be mounted locally for copying, put source directory here
SOURCE_DIR="/mnt/saphana1/hana_data_PR1/.snapshot"
# _END_ Change these
# _START_ AzCopy Settings
#Overrides where the job plan files (used for progress tracking and resuming) are stored, to avoid filling up a disk.
export AZCOPY_JOB_PLAN_LOCATION="${HOME}/.azcopy/plans/"
#Overrides where the log files are stored, to avoid filling up a disk.
export AZCOPY_LOG_LOCATION="${HOME}/.azcopy/logs/"
#If set, to anything, on-screen output will include counts of chunks by state
export AZCOPY_SHOW_PERF_STATES=true
# _END_ AzCopy Settings
# do not change any of the following
# Make sure we got some command line args
if [ "$(basename "$0")" = "snapshot-to-blob.sh" ] && ([ "$1" = "" ] || [ "$2" = "" ]); then
echo "Usage: $0 <SNAPSHOT_NAME> <PREFIX>"
exit 1
fi
# Make sure we can read the SAS key credential file.
if [ -r "${SAS_KEY_FILE}" ]; then
source "${SAS_KEY_FILE}"
else
echo "Credential file '${SAS_KEY_FILE}' not found, exiting!"
fi
# Assign the rest of the Global variables.
SNAPSHOT_NAME=$1
PREFIX=$2
BLOB_STORE="$(echo "${PORTAL_GENERATED_SAS}" | cut -f1 -d'?')"
BLOB_SAS_KEY="$(echo "${PORTAL_GENERATED_SAS}" | cut -f2 -d'?')"
ARCHIVE_LOG="logs/$(basename "$0").log"
# Archive naming (daily.1, daily.2, etc...)
DAY_OF_WEEK=$(date "+%u")
MONTH_OF_YEAR=$(date "+%m")
ARCHIVE_BLOB_TGZ="${PREFIX}.${DAY_OF_WEEK}.tgz"
#######################################
# Write to the log.
# Globals:
# None
# Arguments:
# LOG_MSG
#######################################
write_log(){
LOG_MSG=$1
date=$(date "+[%d/%h/%Y:%H:%M:%S %z]")
echo "$date ${LOG_MSG}" >> "${ARCHIVE_LOG}"
}
#######################################
# Run and Log the command.
# Globals:
# None
# Arguments:
# CMD_TO_RUN
#######################################
run_cmd(){
CMD_TO_RUN="${1}"
write_log "[RUNCMD] ${CMD_TO_RUN}"
bash -c "${CMD_TO_RUN}"
}
#######################################
# Check snapshot exists and then background the upload to Blob store.
# Globals:
# SOURCE_DIR
# SNAPSHOT_NAME
# ARCHIVE_LOG
# Arguments:
# None
#######################################
snapshot_to_blob(){
# Check SOURCE_DIR and SNAPSHOT_NAME exist
if [ ! -d "${SOURCE_DIR}/${SNAPSHOT_NAME}" ]; then
echo "${SOURCE_DIR}/${SNAPSHOT_NAME} not found, exiting!" | tee -a "${ARCHIVE_LOG}"
exit 1
fi
# background ourselves so AzAcSnap exits cleanly
echo "Backgrounding '$0 $@' to prevent blocking azacsnap"
echo "write_logging to ${ARCHIVE_LOG}"
{
trap '' HUP
# the script
upload_to_blob
list_blob >> "${ARCHIVE_LOG}"
} < /dev/null > /dev/null 2>&1 &
}
#######################################
# Upload to Blob store.
# Globals:
# SOURCE_DIR
# SNAPSHOT_NAME
# ARCHIVE_BLOB_TGZ
# BLOB_STORE
# BLOB_SAS_KEY
# ARCHIVE_LOG
# Arguments:
# None
#######################################
upload_to_blob(){
# Copy snapshot to blob store
echo "Starting upload of ${SNAPSHOT_NAME} to ${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}" >> "${ARCHIVE_LOG}"
run_cmd "azcopy env ; cd ${SOURCE_DIR}/${SNAPSHOT_NAME} && tar zcvf - * | azcopy cp \"${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}?${BLOB_SAS_KEY}\" --from-to PipeBlob && cd -"
echo "Completed upload of ${SNAPSHOT_NAME} ${BLOB_STORE}/${ARCHIVE_BLOB_TGZ}" >> "${ARCHIVE_LOG}"
# Complete
echo "Finished ($0 ${SNAPSHOT_NAME} ${PREFIX}) @ $(date "+%d-%h-%Y %H:%M")" >> "${ARCHIVE_LOG}"
echo "--------------------------------------------------------------------------------" >> "${ARCHIVE_LOG}"
# col 12345678901234567890123456789012345678901234567890123456789012345678901234567890
}
#######################################
# List contents of Blob store.
# Globals:
# BLOB_STORE
# BLOB_SAS_KEY
# Arguments:
# None
#######################################
list_blob(){
LOG_MSG="Current list of files stored in ${BLOB_STORE}"
write_log "${LOG_MSG}"
echo "${LOG_MSG}"
run_cmd "azcopy list \"${BLOB_STORE}?${BLOB_SAS_KEY}\" --properties LastModifiedTime "
}
# Log when script started.
write_log "Started ($0 ${SNAPSHOT_NAME} ${PREFIX}) @ $(date "+%d-%h-%Y %H:%M")"
# Check what this was called as ($0) and run accordingly.
case "$(basename "$0")" in
"snapshot-to-blob.sh" )
snapshot_to_blob
;;
"list-blobs.sh" )
list_blob
;;
*)
echo "Command '$0' not recognised!"
;;
esac
Le fichier saskey contient l’exemple de clé SAS suivant (contenu modifié pour des raisons de sécurité) :
cat blob-credentials.saskey
# we need a generated SAS key, get this from the portal with read,add,create,write,list permissions
PORTAL_GENERATED_SAS="https://<targetstorageaccount>.blob.core.windows.net/<blob-store>?sp=racwl&st=2021-06-10T21:10:38Z&se=2021-06-11T05:10:38Z&spr=https&sv=2020-02-10&sr=c&sig=<key-material>"