如何使用 Ansible 从现有列表和另一个变量创建增强子列表?

如何使用 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

答案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
#         ]
#     ]
# }

相关内容