ansible-workstation/roles/base/tasks/archinstall/partition.yaml

180 lines
4.9 KiB
YAML

---
- name: Get details about rootfs disks
community.general.parted:
device: "{{ item }}"
unit: MiB
register: base_root_disks_info
loop: "{{ base_root_disks | list }}"
- name: Calculate maximum usable disk space
ansible.builtin.set_fact:
base_root_usable_mib: "{{ (base_root_disks_info.results | map(attribute='disk.size') | min | int) - 1 }}"
- debug: var=base_root_usable_mib
- name: Calculate disk utilization percentage
ansible.builtin.set_fact:
base_root_usable_mib: "{{ base_root_usable_mib|int - ((base_root_usable_mib|float) * (0.01 * (base_root_free_percent|float))) | round(method='floor') | int }}"
- name: Calculate zfs volume size
set_fact:
base_root_zpool_mib: "{{ base_root_usable_mib|int - fixed_size_partitions|int }}"
vars:
fixed_size_partitions: "{{ base_root_swap_mib|int + base_root_efi_mib|int }}"
#
- name: Calculate partition layouts
set_fact:
partition_ranges: >-
{{
(partition_ranges|d([])) + [{
'begin': base_root_partitions[:(loop_index|int)] | map(attribute='size_mib') | map('int') | sum(),
'end': base_root_partitions[:(loop_index|int+1)] | map(attribute='size_mib') | map('int') | sum(),
}]
}}
vars:
loop_index: "{{ item }}"
base_root_partitions:
- name: efi
size_mib: "{{ base_root_efi_mib }}"
- name: root
size_mib: "{{ base_root_zpool_mib }}"
- name: swap
size_mib: "{{ base_root_swap_mib }}"
with_sequence: start=0 end="{{ base_root_partitions | length - 1}}"
- debug:
var: partition_ranges
- name: Initialize partition facts
set_fact:
base_efi_partitions: []
base_root_partitions: []
base_swap_partitions: []
- name: Create EFI partition
become: true
vars:
part_index: 0
parted:
label: gpt
unit: MiB
name: EFI Boot
device: "{{ item.disk.dev }}"
number: "{{ part_index + 1 }}"
flags: [ boot, esp ]
part_start: "{{ [partition_ranges[part_index].begin, 1]|max }}MiB"
part_end: "{{ partition_ranges[part_index].end }}MiB"
state: present
fs_type: fat32
loop: "{{ base_root_disks_info.results }}"
register: parted_create
- name: Collect EFI partition devices
command: "lsblk -r --noheadings -o PATH {{ item }}"
register: lsblk
loop: "{{ parted_create.results | map(attribute='disk.dev') }}"
- debug:
var: lsblk
- name: Store EFI partition devices
set_fact:
base_efi_partitions: >-
{{ base_efi_partitions|d([]) + [
item[part_index+1]
]
}}
loop: "{{ lsblk.results | map(attribute='stdout_lines') }}"
vars:
part_index: 0
- name: Create root zvol partition
become: true
vars:
part_index: 1
parted:
label: gpt
unit: MiB
name: ArchLinux ZFS Root
device: "{{ item.disk.dev }}"
number: "{{ part_index + 1 }}"
part_start: "{{ partition_ranges[part_index].begin }}MiB"
part_end: "{{ partition_ranges[part_index].end }}MiB"
state: present
loop: "{{ parted_create.results }}"
register: parted_create
- name: Collect root zvol partition devices
command: "lsblk -r --noheadings -o PATH {{ item }}"
register: lsblk
loop: "{{ parted_create.results | map(attribute='disk.dev') }}"
- name: Store EFI partition devices
set_fact:
base_root_partitions: >-
{{ base_root_partitions|d([]) + [
item[part_index+1]
]
}}
loop: "{{ lsblk.results | map(attribute='stdout_lines') }}"
vars:
part_index: 1
- name: Create swap partition
become: true
vars:
part_index: 2
parted:
label: gpt
unit: MiB
device: "{{ item.disk.dev }}"
number: "{{ part_index + 1 }}"
part_start: "{{ partition_ranges[part_index].begin }}MiB"
part_end: "{{ partition_ranges[part_index].end }}MiB"
state: present
fs_type: linux-swap
loop: "{{ parted_create.results }}"
register: parted_create
when: base_root_swap_mib is defined and base_root_swap_mib|int > 0
- name: Collect swap partition devices
command: "lsblk -r --noheadings -o PATH {{ item }}"
register: lsblk
loop: "{{ parted_create.results | map(attribute='disk.dev') }}"
- name: Store EFI partition devices
set_fact:
base_swap_partitions: >-
{{ base_swap_partitions|d([]) + [
item[part_index+1]
]
}}
loop: "{{ lsblk.results | map(attribute='stdout_lines') }}"
vars:
part_index: 2
- name: Analyze resulting partition layouts
parted:
unit: MiB
device: "{{ item }}"
register: base_root_disks_info
loop: "{{ base_root_disks | list }}"
- name: Collect disk device identifiers
shell: "for x in /dev/disk/by-id/*; do echo $x $(realpath $x); done"
register: disk_realpaths
- name: Collect disk device identifiers into a base_partitions_by_id dictionary
set_fact:
base_partitions_by_id: >-
{{
dict(
disk_realpaths.stdout_lines
| map('split', ' ')
| map('list')
)
}}
- debug: var=base_efi_partitions
- debug: var=base_root_partitions
- debug: var=base_swap_partitions