This example shows how to invoke curl from a bash script to back up the vCenter Server instance. A bash script can be invoked regularly as a cron job in the vCenter Server Appliance.

This example depends on certain variables that specify the source and destination for the backup operation. For simplicity, the variables are hard-coded at the start of the bash script.

This script does not encrypt the backup file.

#!/bin/bash
##### EDITABLE BY USER to specify vCenter Server instance and backup destination. #####
VC_ADDRESS=vc_server_ip
VC_USER=sso_user
VC_PASSWORD=sso_pass
FTP_ADDRESS=storage_server
FTP_USER=ftpuser
FTP_PASSWORD=ftpuser
BACKUP_FOLDER=backup
############################

# Authenticate with basic credentials.
curl -u "$VC_USER:$VC_PASSWORD" \
   -X POST \
   -k --cookie-jar cookies.txt \
   "https://$VC_ADDRESS/rest/com/vmware/cis/session"

# Create a message body for the backup request.
TIME=$(date +%Y-%m-%d-%H-%M-%S)
cat << EOF >task.json
{ "piece":
     {
         "location_type":"FTP",
         "comment":"Automatic backup",
         "parts":["seat"],
         "location":"ftp://$FTP_ADDRESS/$BACKUP_FOLDER/$TIME",
         "location_user":"$FTP_USER",
         "location_password":"$FTP_PASSWORD"
     }
}
EOF

# Issue a request to start the backup operation.
echo Starting backup $TIME >>backup.log
curl -k --cookie cookies.txt \
   -H 'Accept:application/json' \
   -H 'Content-Type:application/json' \
   -X POST \
   --data @task.json 2>>backup.log >response.txt \
   "https://$VC_ADDRESS/rest/appliance/recovery/backup/job"
cat response.txt >>backup.log
echo '' >>backup.log

# Parse the response to locate the unique identifier of the backup operation.
ID=$(awk '{if (match($0,/"id":"\w+-\w+-\w+"/)) \
          print substr($0, RSTART+6, RLENGTH-7);}' \
         response.txt)
echo 'Backup job id: '$ID

# Monitor progress of the operation until it is complete.
PROGRESS=INPROGRESS
until [ "$PROGRESS" != "INPROGRESS" ]
do
     sleep 10s
     curl -k --cookie cookies.txt \
       -H 'Accept:application/json' \
       --globoff \
       "https://$VC_ADDRESS/rest/appliance/recovery/backup/job/$ID" \
       >response.txt
     cat response.txt >>backup.log
     echo ''  >>backup.log
     PROGRESS=$(awk '{if (match($0,/"state":"\w+"/)) \
                     print substr($0, RSTART+9, RLENGTH-10);}' \
                    response.txt)
     echo 'Backup job state: '$PROGRESS
done

# Report job completion and clean up temporary files.
echo ''
echo "Backup job completion status: $PROGRESS"
rm -f task.json
rm -f response.txt
rm -f cookies.txt
echo ''  >>backup.log