6 Commits

Author SHA1 Message Date
Râu Cao
a3844b7ef6 WIP Add KVM host backup recipe
Add a recipe that configures scripts for live backups of VM images via
libvirt and borg.
2022-10-19 12:08:05 +02:00
Râu Cao
6d50a32aca Add FIXME note 2022-10-19 12:08:05 +02:00
Râu Cao
7848b4d365 Add jitsi-meet-1 VM 2022-10-19 12:08:04 +02:00
Râu Cao
063e9e070c Add borg credentials 2022-10-19 12:08:04 +02:00
Râu Cao
b78e6685ed Add kvm_guest role to VMs on fornax 2022-10-19 12:07:56 +02:00
Râu Cao
895d293899 Update RSKj version 2022-10-18 18:46:53 +02:00
19 changed files with 217 additions and 21 deletions

View File

@@ -0,0 +1,4 @@
{
"name": "jitsi-meet-1",
"public_key": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyNMD7N7s+JZM6PLlcrKN\n4jnr0jB5kU+Gr8EHtdpaBDGN5x8BahAkMuXcWfMQj4xIvUhTY4tTvDDYgcJGbrY4\ncmmt/YLX4t/OR6g2JxzIRWDBITTTlX7h5QUg10irjfPsyaU9O7lChDk4M3j5J4c2\nZFlZAar1+CeC5nwcEtNg4nL36I6bxUL5e/rEeeUGCGuqn3tAQ+GXj1G4uJYI18JQ\nhv43nIqbF+oVe5iRy58rXILd+zmbOq87cnF8O2ode44jRwtH4K0+uHTmq+83Q8Ld\n3wBZTnrQEnUDm6IuFuWfYhvNGlXAJrcmoH/wA1B5IAcuF3vhw9JY9axy+GDFszOX\nxwIDAQAB\n-----END PUBLIC KEY-----\n"
}

View File

@@ -0,0 +1,24 @@
{
"id": "borg",
"ssh_key": {
"encrypted_data": "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\n",
"iv": "3uagVTqoXUcWvs9W\n",
"auth_tag": "s3wlsnLRHCI2NjC6/ZwbiQ==\n",
"version": 3,
"cipher": "aes-256-gcm"
},
"passphrase": {
"encrypted_data": "wzSJQ+VfZuXmqrL3xW/LxiUvF/B6EYHAQtmhrJjt2oMT1G2OEgp5\n",
"iv": "BqTyfQwKKCTOn3q3\n",
"auth_tag": "sh1e8UuQSrq1o5G0O5fXCA==\n",
"version": 3,
"cipher": "aes-256-gcm"
},
"repository": {
"encrypted_data": "Ezc5YMp0VM82dlq0+ikk2xZeqNHi+XETlsc2cDlFG/NxY408JO3ErPDEa9d9\nzud+jcCt/01GKqPdslGhP3jsUUb/f3kWMkTWqGkyWXV1121E0uHwyrva62NT\n5A==\n",
"iv": "QtNBUjJ5NrQS0JD7\n",
"auth_tag": "ZQImzlvHWwX1OsxMZK1jGA==\n",
"version": 3,
"cipher": "aes-256-gcm"
}
}

View File

@@ -12,13 +12,16 @@
"hostname": "discourse-2",
"ipaddress": "192.168.122.104",
"roles": [
"discourse"
"kosmos_discourse",
"kvm_guest"
],
"recipes": [
"kosmos-base",
"kosmos-base::default",
"kosmos-dirsrv::hostsfile",
"kosmos_discourse",
"kosmos_discourse::default",
"kosmos_kvm::guest",
"apt::default",
"timezone_iii::default",
"timezone_iii::debian",
@@ -33,7 +36,7 @@
"postfix::_attributes",
"postfix::sasl_auth",
"hostname::default",
"kosmos-dirsrv::hostsfile",
"discourse::default",
"firewall::default",
"chef-sugar::default"
],
@@ -54,6 +57,7 @@
},
"run_list": [
"recipe[kosmos-base]",
"role[kvm_guest]",
"role[kosmos_discourse]"
]
}

View File

@@ -13,7 +13,8 @@
"ipaddress": "192.168.122.200",
"roles": [
"drone",
"postgresql_client"
"postgresql_client",
"kvm_guest"
],
"recipes": [
"kosmos-base",
@@ -21,6 +22,7 @@
"kosmos_postgresql::hostsfile",
"kosmos_drone",
"kosmos_drone::default",
"kosmos_kvm::guest",
"apt::default",
"timezone_iii::default",
"timezone_iii::debian",
@@ -53,6 +55,7 @@
},
"run_list": [
"recipe[kosmos-base]",
"role[kvm_guest]",
"role[drone]"
]
}
}

View File

@@ -58,6 +58,7 @@
},
"run_list": [
"recipe[kosmos-base]",
"role[kvm_guest]",
"role[ejabberd]"
]
}
}

View File

@@ -19,6 +19,7 @@
"kosmos-base",
"kosmos-base::default",
"kosmos_kvm::host",
"kosmos_kvm::backup",
"kosmos_assets::nginx_site",
"kosmos_discourse::nginx",
"kosmos_drone::nginx",
@@ -77,6 +78,7 @@
"run_list": [
"recipe[kosmos-base]",
"recipe[kosmos_kvm::host]",
"recipe[kosmos_kvm::backup]",
"role[nginx_proxy]",
"role[zerotier_controller]"
]

View File

@@ -13,7 +13,8 @@
"ipaddress": "192.168.122.189",
"roles": [
"gitea",
"postgresql_client"
"postgresql_client",
"kvm_guest"
],
"recipes": [
"kosmos-base",
@@ -22,6 +23,7 @@
"kosmos_gitea",
"kosmos_gitea::default",
"kosmos_gitea::backup",
"kosmos_kvm::guest",
"apt::default",
"timezone_iii::default",
"timezone_iii::debian",
@@ -57,6 +59,7 @@
},
"run_list": [
"recipe[kosmos-base]",
"role[kvm_guest]",
"role[gitea]"
]
}
}

55
nodes/jitsi-meet-1.json Normal file
View File

@@ -0,0 +1,55 @@
{
"name": "jitsi-meet-1",
"normal": {
"knife_zero": {
"host": "10.1.1.20"
}
},
"automatic": {
"fqdn": "jitsi-meet-1",
"os": "linux",
"os_version": "5.4.0-1073-kvm",
"hostname": "jitsi-meet-1",
"ipaddress": "192.168.122.188",
"roles": [
"kvm_guest"
],
"recipes": [
"kosmos-base",
"kosmos-base::default",
"kosmos_kvm::guest",
"apt::default",
"timezone_iii::default",
"timezone_iii::debian",
"ntp::default",
"ntp::apparmor",
"kosmos-base::systemd_emails",
"apt::unattended-upgrades",
"kosmos-base::firewall",
"kosmos-postfix::default",
"postfix::default",
"postfix::_common",
"postfix::_attributes",
"postfix::sasl_auth",
"hostname::default"
],
"platform": "ubuntu",
"platform_version": "20.04",
"cloud": null,
"chef_packages": {
"chef": {
"version": "17.10.3",
"chef_root": "/opt/chef/embedded/lib/ruby/gems/3.0.0/gems/chef-17.10.3/lib",
"chef_effortless": null
},
"ohai": {
"version": "17.9.0",
"ohai_root": "/opt/chef/embedded/lib/ruby/gems/3.0.0/gems/ohai-17.9.0/lib/ohai"
}
}
},
"run_list": [
"recipe[kosmos-base]",
"role[kvm_guest]"
]
}

View File

@@ -8,12 +8,13 @@
"automatic": {
"fqdn": "mastodon-3",
"os": "linux",
"os_version": "5.4.0-1058-kvm",
"os_version": "5.4.0-1071-kvm",
"hostname": "mastodon-3",
"ipaddress": "192.168.122.161",
"roles": [
"mastodon",
"postgresql_client"
"postgresql_client",
"kvm_guest"
],
"recipes": [
"kosmos-base",
@@ -22,6 +23,7 @@
"kosmos-mastodon",
"kosmos-mastodon::default",
"kosmos-mastodon::nginx",
"kosmos_kvm::guest",
"apt::default",
"timezone_iii::default",
"timezone_iii::debian",
@@ -65,7 +67,6 @@
"nginx::commons_conf",
"kosmos-nginx::firewall",
"tor-full::default",
"poise-git::default",
"git::default",
"git::package",
"kosmos-base::letsencrypt"
@@ -86,6 +87,7 @@
},
"run_list": [
"recipe[kosmos-base]",
"role[kvm_guest]",
"role[mastodon]"
]
}
}

View File

@@ -12,12 +12,14 @@
"hostname": "nodejs-4",
"ipaddress": "192.168.122.106",
"roles": [
"kvm_guest",
"kredits_github",
"sockethub"
],
"recipes": [
"kosmos-base",
"kosmos-base::default",
"kosmos_kvm::guest",
"kosmos-hubot::botka_irc-libera-chat",
"kredits-github",
"kredits-github::default",
@@ -81,6 +83,7 @@
},
"run_list": [
"recipe[kosmos-base]",
"role[kvm_guest]",
"recipe[kosmos-hubot::botka_irc-libera-chat]",
"role[kredits_github]",
"role[sockethub]"

View File

@@ -12,11 +12,13 @@
"hostname": "postgres-4",
"ipaddress": "192.168.122.3",
"roles": [
"kvm_guest",
"postgresql_replica"
],
"recipes": [
"kosmos-base",
"kosmos-base::default",
"kosmos_kvm::guest",
"kosmos_postgresql::hostsfile",
"kosmos_postgresql::replica",
"kosmos_postgresql::firewall",
@@ -52,6 +54,7 @@
},
"run_list": [
"recipe[kosmos-base]",
"role[kvm_guest]",
"role[postgresql_replica]"
]
}

View File

@@ -8,17 +8,19 @@
"automatic": {
"fqdn": "rs-discourse-1",
"os": "linux",
"os_version": "5.4.0-1073-kvm",
"os_version": "5.4.0-1076-kvm",
"hostname": "rs-discourse-1",
"ipaddress": "192.168.122.30",
"roles": [
"remotestorage_discourse"
"remotestorage_discourse",
"kvm_guest"
],
"recipes": [
"kosmos-base",
"kosmos-base::default",
"remotestorage_discourse",
"remotestorage_discourse::default",
"kosmos_kvm::guest",
"apt::default",
"timezone_iii::default",
"timezone_iii::debian",
@@ -54,6 +56,7 @@
},
"run_list": [
"recipe[kosmos-base]",
"role[kvm_guest]",
"role[remotestorage_discourse]"
]
}
}

View File

@@ -8,17 +8,19 @@
"automatic": {
"fqdn": "rsk-mainnet-2",
"os": "linux",
"os_version": "5.4.0-1058-kvm",
"os_version": "5.4.0-1075-kvm",
"hostname": "rsk-mainnet-2",
"ipaddress": "192.168.122.208",
"roles": [
"rskj_mainnet"
"rskj_mainnet",
"kvm_guest"
],
"recipes": [
"kosmos-base",
"kosmos-base::default",
"kosmos_rsk::rskj",
"kosmos_rsk::nginx",
"kosmos_kvm::guest",
"apt::default",
"timezone_iii::default",
"timezone_iii::debian",
@@ -65,6 +67,7 @@
},
"run_list": [
"recipe[kosmos-base]",
"role[kvm_guest]",
"role[rskj_mainnet]"
]
}
}

View File

@@ -8,17 +8,19 @@
"automatic": {
"fqdn": "rsk-testnet-3",
"os": "linux",
"os_version": "5.4.0-1058-kvm",
"os_version": "5.4.0-1075-kvm",
"hostname": "rsk-testnet-3",
"ipaddress": "192.168.122.231",
"roles": [
"rskj_testnet"
"rskj_testnet",
"kvm_guest"
],
"recipes": [
"kosmos-base",
"kosmos-base::default",
"kosmos_rsk::rskj",
"kosmos_rsk::nginx",
"kosmos_kvm::guest",
"apt::default",
"timezone_iii::default",
"timezone_iii::debian",
@@ -65,6 +67,7 @@
},
"run_list": [
"recipe[kosmos-base]",
"role[kvm_guest]",
"role[rskj_testnet]"
]
}
}

View File

@@ -165,6 +165,8 @@ end
ruby_block "configuration" do
block do
# FIXME This is internal Chef API and should not be used from recipes, as
# it is unsupported for that
file = Chef::Util::FileEdit.new("#{node['mediawiki']['webdir']}/LocalSettings.php")
file.search_file_replace_line(%r{\$wgLogo\ =\ \"\$wgResourceBasePath\/resources\/assets\/wiki.png\";},
"$wgLogo = \"$wgResourceBasePath/skins/common/images/kosmos.png\";")

View 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

View 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

View 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

View File

@@ -1,2 +1,2 @@
node.default['rskj']['version'] = '3.2.0~focal'
node.default['rskj']['version'] = '4.1.0~focal'
node.default['rskj']['network'] = 'testnet'