Назад | Перейти на главную страницу

Как с помощью Ansible создать расширенные подсписки из существующих списков и другой переменной?

Мне нужно было взять простой список, взять из него первые 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
#         ]
#     ]
# }