packages, zfs pool
This commit is contained in:
parent
4a4c61308a
commit
0c34e25502
5 changed files with 535 additions and 124 deletions
172
ansible/infra/nodito/32_zfs_pool_setup_playbook.yml
Normal file
172
ansible/infra/nodito/32_zfs_pool_setup_playbook.yml
Normal file
|
|
@ -0,0 +1,172 @@
|
|||
- name: Setup ZFS RAID 1 Pool for Proxmox Storage
|
||||
hosts: nodito
|
||||
become: true
|
||||
vars_files:
|
||||
- ../infra_vars.yml
|
||||
- nodito_vars.yml
|
||||
|
||||
tasks:
|
||||
- name: Verify Proxmox VE is running
|
||||
command: pveversion
|
||||
register: pve_version_check
|
||||
changed_when: false
|
||||
failed_when: pve_version_check.rc != 0
|
||||
|
||||
- name: Update package cache
|
||||
apt:
|
||||
update_cache: yes
|
||||
cache_valid_time: 3600
|
||||
|
||||
- name: Install ZFS utilities
|
||||
package:
|
||||
name:
|
||||
- zfsutils-linux
|
||||
- zfs-initramfs
|
||||
state: present
|
||||
|
||||
- name: Load ZFS kernel module
|
||||
modprobe:
|
||||
name: zfs
|
||||
|
||||
- name: Ensure ZFS module loads at boot
|
||||
lineinfile:
|
||||
path: /etc/modules
|
||||
line: zfs
|
||||
state: present
|
||||
|
||||
- name: Check if ZFS pool already exists
|
||||
command: zpool list {{ zfs_pool_name }}
|
||||
register: zfs_pool_exists
|
||||
failed_when: false
|
||||
changed_when: false
|
||||
|
||||
- name: Check if disks are in use
|
||||
shell: |
|
||||
for disk in {{ zfs_disk_1 }} {{ zfs_disk_2 }}; do
|
||||
if mount | grep -q "^$disk"; then
|
||||
echo "ERROR: $disk is mounted"
|
||||
exit 1
|
||||
fi
|
||||
if lsblk -n -o MOUNTPOINT "$disk" | grep -v "^$" | grep -q .; then
|
||||
echo "ERROR: $disk has mounted partitions"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
register: disk_usage_check
|
||||
failed_when: disk_usage_check.rc != 0
|
||||
changed_when: false
|
||||
|
||||
- name: Create ZFS RAID 1 pool with optimized settings
|
||||
command: >
|
||||
zpool create {{ zfs_pool_name }}
|
||||
-o ashift=12
|
||||
-O mountpoint=none
|
||||
mirror {{ zfs_disk_1 }} {{ zfs_disk_2 }}
|
||||
when: zfs_pool_exists.rc != 0
|
||||
register: zfs_pool_create_result
|
||||
|
||||
- name: Check if ZFS dataset already exists
|
||||
command: zfs list {{ zfs_pool_name }}/vm-storage
|
||||
register: zfs_dataset_exists
|
||||
failed_when: false
|
||||
changed_when: false
|
||||
|
||||
- name: Create ZFS dataset for Proxmox storage
|
||||
command: zfs create {{ zfs_pool_name }}/vm-storage
|
||||
when: zfs_dataset_exists.rc != 0
|
||||
register: zfs_dataset_create_result
|
||||
|
||||
- name: Set ZFS dataset properties for Proxmox
|
||||
command: zfs set {{ item.property }}={{ item.value }} {{ zfs_pool_name }}/vm-storage
|
||||
loop:
|
||||
- { property: "mountpoint", value: "{{ zfs_pool_mountpoint }}" }
|
||||
- { property: "compression", value: "lz4" }
|
||||
- { property: "atime", value: "off" }
|
||||
- { property: "xattr", value: "sa" }
|
||||
- { property: "acltype", value: "posixacl" }
|
||||
- { property: "dnodesize", value: "auto" }
|
||||
when: zfs_dataset_exists.rc != 0
|
||||
|
||||
- name: Set ZFS pool properties for Proxmox
|
||||
command: zpool set autotrim=off {{ zfs_pool_name }}
|
||||
when: zfs_pool_exists.rc != 0
|
||||
|
||||
- name: Set ZFS pool mountpoint for Proxmox
|
||||
command: zfs set mountpoint={{ zfs_pool_mountpoint }} {{ zfs_pool_name }}
|
||||
when: zfs_pool_exists.rc == 0
|
||||
|
||||
- name: Export and re-import ZFS pool for Proxmox compatibility
|
||||
shell: |
|
||||
zpool export {{ zfs_pool_name }}
|
||||
zpool import {{ zfs_pool_name }}
|
||||
when: zfs_pool_exists.rc != 0
|
||||
register: zfs_pool_import_result
|
||||
|
||||
|
||||
- name: Ensure ZFS services are enabled
|
||||
systemd:
|
||||
name: "{{ item }}"
|
||||
enabled: yes
|
||||
state: started
|
||||
loop:
|
||||
- zfs-import-cache
|
||||
- zfs-import-scan
|
||||
- zfs-mount
|
||||
- zfs-share
|
||||
- zfs-zed
|
||||
|
||||
- name: Check if ZFS pool storage already exists in Proxmox config
|
||||
stat:
|
||||
path: /etc/pve/storage.cfg
|
||||
register: storage_cfg_file
|
||||
|
||||
- name: Check if storage name exists in Proxmox config
|
||||
shell: "grep -q '^zfspool: {{ zfs_pool_name }}' /etc/pve/storage.cfg"
|
||||
register: storage_exists_check
|
||||
failed_when: false
|
||||
changed_when: false
|
||||
when: storage_cfg_file.stat.exists
|
||||
|
||||
- name: Set storage not configured when config file doesn't exist
|
||||
set_fact:
|
||||
storage_exists_check:
|
||||
rc: 1
|
||||
when: not storage_cfg_file.stat.exists
|
||||
|
||||
- name: Debug storage configuration status
|
||||
debug:
|
||||
msg: |
|
||||
Config file exists: {{ storage_cfg_file.stat.exists }}
|
||||
Storage check result: {{ storage_exists_check.rc }}
|
||||
Pool exists: {{ zfs_pool_exists.rc == 0 }}
|
||||
Will remove storage: {{ zfs_pool_exists.rc == 0 and storage_exists_check.rc == 0 }}
|
||||
Will add storage: {{ zfs_pool_exists.rc == 0 and storage_exists_check.rc != 0 }}
|
||||
|
||||
- name: Remove existing storage if it exists
|
||||
command: pvesm remove {{ zfs_pool_name }}
|
||||
register: pvesm_remove_result
|
||||
failed_when: false
|
||||
when:
|
||||
- zfs_pool_exists.rc == 0
|
||||
- storage_exists_check.rc == 0
|
||||
|
||||
- name: Add ZFS pool storage to Proxmox using pvesm
|
||||
command: >
|
||||
pvesm add zfspool {{ zfs_pool_name }}
|
||||
--pool {{ zfs_pool_name }}
|
||||
--content rootdir,images
|
||||
--sparse 1
|
||||
when:
|
||||
- zfs_pool_exists.rc == 0
|
||||
- storage_exists_check.rc != 0
|
||||
register: pvesm_add_result
|
||||
|
||||
- name: Verify ZFS pool is healthy
|
||||
command: zpool status {{ zfs_pool_name }}
|
||||
register: final_zfs_status
|
||||
changed_when: false
|
||||
|
||||
- name: Fail if ZFS pool is not healthy
|
||||
fail:
|
||||
msg: "ZFS pool {{ zfs_pool_name }} is not in a healthy state"
|
||||
when: "'ONLINE' not in final_zfs_status.stdout"
|
||||
Loading…
Add table
Add a link
Reference in a new issue