2023-12-05 18:09:44 +01:00

108 lines
2.4 KiB
Ruby

#
# Cookbook:: kosmos_kvm
# Recipe:: backup
#
apt_package "borgbackup"
borg_credentials = data_bag_item("credentials", "borg")
if borg_credentials["nodes"].keys.include?(node.name)
passphrase = borg_credentials["nodes"][node.name]["passphrase"]
repository = borg_credentials["nodes"][node.name]["repository"]
else
passphrase = borg_credentials["passphrase"]
repository = borg_credentials["repository"]
end
file "/root/.ssh/borg_rsa" do
content borg_credentials["ssh_key"]
mode '0600'
end
file "/root/.borg_credentials.env" do
content <<-EOF
BORG_RSH='ssh -i /root/.ssh/borg_rsa'
BORG_PASSPHRASE=#{passphrase}
BORG_REPO='#{repository}'
EOF
end
bash "Load borg credentials in console sessions" do
code <<-EOF
cat >>/root/.bashrc <<EOL
# GENERATED BY CHEF
set -o allexport
source ~/.borg_credentials.env
set +o allexport
EOF
not_if "grep -q borg_credentials /root/.bashrc"
end
directory "/root/backups" do
mode "0750"
end
directory "/root/backups/vm_meta" do
mode "0750"
end
cookbook_file "/root/backups/backup_vm.sh" do
source "backup_vm.sh"
mode "0750"
end
cookbook_file "/root/backups/prune_vm_backups.sh" do
source "prune_vm_backups.sh"
mode "0750"
end
# Search all guests and filter by presence on current host
vm_domains = search(:node, "role:kvm_guest").map{|n| n["hostname"] } \
& `virsh list --name`.strip.chomp.split("\n")
vm_domains.reject! { |d| node["kosmos_kvm"]["backup"]["nodes_excluded"].any?{ |n| d.match?(/^#{n}/) } }
template "/root/backups/backup_all_vms.sh" do
source "backup_all_vms.sh.erb"
mode '0750'
variables vm_domains: vm_domains
end
systemd_unit "backup-libvirt-guests.service" do
content({
Unit: {
Description: "Back up libvirt guest images and metadata",
Wants: "network.target"
},
Service: {
Type: "oneshot",
EnvironmentFile: "/root/.borg_credentials.env",
ExecStart: "/root/backups/backup_all_vms.sh",
SyslogIdentifier: "backup-libvirt-guests",
Restart: "no"
}
})
verify false
triggers_reload true
action [:create]
end
systemd_unit "backup-libvirt-guests.timer" do
content({
Unit: {
Description: "Back up libvirt guest images and metadata",
},
Timer: {
OnCalendar: node["kosmos_kvm"]["backup"]["schedule"]
},
Install: {
WantedBy: "timers.target"
}
})
verify false
triggers_reload true
action [:create, :enable, :start]
end