如何解决在来自父任务的项目上使用 loop_var,避免或控制子任务中仅与父项目有关的值的循环
团队,
我有一个运行子 IncludeTask 的父任务,因此我有一个值 item.item.0.device
现在,在子 IncludeTask 中,我必须使用此 item.item.0.device
来替换一个值,循环中的其余值将来自下面的库存值,仅用于该父项设备而不是所有设备值。然而,问题是子循环在所有设备上循环,而不仅仅是从父任务获得资格的设备。就像它在进入仅适用于 nvme 设备类型的块后也尊重 /dev/sda。
值:
local_volume_mount_disks:
- device: /dev/sdf
partitions:
- number: 1
start: 0%
end: 25%
storage_class: test
- device: /dev/nvme2n1
partitions:
- number: 1
start: 0%
end: 100%
storage_class: test
为 item.item.0.device
设置值的父任务
- name: "Run Tasks from file on condition device is not root"
include_tasks:
file: pfm_inventory_device_cp.yml
apply:
tags: pfm_inventory_device_cp
loop: "{{ is_device_root.results | unique }}"
when:
- item.rc == 1
子任务
- name: Create ext4 filesystem on partitions for NVME type device
filesystem:
fstype: ext4
dev: "{{ loop_var_nvme.0.device }}{{ nvme_extn }}{{ loop_var_nvme.1.number }}"
loop: "{{ local_volume_mount_disks|subelements('partitions') }}"
loop_control:
loop_var: loop_var_nvme
when: item.item.0.device is regex("nvme\w+")
现在,发生的事情是我的子任务而不是跳过 sda* 设备,而是在不匹配的正则表达式上执行,因为我在内部使用了循环。
错误输出
TASK [local_volume_mount : Create ext4 filesystem on partitions for NVME type device] ***
Friday 07 May 2021 16:48:48 +0000 (0:00:00.063) 0:00:11.060 ************
ok: [node1] => (item=[{'device': '/dev/nvme2n1','partitions': [{'number': 1,'start': '0%','end': '100%','storage_class': 'test'}]},{'number': 1,'storage_class': 'test'}])
failed: [node1] (item=[{'device': '/dev/sdf','end': '25%','storage_class': 'test'},{'number': 2,'start': ‘0%’,'end': ’25%’,'storage_class': 'test'}]) => {"ansible_loop_var": "loop_var_nvme","changed": false,"loop_var_nvme": [{"device": "/dev/sdf","partitions": [{"end": "25%","number": 1,"start": "0%","storage_class": "test"},{"end": "50%","number": 2,"start": "25%","storage_class": "test"}]},{"end": "25%","storage_class": "test"}],"msg": "Device /dev/sdfp1 not found."}
预期
TASK [local_volume_mount : Create ext4 filesystem on partitions for NVME type device] ***
Friday 07 May 2021 16:48:48 +0000 (0:00:00.063) 0:00:11.060 ************
ok: [node1] => (item=[{'device': '/dev/nvme2n1','storage_class': 'test'}])
skipping: [node1] => (item=[{'device': '/dev/sda','storage_class': 'test'}])
解决方法
问题似乎在于使用 loop_var
获取列表元素的值,但在 item
条件中使用 when
。要么在任何地方使用 item
,要么使用 loop_var_nvme
。
这样的任务,当设备与“nvme”不匹配时跳过该项目:
- debug:
msg: "Device = {{ loop_var_nvme.0.device }}; Device number = {{ loop_var_nvme.1.number }}"
loop: "{{ local_volume_mount_disks|subelements('partitions') }}"
loop_control:
loop_var: loop_var_nvme
when: loop_var_nvme.0.device is regex("nvme\w+")
运行时:
TASK [debug] ********************************************************************************************************************************************************************************
skipping: [localhost] => (item=[{'device': '/dev/sdf','partitions': [{'number': 1,'start': '0%','end': '25%','storage_class': 'test'}]},{'number': 1,'storage_class': 'test'}])
ok: [localhost] => (item=[{'device': '/dev/nvme2n1','end': '100%','storage_class': 'test'}]) => {
"msg": "Device = /dev/nvme2n1; Device number = 1"
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。