Skip to content

Instantly share code, notes, and snippets.

@dynajoe
Forked from simonmorley/gist:d16261a1b45e28af6455
Last active August 29, 2015 14:25
Show Gist options
  • Save dynajoe/446b041b6a388cb6a769 to your computer and use it in GitHub Desktop.
Save dynajoe/446b041b6a388cb6a769 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment