250 lines
7.2 KiB
YAML
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
|