Skip to content

Instantly share code, notes, and snippets.

@simonmorley
Last active January 4, 2016 10:44
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save simonmorley/d16261a1b45e28af6455 to your computer and use it in GitHub Desktop.
Save simonmorley/d16261a1b45e28af6455 to your computer and use it in GitHub Desktop.
Google Cloud Compute Create Snapshot with Rotate
#!/bin/ruby
require 'json'
require 'time'
require 'syslog'
class Snapshot
def initialize()
@format = 'json'
@zone = get_zone
@hostname = hostname
@time = Time.now.to_i
@regex = ".*#{@hostname}.*"
@snapshot_name = "#{@hostname}-#{@time}"
@rotate_days = 3
@rotate_period = @rotate_days * 60 * 60 *24
@disk_name = get_primary_disk
end
def get_zone
output = `curl --silent "http://metadata.google.internal/computeMetadata/v1/instance/zone" -H "Metadata-Flavor: Google"`
output.split("/").last
end
def hostname
hostname = `curl --silent "http://metadata.google.internal/computeMetadata/v1/instance/hostname" -H "Metadata-Flavor: Google"`
hostname.split(".").first
end
def get_primary_disk
instance = `gcloud compute instances describe #{@hostname} --format json --zone #{@zone}`
instance = JSON.parse instance
instance["disks"][0]["deviceName"]
end
def run_backup
create_snapshot
delete_old_snapshots
msg = "Finished the snapshots"
Syslog.open($0, Syslog::LOG_PID | Syslog::LOG_CONS) { |s| s.info msg }
end
def create_snapshot
msg = "Creating snapshot #{@snapshot_name}"
Syslog.open($0, Syslog::LOG_PID | Syslog::LOG_CONS) { |s| s.info msg }
`gcloud compute disks snapshot #{@disk_name} --snapshot-name #{@snapshot_name} --zone #{@zone}`
end
def delete_old_snapshots
snapshots = get_snapshots
if snapshots.length > 0
snapshots.each do |name|
msg = "Deleting snapshot #{name}"
Syslog.open($0, Syslog::LOG_PID | Syslog::LOG_CONS) { |s| s.info msg }
`gcloud compute snapshots delete #{name} --quiet`
end
else
msg = "No snapshots to delete"
Syslog.open($0, Syslog::LOG_PID | Syslog::LOG_CONS) { |s| s.info msg }
end
end
def get_snapshots
msg = "Finding snapshots older than #{Time.now - @rotate_period}"
Syslog.open($0, Syslog::LOG_PID | Syslog::LOG_CONS) { |s| s.info msg }
instances = `gcloud compute snapshots list --format #{@format} --regex #{@regex}`
instances = JSON.parse instances
instances.select { |instance| Time.parse(instance["creationTimestamp"]) <= Time.now - (@rotate_period) }.map { |instance| instance["name"] }
end
end
snapshot = Snapshot.new
snapshot.run_backup
@simonmorley
Copy link
Author

Requires service account on the instance running this

@simonmorley
Copy link
Author

Now logs to syslog and gets the disk name from gcloud.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment