我在做一些看似微不足道的事情时遇到了严重的麻烦,我想我可能走错了路。
场景很简单,我有一个 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 字节)不同。