Ansible-删除给定磁盘列表上的所有分区

Ansible-删除给定磁盘列表上的所有分区

我在做一些看似微不足道的事情时遇到了严重的麻烦,我想我可能走错了路。

场景很简单,我有一个 host_group,其中有一个磁盘列表,如下所示:

磁盘:“['sdb','sdc']”

然后我要执行一项任务:

#Read device information (always use unit when probing)
- parted: device=/dev/{{ item }} unit=MiB   register: "{{ item }}_info"   with_items:
    -  "{{ disks }}"

这将读取磁盘的信息并将其存储在 2 个变量中:sdb_info 和 sdc_info

当我尝试删除给定磁盘上的所有分区时,问题就开始了,正常的任务是:

# Remove all partitions from disk
- parted:
    device: /dev/sdc
    number: "{{ item.num }}"
    state: absent   with_items:
    - "{{ sdc_info.partitions }}"

它工作正常,但我无法使其支持磁盘列表。

我正在做类似的事情:

# Remove all partitions from disk
- parted:
    device: /dev/{{ item[0] }}
    number: "{{ item[1].num }}"
    state: absent   with_nested:
    - "{{ disks }}" 
    - "{{ {{ disks }}_info.partitions }}"

问题似乎是“{{ {{ disks }}_info.partitions }}”,因为我无法循环。我可能选择了一种非常愚蠢的方法……任何帮助都将不胜感激。

答案1

注册到单个变量信息

    - parted:
        device=/dev/{{ item }}
        unit=MiB
      register: info
      loop: "{{ disks }}"

使用子元素迭代磁盘和分区。例如

    - hosts: localhost 
      vars:
        disks:
          - sda
          - sdc
      tasks:
        - parted:
            device: "/dev/{{ item }}"
            unit: MiB
          register: info
          loop: "{{ disks }}"
        - debug:
            msg: "{{ item.0.disk.dev }} {{ item.1.num }}"
          loop: "{{ info.results|subelements('partitions') }}"

给出

    "msg": "/dev/sda 1"
    "msg": "/dev/sda 2"
    "msg": "/dev/sda 3"
    "msg": "/dev/sda 5"
    "msg": "/dev/sdc 1"

答案2

以下命令可用于在单个任务中清除所有现有分区:

- command: wipefs -a {{ selected_device_id_path }}

除了它是一个单一命令之外,这里的优点是分区删除过程在调用parted info可能以parted意想不到的方式(故意)更改的设备时不易出现故障。这种情况之一是如果将设备(通过 virtio-blk)传递到虚拟机并将其块大小设置为其本机值,这可能与 QEMU 的默认值(512 字节)不同。

相关内容