使用 Parted ansible 模块创建交换分区后无法获取 UUID

使用 Parted ansible 模块创建交换分区后无法获取 UUID

我必须在虚拟机上的新磁盘中创建一个新分区。我使用 parted 模块来创建分区。在未来的任务中(在同一个剧本中),我需要使用设备分区的 UUID(不是分区 UUID,而是分区的设备 UUID,例如存在于 /dev/disks/by-uuid/ 中)

问题是:parted 模块存档作业后,我没有找到在任务中获取分区的 UUID 的方法。我确信 parted 模块工作正常,因为运行后分区存在。

让我们看看我尝试了什么:

Creating the partition with the parted module
Re-launch facts with the setup module (with and without filtering on ansible_devices) in order to use the ansible_devices.sdX.partitions.sdXY.uuid --> return void
Use the blkid -s UUID -o value /dev/sdXY throught the shell module --> return void
Use the ls -l /dev/disk/by-uuid/ | grep sdXY | awk '{print $9}' throught the shell module --> still return void

糟糕的事实是:如果我在另一个剧本中启动相同的任务(如 2、3 或 4),我能够获得结果。但在 parted 模块的同一个剧本中:我不能。

以下是我的完整剧本:

---
- hosts: all
  become: yes
  gather_facts: "yes"
  tasks:

   - name: Check actual swap quantity
     debug:
       var: ansible_swaptotal_mb
     failed_when: ansible_swaptotal_mb > 1999


   - name: Add a 2Gb disk
     shell: pwsh ./add_disk_vm.ps1 -vm {{ ansible_hostname }} -diskspace 2
     delegate_to: localhost


   - name: Scan for new disks
     shell: for i in $(ls /sys/class/scsi_host/); do echo "- - -" > /sys/class/scsi_host/$i/scan ; done

   - name: Get letter of the new disk
     shell: 'dmesg | grep "sd\w.*2.00 GiB)$" | grep -o "sd\w" | tail -1'
     register: diskletter


   - name: Create new partition
     community.general.parted:
       device: /dev/{{ diskletter.stdout }}
       fs_type: linux-swap
       label: gpt
       name: swap
       number: 1
       state: present
     register: parted


   #here the task who should work, but returning nothing
   - name: Get UUID
     shell: blkid -s UUID -o value /dev/{{ diskletter.stdout }}1
     register: uuidinfo

我之前没有提到过,但最后一个任务在另一个剧本上甚至直接在虚拟机上的 SSH 中运行良好。该命令仅在剧本执行上下文期间不返回任何内容。

以下是有关我的设置的一些其他信息:

ansible-playbook 2.9.27 python 版本 = 2.7.17 Ubuntu 18.04(安装 ansible 和目标服务器)community.general 集合(版本 3.7.0)

如果有人对此有任何想法;谢谢大家!

答案1

据我了解的情况和自己的经验,这种行为似乎是故意的。一旦完成更改,操作系统必须“强制”重新读取分区表并且才能够获取新的设备信息。

更多链接

答案2

好吧,我终于找到了解决方案。

问题是,当分区未安装时,它没有 UUID。当使用 xfs、extX 等数据分区时...该分区由系统直接安装,因此该分区直接获得 UUID。

对于交换分区,情况并非如此,您必须先启用它,mkswap系统才能挂载交换分区。

这就是我能够在第二次执行 playbook 时获取 UUID 值的原因:我在 playbook 中启用交换之前就达到了 UUID 值。因此分区未挂载,也没有 UUID。

如果它可以帮助某人

相关内容