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

Étapes suivantes