Compartir a través de


RunBefore y RunAfter mediante la herramienta Azure Application Consistent Snapshot

En este artículo se ofrece una guía para usar la funcionalidad --runbefore y --runafter de la herramienta Azure Application Consistent Snapshot que puede usar con Azure NetApp Files.

Introducción

AzAcSnap puede ejecutar comandos externos antes o después de su ejecución principal mediante las opciones --runbefore o --runafter respectivamente.

--runbefore ejecutará un comando del shell antes de la ejecución principal de azacsnap y proporciona algunos de los parámetros de la línea de comandos de azacsnap al entorno del shell. De forma predeterminada, azacsnap esperará un máximo de 30 segundos a que se complete el comando externo del shell antes de terminar el proceso y volver a la ejecución normal de azacsnap. Para invalidar este periodo de espera, debe agregar el número de segundos que se espere después de un carácter % (por ejemplo, --runbefore "mycommand.sh%60" esperará un máximo de 60 segundos para que mycommand.sh completarse).

--runafter ejecutará un comando del shell después de la ejecución principal de azacsnap y proporciona algunos de los parámetros de la línea de comandos de azacsnap al entorno del shell. De forma predeterminada, azacsnap esperará un máximo de 30 segundos a que se complete el comando externo del shell antes de terminar el proceso y volver a la ejecución normal de azacsnap. Para invalidar este periodo de espera, debe agregar el número de segundos que se espere después de un carácter % (por ejemplo, --runafter "mycommand.sh%60" esperará un máximo de 60 segundos para que mycommand.sh se complete).

azacsnap genera la siguiente lista de variables de entorno y la pasa al shell bifurcado para ejecutar los comandos proporcionados como parámetros a --runbefore y --runafter:

  • $azCommand = la opción del comando pasada a -c (por ejemplo, copia de seguridad, prueba, etc.)
  • $azConfigFileName = nombre de archivo de la configuración.
  • $azPrefix = --valor del prefijo.
  • $azRetention = --valor de retención.
  • $azSid = --valor de dbsid.
  • $azSnapshotName = nombre de instantánea generado por azacsnap.

Nota:

Solo hay un valor para $azSnapshotName en la opción --runafter.

Ejemplo de uso

Un ejemplo de uso de esta nueva característica es cargar una instantánea en Azure Blob con fines de archivado mediante la herramienta azcopy (copiar o mover datos a Azure Storage mediante AzCopy).

La siguiente entrada crontab es una sola línea y se ejecuta azacsnap a las cinco de la madrugada. Fíjese en la llamada a snapshot-to-blob.sh que pasa el nombre y el prefijo de la instantánea:

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')

Este script del shell de ejemplo tiene un valor especial al final para evitar que AzAcSnap termine el comando externo debido al tiempo de expiración descrito anteriormente. Esto permite ejecutar un comando de larga duración, como cargar archivos grandes con azcopy, sin que se detenga prematuramente.

Las instantáneas deben montarse en el sistema que hace la copia, con privilegios de solo lectura como mínimo. La ubicación base del punto de montaje para las instantáneas debe proporcionarse a la variable sourceDir en el 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

saskeyFile contiene la siguiente clave de SAS de ejemplo (el contenido ha cambiado por motivos de seguridad):

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

Pasos siguientes