Мне нужно было взять простой список, взять из него первые 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
Окончательное решение выглядит так:
- 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 }}"
Если вы не слишком разборчивы в выводе, вы, вероятно, могли бы немного упростить его. Это даст вам список списков.
- 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
# ]
# ]
# }