2025-12-23 19:56:26 +08:00

250 lines
7.2 KiB
YAML

---
- name: Set JSON Variables
set_fact:
all_mounts: '{{ all_mounts_json | from_json }}'
volume_mounts: '{{ volume_mounts_json | from_json }}'
bind_mounts: '{{ bind_mounts_json | from_json }}'
- name: Stop Filebeat
service:
name: filebeat
state: stopped
when: stop_filebeat_before_mount | default(false) | bool
- name: Stop Docker
service:
name: docker
state: stopped
when: stop_docker_before_mount | default(false) | bool
- name: Stop MariaDB
service:
name: mysql
state: stopped
when: stop_mariadb_before_mount | default(false) | bool
- name: Create Mount Points
file:
dest: '{{ item.mount_point }}'
state: directory
owner: '{{ item.mount_point_owner }}'
group: '{{ item.mount_point_group }}'
mode: '{{ item.mount_point_mode }}'
loop: '{{ all_mounts }}'
- name: Find VFAT Partitions On Disks
shell: >-
if lsblk -no TYPE {{ item.source | quote }} | grep -q "^disk$"; then
lsblk {{ item.source | quote }} -rno NAME,FSTYPE | grep -i vfat | awk '{print "/dev/" $1}';
else
echo "";
fi
register: vfat_devices
changed_when: false
loop: '{{ volume_mounts }}'
loop_control:
label: '{{ item.source }}'
when: rotate_additional_volume_metadata | default(false) | bool
- name: Wipe VFAT Filesystem Signatures
command: wipefs -a {{ item }}
loop: '{{ vfat_devices.results | map(attribute="stdout") | select("!=","") | list }}'
ignore_errors: true
loop_control:
label: '{{ item }}'
when: rotate_additional_volume_metadata | default(false) | bool
- name: Find ext4 partitions on disks
shell: >-
if lsblk -no TYPE {{ item.source | quote }} | grep -q "^disk$"; then
lsblk {{ item.source | quote }} -rno NAME,FSTYPE | grep -E "(ext4|^[[:space:]]*$)" | head -1 | awk '{print "/dev/" $1}';
else
echo {{ item.source | quote }};
fi
register: target_devices
changed_when: false
loop: '{{ volume_mounts }}'
loop_control:
label: '{{ item.source }}'
- name: Set target device facts
set_fact:
resolved_devices: >-
{{
resolved_devices | default([]) +
[{
'original_item': item.item,
'target_device': item.stdout.strip(),
'is_empty_partition': (item.stdout.strip() != item.item.source and item.stdout.strip() != "")
}]
}}
loop: '{{ target_devices.results }}'
loop_control:
label: '{{ item.item.source }}'
- name: Check if filesystem exists on target devices
command: lsblk -rno FSTYPE {{ item.target_device }}
register: fs_check
changed_when: false
failed_when: false
loop: '{{ resolved_devices | default([]) }}'
when: item.target_device != ""
loop_control:
label: '{{ item.target_device }}'
- name: Format Volumes
filesystem:
fstype: '{{ item.item.original_item.filesystem }}'
dev: '{{ item.item.target_device }}'
force: false
when:
- format_volumes | default(true)
- item.item.target_device != ""
- item.stdout == "" or item.rc != 0
loop: '{{ fs_check.results }}'
loop_control:
label: '{{ item.item.target_device }}'
- name: Force Unmount Volume Devices
ansible.posix.mount:
path: '{{ item.original_item.mount_point }}'
state: unmounted
loop: '{{ resolved_devices }}'
when:
- item.target_device != ""
- item.original_item.mount_point is defined
loop_control:
label: '{{ item.original_item.mount_point }}'
ignore_errors: true
- name: Force Unmount Bind Mounts
ansible.posix.mount:
path: '{{ item.mount_point }}'
state: unmounted
loop: '{{ bind_mounts }}'
when: item.mount_point is defined
loop_control:
label: '{{ item.mount_point }}'
- name: Generate Random UUIDs and Labels Per Device
set_fact:
randomized_devices: >-
{{
resolved_devices | map('combine', {
'new_uuid': (1000000 | random | string) | to_uuid,
'new_label': 'disk' ~ 9999 | random
}) | list
}}
when: rotate_additional_volume_metadata | default(false) | bool
- name: Force Check Filesystem on ext4 Devices
command: e2fsck -f -y {{ item.target_device }}
loop: '{{ randomized_devices | default([]) }}'
when:
- item.original_item.filesystem == 'ext4'
- item.target_device != ""
- rotate_additional_volume_metadata | default(false) | bool
loop_control:
label: '{{ item.target_device }}'
failed_when: false
- name: Set New UUID and Label For ext4 Devices
command: tune2fs -U {{ item.new_uuid }} -L {{ item.new_label }} {{ item.target_device }}
loop: '{{ randomized_devices | default([]) }}'
when:
- item.original_item.filesystem == 'ext4'
- item.target_device != ""
- rotate_additional_volume_metadata | default(false) | bool
loop_control:
label: '{{ item.target_device }}'
- name: Wait for udev to settle
command: udevadm settle
when: rotate_additional_volume_metadata | default(false) | bool
- name: Show Block Device UUIDs
command: 'lsblk {{ item.target_device }} -no UUID'
loop: '{{ resolved_devices | default([]) }}'
when: item.target_device != ""
register: block_devices
loop_control:
label: '{{ item.target_device }}'
- name: Mount Volumes
mount:
src: 'UUID={{ item.stdout.strip() }}'
path: '{{ item.item.original_item.mount_point }}'
fstype: '{{ item.item.original_item.filesystem }}'
opts: '{{ item.item.original_item.mount_options }}'
state: mounted
loop: '{{ block_devices.results }}'
when: item.stdout.strip() != ""
loop_control:
label: '{{ item.item.original_item.mount_point }}'
- name: Create Mount Source Directories
file:
dest: '{{ item.source }}'
state: directory
owner: '{{ item.mount_point_owner }}'
group: '{{ item.mount_point_group }}'
mode: '{{ item.mount_point_mode }}'
loop: '{{ bind_mounts }}'
- name: Copy existing data to bind mount source if needed
command: cp -a {{ item.mount_point }}/. {{ item.source }}/
when:
- item.mount_point is defined
- item.source is defined
- hetzner_cloud | default(false) | bool
- item.mount_point != item.source
- item.mount_point_owner is defined
- item.mount_point_group is defined
loop: '{{ bind_mounts }}'
- name: Mount Bind Mounts
mount:
src: '{{ item.source }}'
path: '{{ item.mount_point }}'
fstype: none
opts: '{{ item.mount_options }}'
state: mounted
loop: '{{ bind_mounts }}'
- name: Cleanup DB Replication Files
file:
path: '{{ item }}'
state: absent
with_fileglob:
- /var/lib/mysql/master.info
- /var/lib/mysql/relay-log.info
- /var/lib/mysql/relay-log.*
ignore_errors: yes
when: cleanup_db_replication_files | default(false) | bool
- name: Replace bind-address IP in config file
ansible.builtin.replace:
path: /etc/mysql/conf.d/jingrow.cnf
regexp: '^bind-address\s*=\s*.*'
replace: 'bind-address = {{ mariadb_bind_address }}'
when: mariadb_bind_address is defined and mariadb_bind_address != ""
- name: Restart Filebeat
service:
name: filebeat
state: started
when: start_filebeat_after_mount | default(false) | bool
- name: Restart Docker
service:
name: docker
state: started
when: start_docker_after_mount | default(false) | bool
- name: Restart MariaDB
service:
name: mysql
state: started
when: start_mariadb_after_mount | default(false) | bool