我需要获取一个简单的列表,从中取出前 N 个元素(其中 N 来自用户输入),然后创建一个新的字典列表,其中每个项目都包含存储在另一个变量中的附加值。我花了很长时间才弄清楚,所以我把它留在这里,以防它能帮助别人节省时间。
最大的挑战是找到使用with_sequence循环可以归结为
loop: "{{ range(start, end, stride) | list }}".
我遇到过类似的事情。
- hosts: blah
vars:
user_input: N
extra_value: 100
simple_list:
- item1
- item2
.
.
.
- itemN
tasks:
.
.
.
我想根据用户在运行时提供的存储在其中的值创建一个{{ final_list}}
包含 N 个项目的增强型字典子列表。我还想将每个列表项添加到新列表。{{ simple_list }}
{{ user_input }}
value: {{ extra_value }}
新的列表最终应如下所示:
final_list:
- item: item1
value: 100
- item: item2
value: 100
.
.
.
- item: itemN
value: 100
答案1
最终的解决方案如下:
- name: Create final list based on simple_list, user_input, and extra value
set_fact:
final_list: "{{
final_list | default ([]) +
[
{
'item': simple_list[item],
'value': extra_value
}
]
}}"
loop: "{{ range(1, user_input + 1, 1) | list }}"
- name: Do things with final_list
.
.
.
loop: "{{ final_list }}"
答案2
如果你对输出不是太挑剔,你可以稍微简化一下。这将为你提供列表的列表。
- hosts: localhost
vars:
user_input: 4
extra_value: 100
simple_list:
- item1
- item2
- item3
- item4
- item5
- item6
tasks:
- debug:
msg: |
{{ simple_list[0:user_input] |
zip_longest([],fillvalue=extra_value) |
list }}
# TASK [debug] **********************************************************************************************************
# ok: [localhost] => {
# "msg": [
# [
# "item1",
# 100
# ],
# [
# "item2",
# 100
# ],
# [
# "item3",
# 100
# ],
# [
# "item4",
# 100
# ]
# ]
# }