diff options
| author | Jan Tuomi <jan@jantuomi.fi> | 2026-07-13 15:35:38 +0300 |
|---|---|---|
| committer | Jan Tuomi <jan@jantuomi.fi> | 2026-07-13 15:35:38 +0300 |
| commit | ada58b1aebd3d92fb258b8d728de619748887ff5 (patch) | |
| tree | 83db7481ca2f91ac14ed3e831e7bb36769df432a /roles | |
| parent | 67d5b193ad7ca4c496d3e701e7db88fb8b200d00 (diff) | |
thelounge prod fixes
Diffstat (limited to 'roles')
| -rw-r--r-- | roles/jail/tasks/jail_setup.yml | 163 | ||||
| -rw-r--r-- | roles/jails/03_irc_thelounge/defaults/main.yml | 6 |
2 files changed, 104 insertions, 65 deletions
diff --git a/roles/jail/tasks/jail_setup.yml b/roles/jail/tasks/jail_setup.yml index 86e28c2..3602b6e 100644 --- a/roles/jail/tasks/jail_setup.yml +++ b/roles/jail/tasks/jail_setup.yml @@ -1,9 +1,29 @@ -- name: "Check for existing data before ZFS volume creation for {{ jail_name }}" +# Host-side setup (runs on the jail host via SSH) +- name: "Check if {{ jail_name }} container exists" + shell: "zfs list -o name | grep -Fxq 'zroot/jails/containers/{{ jail_name }}'" + failed_when: false + changed_when: false + register: jail_exists + delegate_to: "{{ jail_delegate_host }}" + +- name: "Check {{ jail_name }} userland version" + shell: "zfs get -H -o value origin zroot/jails/containers/{{ jail_name }}" + register: jail_origin + changed_when: false + when: jail_exists.rc == 0 + delegate_to: "{{ jail_delegate_host }}" + +# ZFS volume migration +- name: "Check ZFS volume state for {{ jail_name }}" shell: | - zfs list {{ item.name }} >/dev/null 2>&1 && echo "exists" || \ - ([ -d "/usr/local/jails/containers/{{ jail_name }}{{ item.mountpoint }}" ] && \ - [ "$(ls -A /usr/local/jails/containers/{{ jail_name }}{{ item.mountpoint }})" ] && \ - echo "migrate" || echo "empty") + if zfs list {{ item.name }} >/dev/null 2>&1; then + echo "exists" + elif [ -d "/usr/local/jails/containers/{{ jail_name }}{{ item.mountpoint }}" ] && \ + [ "$(ls -A /usr/local/jails/containers/{{ jail_name }}{{ item.mountpoint }})" ]; then + echo "migrate" + else + echo "empty" + fi loop: "{{ zfs | default([]) }}" loop_control: label: "{{ item.name }}" @@ -25,95 +45,72 @@ {% endfor %} This will: - 1. Stop the jail - 2. Move existing data to .migrate - 3. Create ZFS volumes - 4. Copy data into the volumes + 1. Create ZFS volumes (staged) + 2. Stop the jail + 3. Copy existing data into the volumes ════════════════════════════════════════════════════════════════ Press Enter to continue or Ctrl+C to abort when: (_zfs_volume_state.results | default([]) | selectattr('stdout', 'equalto', 'migrate') | list | length) > 0 -- name: "Stop {{ jail_name }} jail for volume migration" - shell: "service jail stop {{ jail_name }} || true" - when: (_zfs_volume_state.results | default([]) | selectattr('stdout', 'equalto', 'migrate') | list | length) > 0 - delegate_to: "{{ jail_delegate_host }}" - -- name: "Move existing data aside for {{ jail_name }}" - shell: | - mv "/usr/local/jails/containers/{{ jail_name }}{{ item.item.mountpoint }}" \ - "/usr/local/jails/containers/{{ jail_name }}{{ item.item.mountpoint }}.migrate" - loop: "{{ _zfs_volume_state.results | default([]) }}" - loop_control: - label: "{{ item.item.name }}" - when: item.stdout == "migrate" - delegate_to: "{{ jail_delegate_host }}" - -- name: "Create ZFS volumes for {{ jail_name }}" +- name: "Create new ZFS volumes (staged) for {{ jail_name }}" community.general.zfs: - name: "{{ item.name }}" + name: "{{ item.item.name }}" state: present extra_zfs_properties: - mountpoint: "/usr/local/jails/containers/{{ jail_name }}{{ item.mountpoint }}" - loop: "{{ zfs | default([]) }}" + mountpoint: "/usr/local/jails/volumes/.staging/{{ jail_name }}{{ item.item.mountpoint }}" + loop: "{{ _zfs_volume_state.results | default([]) }}" loop_control: - label: "{{ item.name }}" + label: "{{ item.item.name }}" + when: item.stdout == "migrate" delegate_to: "{{ jail_delegate_host }}" -- name: "Create mount points for ZFS volumes in {{ jail_name }}" +- name: "Create staging mount points for {{ jail_name }}" file: - path: "/usr/local/jails/containers/{{ jail_name }}{{ item.mountpoint }}" + path: "/usr/local/jails/volumes/.staging/{{ jail_name }}{{ item.item.mountpoint }}" state: directory - owner: "{{ item.owner | default('root') }}" - group: "{{ item.group | default('wheel') }}" - mode: "{{ item.mode | default('0755') }}" - loop: "{{ zfs | default([]) }}" + loop: "{{ _zfs_volume_state.results | default([]) }}" loop_control: - label: "{{ item.mountpoint }}" + label: "{{ item.item.name }}" + when: item.stdout == "migrate" delegate_to: "{{ jail_delegate_host }}" -- name: "Mount ZFS volumes for {{ jail_name }}" - shell: "zfs mount {{ item.name }} || true" - loop: "{{ zfs | default([]) }}" +- name: "Mount staged volumes for {{ jail_name }}" + shell: "zfs mount {{ item.item.name }} || true" + loop: "{{ _zfs_volume_state.results | default([]) }}" loop_control: - label: "{{ item.name }}" + label: "{{ item.item.name }}" + when: item.stdout == "migrate" changed_when: false delegate_to: "{{ jail_delegate_host }}" -- name: "Restore migrated data into ZFS volumes for {{ jail_name }}" +- name: "Stop {{ jail_name }} jail for volume migration" + shell: "service jail stop {{ jail_name }} || true" + when: (_zfs_volume_state.results | default([]) | selectattr('stdout', 'equalto', 'migrate') | list | length) > 0 + delegate_to: "{{ jail_delegate_host }}" + +- name: "Copy data into staged volumes for {{ jail_name }}" shell: | - cp -a "/usr/local/jails/containers/{{ jail_name }}{{ item.item.mountpoint }}.migrate/." \ - "/usr/local/jails/containers/{{ jail_name }}{{ item.item.mountpoint }}/" + cp -a "/usr/local/jails/containers/{{ jail_name }}{{ item.item.mountpoint }}/." \ + "/usr/local/jails/volumes/.staging/{{ jail_name }}{{ item.item.mountpoint }}/" loop: "{{ _zfs_volume_state.results | default([]) }}" loop_control: label: "{{ item.item.name }}" when: item.stdout == "migrate" delegate_to: "{{ jail_delegate_host }}" -- name: "Note: .migrate directories left as backup for {{ jail_name }}" - debug: - msg: "Data migrated from {{ item.item.mountpoint }}.migrate — verify and remove manually" +- name: "Set final mountpoint on migrated volumes for {{ jail_name }}" + shell: | + zfs unmount {{ item.item.name }} || true + zfs set mountpoint="/usr/local/jails/containers/{{ jail_name }}{{ item.item.mountpoint }}" {{ item.item.name }} loop: "{{ _zfs_volume_state.results | default([]) }}" loop_control: label: "{{ item.item.name }}" when: item.stdout == "migrate" - -# Host-side setup (runs on the jail host via SSH) -- name: "Check if {{ jail_name }} container exists" - shell: "zfs list -o name | grep -Fxq 'zroot/jails/containers/{{ jail_name }}'" - failed_when: false - changed_when: false - register: jail_exists delegate_to: "{{ jail_delegate_host }}" -- name: "Check {{ jail_name }} userland version" - shell: "zfs get -H -o value origin zroot/jails/containers/{{ jail_name }}" - register: jail_origin - changed_when: false - when: jail_exists.rc == 0 - delegate_to: "{{ jail_delegate_host }}" - -- name: "*** MIGRATION REQUIRED: {{ jail_name }} ***" +# Userland migration +- name: "*** USERLAND MIGRATION REQUIRED: {{ jail_name }} ***" pause: prompt: | @@ -132,14 +129,23 @@ Press Enter to continue or Ctrl+C to abort when: - jail_exists.rc == 0 + - jail_origin.stdout is defined - "userland + '@base' not in jail_origin.stdout" +- name: "Stop {{ jail_name }} jail for userland migration" + shell: "service jail stop {{ jail_name }} || true" + when: + - jail_exists.rc == 0 + - jail_origin.stdout is defined + - "userland + '@base' not in jail_origin.stdout" + delegate_to: "{{ jail_delegate_host }}" + - name: "Migrate {{ jail_name }} to {{ userland }}" shell: | - service jail stop {{ jail_name }} || true zfs rename zroot/jails/containers/{{ jail_name }} zroot/jails/containers/{{ jail_name }}.old.$(date +%s) when: - jail_exists.rc == 0 + - jail_origin.stdout is defined - "userland + '@base' not in jail_origin.stdout" delegate_to: "{{ jail_delegate_host }}" @@ -148,6 +154,39 @@ when: jail_exists.rc != 0 or (jail_origin.stdout is defined and userland + '@base' not in jail_origin.stdout) delegate_to: "{{ jail_delegate_host }}" +# ZFS volume setup (for all volumes — existing, migrated, and new) +- name: "Ensure ZFS volumes exist for {{ jail_name }}" + community.general.zfs: + name: "{{ item.name }}" + state: present + extra_zfs_properties: + mountpoint: "/usr/local/jails/containers/{{ jail_name }}{{ item.mountpoint }}" + loop: "{{ zfs | default([]) }}" + loop_control: + label: "{{ item.name }}" + delegate_to: "{{ jail_delegate_host }}" + +- name: "Create mount points for ZFS volumes in {{ jail_name }}" + file: + path: "/usr/local/jails/containers/{{ jail_name }}{{ item.mountpoint }}" + state: directory + owner: "{{ item.owner | default('root') }}" + group: "{{ item.group | default('wheel') }}" + mode: "{{ item.mode | default('0755') }}" + loop: "{{ zfs | default([]) }}" + loop_control: + label: "{{ item.mountpoint }}" + delegate_to: "{{ jail_delegate_host }}" + +- name: "Mount ZFS volumes for {{ jail_name }}" + shell: "zfs mount {{ item.name }} || true" + loop: "{{ zfs | default([]) }}" + loop_control: + label: "{{ item.name }}" + changed_when: false + delegate_to: "{{ jail_delegate_host }}" + +# Container setup - name: "Create directories for {{ jail_name }}" file: path: "/usr/local/jails/containers/{{ jail_name }}{{ item }}" diff --git a/roles/jails/03_irc_thelounge/defaults/main.yml b/roles/jails/03_irc_thelounge/defaults/main.yml index c596a31..858df0e 100644 --- a/roles/jails/03_irc_thelounge/defaults/main.yml +++ b/roles/jails/03_irc_thelounge/defaults/main.yml @@ -5,9 +5,9 @@ zfs: mountpoint: /var/db/thelounge pkg: - - npm - - git - - yarn-node22 + - pcre2 + - npm-node24 + - yarn-node24 - git files: |
