ansible - 如何在 Ansible 中交替替换多个列表的元素?

标签 ansible jinja2 ansible-facts json-query

我有多个列表作为输入(所有列表都具有相同的长度,但输入可以有超过 3 个列表)。我想创建一个列表,它是所有交替其元素的输入列表的总和。

例如,给定以下输入:

data:
  - ['1','2','3','4','5']
  - ['6','7','8','9','10']
  - ['11','12','13','14','15']

我期待以下输出:

lst: [['1','6','11'],['2','7','12'],['3','8','13'],['4','9','14'],['5','10','15']]

这是我尝试过的:


---
- name: zip more than 3 lists with loop
  hosts: localhost
  tasks:
    - name: Set facts
      set_fact:
        list:
          - ['1','2','3','4','5']
          - ['6','7','8','9','10']
          - ['11','12','13','14','15']

    - name: zip to make pairs of both lists
      set_fact:
        lst: "{{ list[0] | zip(list[1]) | zip(list[2]) | list }}"

    - name: Debug ['1','6','11'],['2','7','13'],...
      debug:
        msg: "{{ item | flatten }}"
      loop: "{{ lst }}"

    - name: zip to make pairs of both lists
      set_fact:
        lst2: "{{ lst2 | default([]) | zip(ansible_loop.nextitem) | list }}"
      loop: "{{ list }}"
      loop_control:
        extended: yes

    - name: Debug
      debug:
        msg: "{{ lst2 }}"

第一个 set_fact 输出循环元素,但 lst 不包含我期望的实际输出。第一个 set_fact 的限制是,由于 zip 过滤器,我无法在循环中进行迭代。我不知道如何实现我的目标。

最佳答案

根据数据

  data:
    - ['1','2','3','4','5']
    - ['6','7','8','9','10']
    - ['11','12','13','14','15']

问:Transpose矩阵。”

答:例如

    - set_fact:
        lst: "{{ lst|d(data.0)|zip(item)|map('flatten') }}"
      loop: "{{ data[1:] }}"

给出

  lst:
    - ['1', '6', '11']
    - ['2', '7', '12']
    - ['3', '8', '13']
    - ['4', '9', '14']
    - ['5', '10', '15']

系统的方法是为 Python 创建包装器 NumPy包裹。例如,以 numpy.matrix.transpose 开头

shell> cat filter_plugins/numpy.py
import json
import numpy


def numpy_transpose(arr):
    arr1 = numpy.array(arr)
    arr2 = arr1.transpose()
    return json.dumps(arr2.tolist())


class FilterModule(object):
    ''' Ansible wrappers for Python NumPy methods '''

    def filters(self):
        return {
            'numpy_transpose': numpy_transpose,
        }

下面的声明给出了相同的结果,无需迭代

  lst: "{{ data|numpy_transpose()|from_yaml }}"

关于ansible - 如何在 Ansible 中交替替换多个列表的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72143872/

相关文章:

检查模式下 Ansible undefined variable

python - Ansible playbook 在所有 Ubuntu 服务器上均失败

Ansible:如何在 Ansible 中仅从 FQDN 获取 IP 地址?

ansible - 变量名 'packages' 与 'ansible_facts.packages' 冲突

ansible - {{ ansible_hostname }} 在直接使用 Ansible 2.3 调用时不起作用

amazon-web-services - Ansible:为新创建的实例分配一个弹性IP

使用 group_by 时 Ansible 将看不到处理程序

html - 为什么样式表只适用于索引页,而不适用于索引页的任何扩展? (使用 Jinja 的模板)

jinja2 - 计算 jinja2 中对象属性的乘积之和

python - 通过 Python Flask 从一个 HTML 输入中获取多个值