113 lines
No EOL
2.9 KiB
YAML
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('')" |