From 76cc62c5f33dcaa29dc99da5313a0a652d3ce3f2 Mon Sep 17 00:00:00 2001 From: ogrechko Date: Wed, 6 May 2026 19:51:51 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20ansible/expand=5Fubuntu=5Fdisk.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ansible/expand_ubuntu_disk.yml | 114 ++++++++++----------------------- 1 file changed, 34 insertions(+), 80 deletions(-) diff --git a/ansible/expand_ubuntu_disk.yml b/ansible/expand_ubuntu_disk.yml index 20959a5..e4ed344 100644 --- a/ansible/expand_ubuntu_disk.yml +++ b/ansible/expand_ubuntu_disk.yml @@ -1,15 +1,19 @@ --- -- name: Expand Ubuntu disk in vCenter and inside guest +- name: Expand Ubuntu root disk in vCenter and inside guest hosts: all gather_facts: yes become: yes vars: - disk_unit_number: 0 disk_controller_number: 0 + disk_unit_number: 0 + root_disk: /dev/sda + root_partition: /dev/sda3 + root_partition_number: 3 + root_lv: /dev/mapper/ubuntu--vg-ubuntu--lv tasks: - - name: Gather VM info from vCenter + - name: Get VM info from vCenter community.vmware.vmware_guest_info: hostname: "{{ vcenter_hostname }}" username: "{{ vcenter_username }}" @@ -33,13 +37,13 @@ ) | int // 1024 // 1024 }} - - name: Calculate target disk size in GB + - name: Calculate target disk size ansible.builtin.set_fact: target_disk_gb: "{{ current_disk_gb + (increase_gb | int) }}" - name: Show resize plan ansible.builtin.debug: - msg: "Disk will be expanded from {{ current_disk_gb }} GB to {{ target_disk_gb }} GB" + msg: "Expanding {{ vm_name }} from {{ current_disk_gb }} GB to {{ target_disk_gb }} GB" - name: Expand disk in vCenter community.vmware.vmware_guest_disk: @@ -65,97 +69,47 @@ executable: /bin/bash changed_when: true - - name: Wait a moment after rescan + - name: Wait after rescan ansible.builtin.pause: seconds: 5 - - name: Detect root source device - ansible.builtin.command: findmnt -n -o SOURCE / - register: root_source - changed_when: false - - - name: Detect base disk and partition number - ansible.builtin.shell: | - set -e - ROOT_SRC="$(findmnt -n -o SOURCE /)" - PKNAME="$(lsblk -no PKNAME "$ROOT_SRC" | head -n1)" - PARTNUM="$(lsblk -no PARTN "$ROOT_SRC" | head -n1)" - if [ -z "$PKNAME" ]; then - PKNAME="$(basename "$(readlink -f "$ROOT_SRC")" | sed 's/[0-9]*$//')" - PARTNUM="$(basename "$(readlink -f "$ROOT_SRC")" | grep -o '[0-9]*$')" - fi - echo "DISK=/dev/${PKNAME}" - echo "PARTNUM=${PARTNUM}" - args: - executable: /bin/bash - register: root_layout - changed_when: false - - - name: Parse disk layout - ansible.builtin.set_fact: - root_disk: "{{ (root_layout.stdout_lines | select('match', '^DISK=') | first).split('=')[1] }}" - root_partnum: "{{ (root_layout.stdout_lines | select('match', '^PARTNUM=') | first).split('=')[1] }}" - - name: Ensure growpart is installed ansible.builtin.apt: name: cloud-guest-utils state: present update_cache: yes - - name: Expand root partition - ansible.builtin.command: "growpart {{ root_disk }} {{ root_partnum }}" + - name: Expand partition if needed + ansible.builtin.command: "growpart {{ root_disk }} {{ root_partition_number }}" register: growpart_result - changed_when: "'NOCHANGE' not in growpart_result.stdout" - failed_when: false - - - name: Detect filesystem source after partition grow - ansible.builtin.command: findmnt -n -o SOURCE / - register: root_source_after - changed_when: false - - - name: Detect filesystem type - ansible.builtin.command: findmnt -n -o FSTYPE / - register: root_fstype - changed_when: false - - - name: Check if root is on LVM - ansible.builtin.shell: | - lsblk -no TYPE "$(readlink -f {{ root_source_after.stdout | quote }})" | head -n1 - args: - executable: /bin/bash - register: root_dev_type - changed_when: false + changed_when: "'CHANGED:' in growpart_result.stdout" + failed_when: > + growpart_result.rc != 0 and + 'NOCHANGE:' not in growpart_result.stdout - name: Resize LVM physical volume - ansible.builtin.command: "pvresize {{ root_disk }}{{ root_partnum }}" - when: root_dev_type.stdout == "lvm" + ansible.builtin.command: "pvresize {{ root_partition }}" + register: pvresize_result + changed_when: "'changed' in (pvresize_result.stdout | lower) or 'resized' in (pvresize_result.stdout | lower)" failed_when: false - changed_when: true - name: Extend root logical volume and filesystem - ansible.builtin.command: "lvextend -r -l +100%FREE {{ root_source_after.stdout }}" - when: root_dev_type.stdout == "lvm" - changed_when: true + ansible.builtin.command: "lvextend -r -l +100%FREE {{ root_lv }}" + register: lvextend_result + changed_when: "'Size of logical volume' in lvextend_result.stdout or 'Logical volume' in lvextend_result.stdout" + failed_when: false - - name: Resize ext4 filesystem on non-LVM root - ansible.builtin.command: "resize2fs {{ root_source_after.stdout }}" - when: - - root_dev_type.stdout != "lvm" - - root_fstype.stdout in ["ext4", "ext3", "ext2"] - changed_when: true - - - name: Resize xfs filesystem on non-LVM root - ansible.builtin.command: "xfs_growfs /" - when: - - root_dev_type.stdout != "lvm" - - root_fstype.stdout == "xfs" - changed_when: true - - - name: Show final disk usage - ansible.builtin.command: df -h / - register: df_root + - name: Show volume state + ansible.builtin.shell: | + pvs + vgs + lvs + df -h / + args: + executable: /bin/bash + register: final_state changed_when: false - - name: Print final disk usage + - name: Print final state ansible.builtin.debug: - var: df_root.stdout_lines + var: final_state.stdout_lines