summaryrefslogtreecommitdiff
path: root/roles
diff options
context:
space:
mode:
authorChristian Pointner <equinox@spreadspace.org>2020-05-26 23:50:38 +0200
committerChristian Pointner <equinox@spreadspace.org>2020-05-26 23:50:38 +0200
commitacc437083cfa7b8f77b8e79af2a0c05bd871e198 (patch)
tree576360023addac147bef43f1ba340c61e3c9fe5b /roles
parentremove nextcloud test instance (diff)
parentcleanup old configs and playbooks (diff)
Merge branch 'topic/zfs-buster-backports'
Diffstat (limited to 'roles')
-rw-r--r--roles/base/tasks/Debian.yml13
-rw-r--r--roles/base/tasks/intel-nic.yml23
-rw-r--r--roles/kubernetes/base/tasks/zfs.yml6
-rw-r--r--roles/vm/define/templates/libvirt-domain.xml.j24
-rw-r--r--roles/vm/host/tasks/main.yml6
-rw-r--r--roles/vm/host/tasks/network.yml1
-rw-r--r--roles/vm/host/tasks/zfs.yml12
-rw-r--r--roles/vm/install/tasks/main.yml23
-rw-r--r--roles/zfs/base/defaults/main.yml9
-rw-r--r--roles/zfs/base/tasks/Debian.yml24
-rw-r--r--roles/zfs/base/tasks/Ubuntu.yml2
-rw-r--r--roles/zfs/base/tasks/enable-systemd-mount-generator.yml23
-rw-r--r--roles/zfs/base/tasks/main.yml10
-rw-r--r--roles/zfs/sanoid/defaults/main.yml26
-rw-r--r--roles/zfs/sanoid/tasks/main.yml15
-rw-r--r--roles/zfs/sanoid/templates/sanoid.conf.j222
16 files changed, 182 insertions, 37 deletions
diff --git a/roles/base/tasks/Debian.yml b/roles/base/tasks/Debian.yml
index 185c3616..13c3c9f9 100644
--- a/roles/base/tasks/Debian.yml
+++ b/roles/base/tasks/Debian.yml
@@ -111,15 +111,6 @@
when: install is defined and install.kernel_cmdline is defined
notify: update grub
-- name: disable TSO (intel nic stability fix)
+- name: apply stability fix/workaround for machines using intel NIC
when: base_intel_nic_stability_fix
- copy:
- content: |
- [Match]
- MACAddress={{ ansible_default_ipv4.macaddress }}
-
- [Link]
- TCPSegmentationOffload=false
- GenericSegmentationOffload=false
- GenericReceiveOffload=false
- dest: /etc/systemd/network/00-disable-offloading.link
+ import_tasks: intel-nic.yml
diff --git a/roles/base/tasks/intel-nic.yml b/roles/base/tasks/intel-nic.yml
new file mode 100644
index 00000000..2b9be474
--- /dev/null
+++ b/roles/base/tasks/intel-nic.yml
@@ -0,0 +1,23 @@
+---
+- name: fetch default link options for network interfaces
+ slurp:
+ src: /usr/lib/systemd/network/99-default.link
+ register: base_systemd_default_link_unit
+
+- name: disable TSO (intel nic stability fix)
+ vars:
+ default_link_options: "{{ (base_systemd_default_link_unit.content | b64decode | from_ini)['Link'] }}"
+ copy:
+ content: |
+ [Match]
+ MACAddress={{ ansible_default_ipv4.macaddress }}
+
+ [Link]
+ {% for name, value in default_link_options.items() | sort(attribute='0') %}
+ {{ name }}={{ value }}
+ {% endfor %}
+
+ TCPSegmentationOffload=false
+ GenericSegmentationOffload=false
+ GenericReceiveOffload=false
+ dest: /etc/systemd/network/00-disable-offloading.link
diff --git a/roles/kubernetes/base/tasks/zfs.yml b/roles/kubernetes/base/tasks/zfs.yml
index c417a1b6..4311dd3f 100644
--- a/roles/kubernetes/base/tasks/zfs.yml
+++ b/roles/kubernetes/base/tasks/zfs.yml
@@ -13,9 +13,3 @@
fstype: none
opts: bind,x-systemd.automount,nofail
state: mounted
-
-## TODO:
-## there is a race condition between the bind mound and the zfs-mount which is invisible to systemd.
-## It seems ZFSonLinux 8 and beyond have a systemd-generator to fix this problem. Sadly Debain Buster and Ubuntu Bionic contain
-## ZFSOnLinux 7 - so let's try the folllowing for a possible workaround:
-## https://askubuntu.com/questions/988968/which-zfs-command-systemd-unit-to-depend-on-to-ensure-that-a-mountpoint-is-avail
diff --git a/roles/vm/define/templates/libvirt-domain.xml.j2 b/roles/vm/define/templates/libvirt-domain.xml.j2
index 3465cec0..12c4f624 100644
--- a/roles/vm/define/templates/libvirt-domain.xml.j2
+++ b/roles/vm/define/templates/libvirt-domain.xml.j2
@@ -57,7 +57,7 @@
{% if src.type == 'lvm' %}
<source dev='/dev/mapper/{{ src.vg | replace('-', '--') }}-{{ src.lv | replace('-', '--') }}'/>
{% elif src.type == 'zfs' %}
- <source dev='/dev/zvol/{{ src.pool }}/{{ src.name }}'/>
+ <source dev='/dev/zvol/{{ vm_host.zfs[src.backend | default('default')].pool }}/{{ vm_host.zfs[src.backend | default('default')].name }}/{{ install_hostname }}/{{ src.name }}'/>
{% endif %}
<target dev='{{ device }}' bus='virtio'/>
</disk>
@@ -72,7 +72,7 @@
{% if src.type == 'lvm' %}
<source dev='/dev/mapper/{{ src.vg | replace('-', '--') }}-{{ src.lv | replace('-', '--') }}'/>
{% elif src.type == 'zfs' %}
- <source dev='/dev/zvol/{{ src.pool }}/{{ src.name }}'/>
+ <source dev='/dev/zvol/{{ vm_host.zfs[src.backend | default('default')].pool }}/{{ vm_host.zfs[src.backend | default('default')].name }}/{{ install_hostname }}/{{ src.name }}'/>
{% endif %}
<target dev='{{ device }}' bus='scsi'/>
</disk>
diff --git a/roles/vm/host/tasks/main.yml b/roles/vm/host/tasks/main.yml
index 0e11da3d..390016a2 100644
--- a/roles/vm/host/tasks/main.yml
+++ b/roles/vm/host/tasks/main.yml
@@ -19,9 +19,13 @@
notify: restart haveged
- name: install vm-host network
- when: vm_host.network is defined
+ when: "'network' in vm_host"
include_tasks: network.yml
+- name: prepare zfs volumes
+ when: "'zfs' in vm_host"
+ include_tasks: zfs.yml
+
- name: create lvm-based disk for installers
when: installer_lvm is defined
block:
diff --git a/roles/vm/host/tasks/network.yml b/roles/vm/host/tasks/network.yml
index bc207805..0688ec42 100644
--- a/roles/vm/host/tasks/network.yml
+++ b/roles/vm/host/tasks/network.yml
@@ -69,3 +69,4 @@
label: "br-{{ item.item.key }}"
when: item is changed
command: "/sbin/ifup br-{{ item.item.key }}"
+ failed_when: false
diff --git a/roles/vm/host/tasks/zfs.yml b/roles/vm/host/tasks/zfs.yml
new file mode 100644
index 00000000..00de48a9
--- /dev/null
+++ b/roles/vm/host/tasks/zfs.yml
@@ -0,0 +1,12 @@
+---
+- name: create zfs base datasets
+ loop: "{{ lookup('dict', vm_host.zfs, wantlist=True) }}"
+ loop_control:
+ label: "{{ item.key }} -> {{ item.value.pool }}/{{ item.value.name }}{% if 'quota' in item.value %}={{ item.value.quota }}{% endif %}"
+ zfs:
+ name: "{{ item.value.pool }}/{{ item.value.name }}"
+ state: present
+ extra_zfs_properties:
+ quota: "{{ item.value.quota | default(omit) }}"
+ canmount: no
+ mountpoint: none
diff --git a/roles/vm/install/tasks/main.yml b/roles/vm/install/tasks/main.yml
index 50772e53..4fa673c5 100644
--- a/roles/vm/install/tasks/main.yml
+++ b/roles/vm/install/tasks/main.yml
@@ -1,22 +1,29 @@
---
- name: create lvm-based disks for vm
- loop: "{{ hostvars[install_hostname].install_cooked.disks.virtio | default({}) | combine(hostvars[install_hostname].install_cooked.disks.scsi | default({})) | dict2items }}"
+ loop: "{{ hostvars[install_hostname].install_cooked.disks.virtio | default({}) | combine(hostvars[install_hostname].install_cooked.disks.scsi | default({})) | dict2items | selectattr('value.type', 'eq', 'lvm') | list }}"
loop_control:
- label: "{% if item.value.type == 'lvm' %}{{ item.value.vg }} / {{ item.value.lv }} ({{ item.value.size }}){% else %}unused{% endif %}"
- when: item.value.type == 'lvm'
+ label: "{{ item.value.vg }} / {{ item.value.lv }} ({{ item.value.size }})"
lvol:
vg: "{{ item.value.vg }}"
lv: "{{ item.value.lv }}"
size: "{{ item.value.size }}"
state: present
-- name: create zfs-based disks for vm
- loop: "{{ hostvars[install_hostname].install_cooked.disks.virtio | default({}) | combine(hostvars[install_hostname].install_cooked.disks.scsi | default({})) | dict2items }}"
+- name: create zfs base datasets for vm
+ loop: "{{ hostvars[install_hostname].install_cooked.disks.virtio | default({}) | combine(hostvars[install_hostname].install_cooked.disks.scsi | default({})) | dict2items | selectattr('value.type', 'eq', 'zfs') | map(attribute='value.backend') | map('default', 'default') | unique | list }}"
+ zfs:
+ name: "{{ vm_host.zfs[item].pool }}/{{ vm_host.zfs[item].name }}/{{ install_hostname }}"
+ state: present
+ extra_zfs_properties:
+ canmount: no
+ mountpoint: none
+
+- name: create zfs-based disk volumes for vm
+ loop: "{{ hostvars[install_hostname].install_cooked.disks.virtio | default({}) | combine(hostvars[install_hostname].install_cooked.disks.scsi | default({})) | dict2items | selectattr('value.type', 'eq', 'zfs') | list }}"
loop_control:
- label: "{% if item.value.type == 'zfs' %}{{ item.value.pool }} / {{ item.value.name }} ({{ item.value.size }}){% else %}unused{% endif %}"
- when: item.value.type == 'zfs'
+ label: "{{ item.value.name }} on backend {{ item.value.backend | default('default') }} ({{ item.value.size }})"
zfs:
- name: "{{ item.value.pool }}/{{ item.value.name }}"
+ name: "{{ vm_host.zfs[item.value.backend | default('default')].pool }}/{{ vm_host.zfs[item.value.backend | default('default')].name }}/{{ install_hostname }}/{{ item.value.name }}"
state: present
extra_zfs_properties:
volsize: "{{ item.value.size }}"
diff --git a/roles/zfs/base/defaults/main.yml b/roles/zfs/base/defaults/main.yml
index f3dfbce9..c275b981 100644
--- a/roles/zfs/base/defaults/main.yml
+++ b/roles/zfs/base/defaults/main.yml
@@ -1,4 +1,9 @@
---
+zfs_use_systemd_mount_generator: yes
+#zfs_arc_size:
+# min: {{ 2 * 1024 * 1024 * 1024 }}
+# max: {{ 8 * 1024 * 1024 * 1024 }}
+
zfs_zpool_properties:
ashift: 12
@@ -12,7 +17,3 @@ zfs_zpool_properties:
# properties:
# ashift: 12
# prop: value
-
-#zfs_arc_size:
-# min: {{ 2 * 1024 * 1024 * 1024 }}
-# max: {{ 8 * 1024 * 1024 * 1024 }}
diff --git a/roles/zfs/base/tasks/Debian.yml b/roles/zfs/base/tasks/Debian.yml
index b9fdda95..a1ed0387 100644
--- a/roles/zfs/base/tasks/Debian.yml
+++ b/roles/zfs/base/tasks/Debian.yml
@@ -3,9 +3,29 @@
import_role:
name: prepare-dkms
-## TODO: make sure contrib repo is enabled
+- name: check if contrib apt component is enabled
+ assert:
+ msg: "Debian zfs packages are in contrib - please enable it using 'apt_repo_components'"
+ that:
+ - apt_repo_components is defined
+ - "'contrib' in apt_repo_components"
-- name: install zfs-dkms
+- name: enable backports and force ZFS packages from backports for buster
+ when: (ansible_distribution_major_version | int) == 10
+ block:
+ - name: add backports repo
+ include_role:
+ name: apt-repo/backports
+
+ - name: pin zfs packages to buster-backports
+ copy:
+ content: |
+ Package: libnvpair1linux libuutil1linux libzfs2linux libzpool2linux spl-dkms zfs-dkms zfs-test zfsutils-linux zfsutils-linux-dev zfs-zed
+ Pin: release n=buster-backports
+ Pin-Priority: 990
+ dest: /etc/apt/preferences.d/zfs-from-buster-backports
+
+- name: install zfs modules via dkms
apt:
name: zfs-dkms
state: present
diff --git a/roles/zfs/base/tasks/Ubuntu.yml b/roles/zfs/base/tasks/Ubuntu.yml
index 0ce85358..9745d716 100644
--- a/roles/zfs/base/tasks/Ubuntu.yml
+++ b/roles/zfs/base/tasks/Ubuntu.yml
@@ -1,2 +1,2 @@
---
-# Nothing to do here.
+## nothing to do here - zfs modules are part of ubuntu core already
diff --git a/roles/zfs/base/tasks/enable-systemd-mount-generator.yml b/roles/zfs/base/tasks/enable-systemd-mount-generator.yml
new file mode 100644
index 00000000..abefbeb1
--- /dev/null
+++ b/roles/zfs/base/tasks/enable-systemd-mount-generator.yml
@@ -0,0 +1,23 @@
+---
+- name: enable zfs-list-cacher zlet
+ file:
+ src: /usr/lib/zfs-linux/zed.d/history_event-zfs-list-cacher.sh
+ dest: /etc/zfs/zed.d/history_event-zfs-list-cacher.sh
+ state: link
+
+- name: create base-directory for zfs-list.cache
+ file:
+ path: /etc/zfs/zfs-list.cache/
+ state: directory
+
+- name: create zfs-list.cache file for zpools
+ loop: "{{ zfs_zpools | dict2items }}"
+ loop_control:
+ label: "{{ item.key }}"
+ copy:
+ content: ""
+ dest: "/etc/zfs/zfs-list.cache/{{ item.key }}"
+ force: no
+
+## TODO: if this is installed after the zpool has already been created zed needs to be triggered
+## using someing like: zfs set canmount=on DATASET
diff --git a/roles/zfs/base/tasks/main.yml b/roles/zfs/base/tasks/main.yml
index e6f2347b..ad5d1ce2 100644
--- a/roles/zfs/base/tasks/main.yml
+++ b/roles/zfs/base/tasks/main.yml
@@ -15,11 +15,17 @@
name: zfs
state: present
-- name: install zfs file system utilities
+- name: install zed and zfs file system utilities
apt:
- name: zfsutils-linux
+ name:
+ - zfsutils-linux
+ - zfs-zed
state: present
+- name: enable systemd -mount-generator
+ when: zfs_use_systemd_mount_generator
+ import_tasks: enable-systemd-mount-generator.yml
+
- name: create zpools
loop: "{{ zfs_zpools | dict2items }}"
loop_control:
diff --git a/roles/zfs/sanoid/defaults/main.yml b/roles/zfs/sanoid/defaults/main.yml
new file mode 100644
index 00000000..55ebbd9d
--- /dev/null
+++ b/roles/zfs/sanoid/defaults/main.yml
@@ -0,0 +1,26 @@
+---
+zfs_sanoid_modules: {}
+
+zfs_sanoid_templates:
+ production:
+ frequently: 0
+ hourly: 36
+ daily: 7
+ monthly: 0
+ yearly: 0
+ autosnap: yes
+ autoprune: yes
+
+ backup:
+ frequently: 0
+ hourly: 0
+ daily: 60
+ monthly: 6
+ yearly: 0
+ autosnap: no
+ autoprune: yes
+
+ ignore:
+ autoprune: no
+ autosnap: no
+ monitor: no
diff --git a/roles/zfs/sanoid/tasks/main.yml b/roles/zfs/sanoid/tasks/main.yml
new file mode 100644
index 00000000..e35190e9
--- /dev/null
+++ b/roles/zfs/sanoid/tasks/main.yml
@@ -0,0 +1,15 @@
+---
+- name: install sanoid
+ apt:
+ name: sanoid
+ state: present
+
+- name: create sanoid config directory
+ file:
+ path: /etc/sanoid
+ state: directory
+
+- name: genarate sanoid config
+ template:
+ src: sanoid.conf.j2
+ dest: /etc/sanoid/sanoid.conf
diff --git a/roles/zfs/sanoid/templates/sanoid.conf.j2 b/roles/zfs/sanoid/templates/sanoid.conf.j2
new file mode 100644
index 00000000..2f2b29b4
--- /dev/null
+++ b/roles/zfs/sanoid/templates/sanoid.conf.j2
@@ -0,0 +1,22 @@
+###############################
+## modules
+###############################
+{% for name,options in zfs_sanoid_modules.items() %}
+
+[{{ name }}]
+{% for option,value in options.items() %}
+ {{ option }} = {{ value }}
+{% endfor %}
+{% endfor %}
+
+
+###############################
+## templates
+###############################
+{% for name,options in zfs_sanoid_templates.items() %}
+
+[template_{{ name }}]
+{% for option,value in options.items() %}
+ {{ option }} = {{ value }}
+{% endfor %}
+{% endfor %}