WIP Add KVM host backup recipe
Add a recipe that configures scripts for live backups of VM images via libvirt and borg.
This commit is contained in:
		
							parent
							
								
									6d50a32aca
								
							
						
					
					
						commit
						a3844b7ef6
					
				
							
								
								
									
										30
									
								
								site-cookbooks/kosmos_kvm/files/backup_vm.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								site-cookbooks/kosmos_kvm/files/backup_vm.sh
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | ||||
| #!/bin/bash | ||||
| # GENERATED BY CHEF | ||||
| # DO NOT EDIT | ||||
| set -e | ||||
| 
 | ||||
| REPOSITORY=$BORG_REPO | ||||
| 
 | ||||
| echo "Starting backup of VM: $1" | ||||
| 
 | ||||
| echo "Dumping domain XML to /root/backups/vm_meta/$1.xml" | ||||
| virsh dumpxml --migratable $1 > /root/backups/vm_meta/$1.xml | ||||
| 
 | ||||
| virsh snapshot-create-as --domain $1  \ | ||||
|         --name hotswap.qcow2  \ | ||||
|         --no-metadata         \ | ||||
|         --atomic              \ | ||||
|         --quiesce             \ | ||||
|         --disk-only           \ | ||||
|         --diskspec vda,snapshot=external | ||||
| 
 | ||||
| borg create -v --stats  \ | ||||
|         $REPOSITORY::$1_$(date +%F_%H-%M) \ | ||||
|         /var/lib/libvirt/images/$1.qcow2  \ | ||||
|         /root/backups/vm_meta | ||||
| 
 | ||||
| echo "Pivoting base image back to original" | ||||
| virsh blockcommit $1 vda --pivot --base=/var/lib/libvirt/images/$1.qcow2 | ||||
| 
 | ||||
| echo "Removing snapshot image" | ||||
| rm /var/lib/libvirt/images/$1.hotswap.qcow2 | ||||
							
								
								
									
										40
									
								
								site-cookbooks/kosmos_kvm/recipes/backup.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								site-cookbooks/kosmos_kvm/recipes/backup.rb
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,40 @@ | ||||
| # | ||||
| # Cookbook:: kosmos_kvm | ||||
| # Recipe:: backup | ||||
| # | ||||
| 
 | ||||
| apt_package "borgbackup" | ||||
| 
 | ||||
| borg_credentials = data_bag_item("credentials", "borg") | ||||
| 
 | ||||
| file "/root/.ssh/borg_rsa" do | ||||
|   content borg_credentials["ssh_key"] | ||||
|   mode '0600' | ||||
| end | ||||
| 
 | ||||
| bash "Add borg environment variables for bash" do | ||||
|   code <<-EOF | ||||
|           cat >>/root/.bashrc <<EOL | ||||
| 
 | ||||
| # GENERATED BY CHEF | ||||
| export BORG_RSH='ssh -i /root/.ssh/borg_rsa' | ||||
| export BORG_PASSPHRASE=#{borg_credentials["passphrase"]} | ||||
| export BORG_REPO='#{borg_credentials["repository"]}' | ||||
|   EOF | ||||
|   not_if "grep -q BORG /root/.bashrc" | ||||
| end | ||||
| 
 | ||||
| cookbook_file "/root/backups/backup_vm.sh" do | ||||
|   source "backup_vm.sh" | ||||
|   mode "0750" | ||||
| end | ||||
| 
 | ||||
| # Search all guests and filter by presence on current host | ||||
| vm_domains = search(:node, "role:kvm_guest").map(&:name) \ | ||||
|              & `virsh list --name`.strip.chomp.split("\n") | ||||
| 
 | ||||
| template "/root/backups/backup_all_vms.sh" do | ||||
|   source "backup_all_vms.sh.erb" | ||||
|   mode '0750' | ||||
|   variables vm_domains: vm_domains | ||||
| end | ||||
							
								
								
									
										11
									
								
								site-cookbooks/kosmos_kvm/templates/backup_all_vms.sh.erb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								site-cookbooks/kosmos_kvm/templates/backup_all_vms.sh.erb
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | ||||
| #!/bin/bash | ||||
| # GENERATED BY CHEF | ||||
| # DO NOT EDIT | ||||
| set -e | ||||
| 
 | ||||
| echo "Backing up all VMs with kvm_guest chef role..." | ||||
| 
 | ||||
| for domain in <%= @vm_domains.join(" ") %> | ||||
| do | ||||
|   /root/backups/backup_vm.sh $domain | ||||
| done | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user