infra/ansible/roles/postgresql/tasks/storage.yml

113 lines
No EOL
2.9 KiB
YAML

---
# Storage setup for PostgreSQL on NVMe drives
- name: Install storage utilities
apt:
name:
- mdadm
- xfsprogs
- nvme-cli
- smartmontools
state: present
update_cache: true
- name: Check for NVMe devices
shell: nvme list -o json
register: nvme_devices
changed_when: false
failed_when: false
- name: Create partition on NVMe drive
parted:
device: /dev/nvme0n1
number: 1
state: present
label: gpt
part_start: 0%
part_end: 100%
fs_type: ext4
- name: Create RAID0 array with single drive (for future expansion)
command: |
mdadm --create {{ postgresql_raid_device }} \
--level=0 \
--raid-devices=1 \
--force \
/dev/nvme0n1p1
args:
creates: "{{ postgresql_raid_device }}"
when: postgresql_storage_type == "raid0"
- name: Wait for RAID array to be ready
wait_for:
path: "{{ postgresql_raid_device }}"
state: present
when: postgresql_storage_type == "raid0"
- name: Create filesystem on storage device
filesystem:
fstype: xfs
dev: "{{ postgresql_storage_device }}"
opts: "-L pgdata"
when: postgresql_storage_device is defined
- name: Get filesystem UUID
command: blkid -s UUID -o value {{ postgresql_storage_device }}
register: fs_uuid
changed_when: false
when: postgresql_storage_device is defined
- name: Create mount points
file:
path: "{{ item }}"
state: directory
owner: root
group: root
mode: '0755'
loop:
- "{{ postgresql_mount_point }}"
- "{{ postgresql_data_directory }}"
- "{{ postgresql_wal_directory }}"
- name: Mount PostgreSQL storage
mount:
path: "{{ postgresql_mount_point }}"
src: "UUID={{ fs_uuid.stdout }}"
fstype: xfs
opts: "noatime,nodiratime"
state: mounted
when: fs_uuid.stdout is defined
- name: Save RAID configuration
shell: mdadm --detail --scan >> /etc/mdadm/mdadm.conf
when: postgresql_storage_type == "raid0"
- name: Update initramfs
command: update-initramfs -u
when: postgresql_storage_type == "raid0"
- name: Set optimal I/O scheduler for NVMe
copy:
content: |
ACTION=="add|change", KERNEL=="nvme[0-9]n[0-9]", ATTR{queue/scheduler}="none"
ACTION=="add|change", KERNEL=="nvme[0-9]n[0-9]", ATTR{queue/nr_requests}="1024"
dest: /etc/udev/rules.d/60-nvme-scheduler.rules
mode: '0644'
notify: reload udev
- name: Configure sysctl for PostgreSQL performance
sysctl:
name: "{{ item.name }}"
value: "{{ item.value }}"
state: present
reload: true
loop:
- { name: 'vm.dirty_background_ratio', value: '5' }
- { name: 'vm.dirty_ratio', value: '10' }
- { name: 'vm.swappiness', value: '10' }
- { name: 'vm.overcommit_memory', value: '2' }
- { name: 'vm.overcommit_ratio', value: '95' }
register: sysctl_result
failed_when:
- sysctl_result.failed
- "'No such file or directory' not in sysctl_result.msg | default('')"