diff --git a/ararat/deploy.py b/ararat/deploy.py
index d0e52a7..13c4305 100644
--- a/ararat/deploy.py
+++ b/ararat/deploy.py
@@ -53,12 +53,56 @@ openrc.service(
)
# add networking: https://wiki.alpinelinux.org/wiki/KVM#Networking
-# modprobe tun
+server.modprobe(
+ name="activate tun kernel module",
+ module="tun",
+)
# echo "tun" >> /etc/modules-load.d/tun.conf
+files.line(
+ name="autostart tun",
+ path="/etc/modules-load.d/tun.conf",
+ line="tun",
+)
# cat /etc/modules | grep tun || echo tun >> /etc/modules
+#files.line(path="/etc/modules",line="tun")
+# add VMs to public network:
+virsh_network_guests = []
+for vm in inventory.groups.get("debian_vms"):
+ #sudo ip addr add 65.109.242.20 dev eth0
+ ipv4 = vm.data.get("ipv4")
+ mac_address = '52:54:00:6c:3c:%02x'%vm.data.get("id")
+ files.template(
+ name=f"Add {ipv4} for {vm} to ararat",
+ src="ararat/files/floating-ip.cfg.j2",
+ dest=f"/etc/network/interfaces.d/60-{vm}-floating-up.cfg", # doesn't work, interfaces.d isn't included
+ vm=vm,
+ ipv4=ipv4,
+ )
+ #server.shell(name=f"Add {ipv4} for {vm} to ararat", commands=[f"ip addr add {ipv4} dev eth{vm}"],)
+ virsh_network_guests.append(f"")
+openrc.service(
+ service="networking",
+ restarted=True,
+)
+
+# create public kvm network
+files.template(
+ name="Generate libvirt public network XML",
+ src="ararat/files/public.network.j2",
+ dest="/tmp/public.network",
+ guests='\n '.join(virsh_network_guests),
+ host_ipv4=host.name,
+)
+server.shell(
+ name="Update libvirt public network",
+ commands=[
+ "virsh net-destroy public ; virsh net-undefine public || true",
+ "virsh net-define /tmp/public.network",
+ "virsh net-start public",
+ ]
+)
+# disable ipv6 in a bridge if necessary
-# if it doesn't exist, create debian base image (later: and other base images): https://mop.koeln/blog/creating-a-local-debian-vm-using-cloud-init-and-libvirt/#download-the-image
-# for every active VM, if no image exists, run virt-install with the chosen base image and their cloud-init.yml file: https://mop.koeln/blog/creating-a-local-debian-vm-using-cloud-init-and-libvirt/#preparing-a-cloud-init-file
debian_image_path = "/var/lib/libvirt/images/debian-12-generic-amd64.qcow2"
files.download(
name="Download Debian 12 base image",
@@ -86,15 +130,16 @@ for vm in inventory.groups.get("debian_vms"):
dest=f"/root/{vm}-cloud-init.yml",
ssh_authorized_keys=authorized_keys,
)
+ mac_address = '52:54:00:6c:3c:%02x' % vm.data.get("id")
memory = 1024
vcpus = 1
disk_size = 4
server.shell(
name=f"virt-install {vm}",
commands=[
+ f"virsh list -all | grep {vm} || " # only run virt-install if VM doesn't exist yet
f"virt-install --name {vm} --disk=size={disk_size},backing_store={debian_image_path} "
f"--memory {memory} --vcpus {vcpus} --cloud-init user-data=/root/{vm}-cloud-init.yml,disable=on "
- "--network bridge=virbr0 --osinfo=debian12 || true",
+ f"--network 'bridge=virbr0,network=public,mac_address={mac_address}' --osinfo=debian12 || true",
]
)
- # for every active VM, make sure an IP is assigned and traffic is passed to it
diff --git a/ararat/files/floating-ip.cfg.j2 b/ararat/files/floating-ip.cfg.j2
new file mode 100644
index 0000000..ba6a286
--- /dev/null
+++ b/ararat/files/floating-ip.cfg.j2
@@ -0,0 +1,4 @@
+auto eth0:{{ vm }}
+iface eth0:{{ vm }} inet static
+ address {{ ipv4 }}
+ netmask 32
diff --git a/ararat/files/public.network.j2 b/ararat/files/public.network.j2
new file mode 100644
index 0000000..d6635a6
--- /dev/null
+++ b/ararat/files/public.network.j2
@@ -0,0 +1,10 @@
+
+ public
+
+
+
+
+ {{ guests }}
+
+
+
diff --git a/inventory.py b/inventory.py
index ab5dd73..2eec2c2 100644
--- a/inventory.py
+++ b/inventory.py
@@ -8,6 +8,8 @@ debian_vms = [
"playground",
{
"authorized_keys": ["missytake", "hagi", "vmann"],
+ "ipv4": "65.109.242.20",
+ "id": 0,
}
),
]