Ubuntu

使用 Parted ansible 的模組創建交換分區 UUID 後無法獲取它

  • November 17, 2021

我必須在 VM 上的新磁碟中創建一個新分區。我使用 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

我之前沒有提到它,但最後一個任務在其他劇本上執行良好,甚至直接在 VM 上的 SSH 中執行。該命令僅在劇本執行上下文期間不返回任何內容。

以下是有關我的設置的其他一些資訊:

ansible-playbook 2.9.27 python 版本 = 2.7.17 Ubuntu 18.04(安裝了 ansible 和目標伺服器) community.general 集合(版本 3.7.0)

如果有人對此有任何想法;謝謝大家!

好的,我終於找到了解決方案。

問題是當分區沒有掛載時,它沒有 UUID。使用 xfs、extX 等數據分區時…分區是由系統直接掛載的,因此分區直接使用 UUID。

交換分區不是這種情況,您必須首先啟用它,mkswap系統才能掛載交換分區。

這就是為什麼我能夠在第二次 playbook 執行中獲得 UUID 值:我在 playbook 中啟用交換之前達到了 UUID 值。所以分區沒有掛載,也沒有 UUID。

如果它可以幫助某人

據我了解情況並從自己的經驗中知道,這種行為似乎是有意的。一旦更改完成,作業系統必須“強制”重新讀取分區表,然後才能獲得新的設備資訊。

更多連結

引用自:https://serverfault.com/questions/1083362