from pyinfra import host from pyinfra.operations import server, files, systemd, apt SUDO = True # This suppose you have: # sda 8:0 0 2.7T 0 disk # ├─sda1 8:1 0 512M 0 part # │ └─md0 9:0 0 511M 0 raid1 /boot # ├─sda2 8:2 0 40G 0 part # │ └─md1 9:1 0 40G 0 raid1 / # └─sda3 8:3 0 1M 0 part # sdb 8:16 0 2.7T 0 disk # ├─sdb1 8:17 0 512M 0 part # │ └─md0 9:0 0 511M 0 raid1 /boot # ├─sdb2 8:18 0 40G 0 part # │ └─md1 9:1 0 40G 0 raid1 / # └─sdb3 8:19 0 1M 0 part # sdc 8:32 0 223.6G 0 disk # └─sdc1 8:33 0 24G 0 part apt.packages( name='Install packages', packages=['zfsutils-linux'], update=True, ) if not host.fact.command('lsblk | grep sda4 || true'): server.shell( name='Create sda4 for zpool', commands=['sgdisk -n4:0:0 -t4:BF00 /dev/sda', 'partprobe'] ) if not host.fact.command('lsblk | grep sdb4 || true'): server.shell( name='Create sdb4 for zpool', commands=['sgdisk -n4:0:0 -t4:BF00 /dev/sdb', 'partprobe'] ) if not host.fact.command('lsblk | grep sdc2 || true'): server.shell( name='Create sdc2 for ZFS cache L2ARC', commands=['sgdisk -n2:0:0 -t2:FD00 /dev/sdc', 'partprobe'] ) # zfs.key is not stored on GIT, but on KeePassXC # When using new server be sure to set right disk ID if not host.fact.command('zpool list local | grep local || true'): server.shell( name='Create ZFS pool', commands=['zpool create -o ashift=12 -o autotrim=on -O encryption=aes-256-gcm -O keylocation=file:///etc/zfs.key -O keyformat=passphrase -O acltype=posixacl -O canmount=off -O compression=lz4 -O dnodesize=auto -O normalization=formD -O relatime=on -O xattr=sa local mirror /dev/disk/by-id/ata-ST33000650NS_Z290FDG2-part4 /dev/disk/by-id/ata-ST33000650NS_Z290FEJQ-part4 cache /dev/disk/by-id/ata-INTEL_SSDSC2CW240A3_CVCV306301L3240CGN-part2'] ) files.put( name='Upload systemd zfs-load-key service', src='files/zfs-load-key.service', dest='/etc/systemd/system/zfs-load-key.service', user='root', group='root', mode='644', ) systemd.daemon_reload( name='Reload systemd', user_mode=False, ) systemd.service( name='Enable zfs-load-key service', service='zfs-load-key.service', enabled=True, restarted=False, running=False, ) files.put( name='Upload LXD config', src='files/lxd.yml', dest='/tmp/lxd.yml', mode='644', ) if not host.fact.command('lxc storage list | grep local || true'): server.shell( name='Init LXD', commands=['cat /tmp/lxd.yml | lxd init --preseed'] ) if not host.fact.command('lxc storage volume list default | grep backups || true'): server.shell( name='Set LXD backups volumes', commands=['lxc storage volume create default backups', 'lxc config set storage.backups_volume default/backups'] ) if not host.fact.command('lxc storage volume list default | grep images || true'): server.shell( name='Set LXD images volumes', commands=['lxc storage volume create default images', 'lxc config set storage.images_volume default/images'] ) files.template( name='Push zfs-scrub script', src='templates/zfs-scrub.sh.j2', dest='/usr/local/bin/zfs-scrub.sh', mode='700', user='root', group='root', ) files.put( name='Push zfs-scrub timer', src='files/zfs-scrub.timer', dest='/etc/systemd/system/zfs-scrub.timer', user='root', group='root', mode='644', ) files.put( name='Push zfs-scrub service', src='files/zfs-scrub.service', dest='/etc/systemd/system/zfs-scrub.service', user='root', group='root', mode='644', ) systemd.daemon_reload( name='Reload systemd', user_mode=False, ) systemd.service( name='Enable zfs-scrub timer', service='zfs-scrub.timer', running=True, enabled=True, )