1. Hem
  2. Cloud
  3. Hur schemalägger jag snapshots i Oderland Cloud?

Hur schemalägger jag snapshots i Oderland Cloud?

Denna guide är avsedd för avancerade användare.

För närvarande finns det inget stöd för schemaläggning av snapshots i Oderland Cloud, men du kan använda OpenStack API för att lösa det på egen hand. Genom att använda ett bash-skript (eller valfritt annat språk som du föredrar) och en schemaläggningstjänst så som cron eller en systemd-timer, kan du automatiskt ta snapshots av alla monterade volymer på din virtuella server.

Vi har skrivit ett förslag till ett sådant skript som du kan använda som inspiration (två varianter på samma tema). Du behöver fylla i alla variabler under kommentarerna OpenStack credentials och Virtual server ID (samt Email settings om du använder varianten som skickar mail efter körning). Skriptet nedan kommer att iterera över alla volymer monterade på server, ta en snapshot på dem, kontrollera status och därefter skriva ut resultatet i terminalen (samt skicka en rapport på mail om du så önskar).

Uppgifter som behövs för skriptet

Innan du kan sätta upp och börja använda bash-skriptet behöver du några uppgifter om ditt Cloud-konto samt den server du vill skapa snapshots för:

  • Inloggningsuppgifterna för ditt Cloud-konto (användarnamn och lösenord). Har du inte dessa kan du få fram dem enligt instruktionerna här (avsnittet “Återställa lösenordet”).
  • Projekt-ID för ditt Cloud-konto. Detta kan du se när du är inloggad på kontrollpanelen för Cloud, högst upp åt höger:
  • Server-ID för din server. Detta hittar du inne på kontrollpanelen för Oderland Cloud, om du går in på Compute (ikonen som ser ut som en kub) -> Virtual machines i menyn ute till vänster:

    Klicka sedan på raden för servern du vill skapa snapshots för och rulla ner till raden ID i den högra delen av fönstret.

Du har nu allt du behöver för att kunna skapa skriptet enligt våra förslag nedan.

Bash-skript för snapshots

Var försiktig med var du förvarar skriptet, då de uppgifter som finns däri tillåter åtkomst till samtliga servrar på ditt Oderland Cloud-konto.

När du hämtat ut alla uppgifter enligt avsnittet ovan kan du skapa skriptet. Välj om du vill ha mail från skriptet eller ej genom att kopiera den variant av skriptet du önskar nedan.

Skript som skickar mail med resultat

Skriptet behöver paketen openstack, jq och mailx för att kunna köras. Har du dem inte tillgängliga behöver de installeras först. Hur du gör detta täcks inte av denna guide.

Kopiera koden nedan till en fil på servern som du döper till exempelvis snapshot.sh.

Var noga med att byta ut innehållet i OS_PASSWORD, OS_PROJECT_NAME, OS_USERNAME och server_id till de uppgifter du plockat fram enligt ovan.

Ange också alla efterfrågade uppgifter under avsnittet “Email settings” för att mail ska skickas ut med resultatet av körningen.

#!/bin/bash

# OpenStack credentials
export OS_AUTH_TYPE='password'
export OS_AUTH_URL='https://cloud-api.oderland.com:5000/v3/'
export OS_DOMAIN_NAME='cloud'
export OS_PASSWORD='CLOUDLÖSENORD'
export OS_PROJECT_NAME='PROJEKT-ID'
export OS_USERNAME='CLOUDANVÄNDARNAMN'

# Virtual server ID
server_id='SERVER-ID'

# Email settings
recipient=''
sender=''
smtp_password=''
smtp_port=''
smtp_server=''
smtp_username=''

# Exit on unset variables
set -uo pipefail

# Check for dependencies
for dep in openstack mailx jq; do
  if ! hash "$dep" &> /dev/null; then
    printf 'Missing executable dependency: %s\n' "$dep"
    exit 1
  fi
done

# Get the name of the virtual server
server_name=$(openstack server show -c name -f value "$server_id")

# Get the list of volumes attached to the virtual server
volume_list=$(
  openstack server show -c volumes_attached -f json "$server_id" |
    jq -r '.volumes_attached[].id'
)

# Variable to store the result message
result_message=""

# Iterate over each volume and take a snapshot
for volume_id in $volume_list; do
  snapshot_name="snapshot-$(date +"%Y%m%d%H%M%S")"

  # Create the snapshot
  if openstack volume snapshot create --volume "$volume_id" --force "$snapshot_name" 1> /dev/null; then
    result_message+="Snapshot created successfully for volume $volume_id.\n"

    # Wait for the snapshot to become available
    timeout=60
    elapsed_time=0
    while true; do
      snapshot_status=$(openstack volume snapshot show -c status --format value "$snapshot_name")
      if [ "$snapshot_status" == "available" ]; then
        result_message+="Snapshot $snapshot_name is available for volume $volume_id.\n"
        break
      fi
      sleep 5
      elapsed_time=$((elapsed_time + 5))
      if [ $elapsed_time -ge $timeout ]; then
        result_message+="Error: Snapshot $snapshot_name did not become available for volume $volume_id within the timeout period.\n"
        break
      fi
    done
  else
    result_message+="Error creating snapshot for volume $volume_id.\n"
  fi
done

# Send email with the result
printf "$result_message" |
  mailx \
    -s "Snapshot Result for $server_name" \
    -S 'v15-compat' \
    -S "mta=smtp://$smtp_username:$smtp_password@$smtp_server:$smtp_port" \
    -S 'smtp-use-starttls' \
    -S 'smtp-auth=login' \
    -r "$sender" \
    "$recipient"

printf "$result_message"

Glöm inte att göra filen som innehåller skriptkoden körbar:

chmod +x /sökväg/till/snapshot.sh

Du kan nu testa att skapa snapshots med hjälp av scriptet genom att köra det:

/sökväg/till/snapshot.sh

Skript som inte skickar mail med resultat

Skriptet behöver paketen openstack och jq för att kunna köras. Har du dem inte tillgängliga behöver de installeras först. Hur du gör detta täcks inte av denna guide.

Kopiera koden nedan till en fil på servern som du döper till exempelvis snapshot.sh.

Var noga med att byta ut innehållet i OS_PASSWORD, OS_PROJECT_NAME, OS_USERNAME och server_id till de uppgifter du plockat fram enligt ovan.

#!/bin/bash

# OpenStack credentials
export OS_AUTH_TYPE='password'
export OS_AUTH_URL='https://cloud-api.oderland.com:5000/v3/'
export OS_DOMAIN_NAME='cloud'
export OS_PASSWORD='CLOUDLÖSENORD'
export OS_PROJECT_NAME='PROJEKT-ID'
export OS_USERNAME='CLOUDANVÄNDARNAMN'

# Virtual server ID
server_id='SERVER-ID'

# Exit on unset variables
set -uo pipefail

# Check for dependencies
for dep in openstack jq; do
  if ! hash "$dep" &> /dev/null; then
    printf 'Missing executable dependency: %s\n' "$dep"
    exit 1
  fi
done

# Get the name of the virtual server
server_name=$(openstack server show -c name -f value "$server_id")

# Get the list of volumes attached to the virtual server
volume_list=$(
  openstack server show -c volumes_attached -f json "$server_id" |
    jq -r '.volumes_attached[].id'
)

# Variable to store the result message
result_message=""

# Iterate over each volume and take a snapshot
for volume_id in $volume_list; do
  snapshot_name="snapshot-$(date +"%Y%m%d%H%M%S")"

  # Create the snapshot
  if openstack volume snapshot create --volume "$volume_id" --force "$snapshot_name" 1> /dev/null; then
    result_message+="Snapshot created successfully for volume $volume_id.\n"

    # Wait for the snapshot to become available
    timeout=60
    elapsed_time=0
    while true; do
      snapshot_status=$(openstack volume snapshot show -c status --format value "$snapshot_name")
      if [ "$snapshot_status" == "available" ]; then
        result_message+="Snapshot $snapshot_name is available for volume $volume_id.\n"
        break
      fi
      sleep 5
      elapsed_time=$((elapsed_time + 5))
      if [ $elapsed_time -ge $timeout ]; then
        result_message+="Error: Snapshot $snapshot_name did not become available for volume $volume_id within the timeout period.\n"
        break
      fi
    done
  else
    result_message+="Error creating snapshot for volume $volume_id.\n"
  fi
done

printf "$result_message"

Glöm inte att göra filen som innehåller skriptkoden körbar:

chmod +x /sökväg/till/snapshot.sh

Du kan nu testa att skapa snapshots med hjälp av scriptet genom att köra det:

/sökväg/till/snapshot.sh

Skapa schemalagda snapshots

När du nu har skriptet kan du sätta upp schemaläggning av snapshots, så du slipper tänka på att skapa dem manuellt. Enklaste lösningen för detta är att sätta upp ett cronjob, vilket vi går igenom nedan. Du kan också skapa en systemd-timer för schemaläggningen, men detta täcks inte av den här guiden.

Öppna redigeringen av cronjob:

crontab -e

Sist i crontab, lägg in föjande för att schemalägga körningen till kl 02:00 på natten varje dag. Du kan givetvis ange andra tider, intervall etc – detta är bara ett exempel.

0 2 * * * /sökväg/till/snapshot.sh

Avsluta därefter redigeringen av din crontab.

Ditt skript kommer nu köras av servern vid den/de tidpunkt(er) du angivit i cronjobbet.

Hjälpte den här guiden dig?

Relaterade guider

Behöver du mer hjälp?
Kan du inte hitta lösningen på ditt problem? Då kan du kontakta oss via e-post, chatt och telefon!
Kontakta oss