如何使用从 Ansible 中的 3 个不同列表构建的键/值来形成字典字典

世代科技

我正在从几个具有动态命名列和数据行的远程主机上提取数据文件。我想计算一个合并的数据结构。我无法从源中获取 json 或 csv,只能获取文本数据文件。

节点1

field1  field2  field3
valueA1 valueA2 valueA3

节点2

field1  field2  field3
valueB1 valueB2 valueB3

到目前为止,我构建了 3 个列表:第一个是节点名称列表。第 2 和第 3 是由每个主机上的数据文件形成的。每个数据文件中的列名都相同,但我目前只是在读取远程数据文件时使用冗余名称构建 List2。

表 1

- node1
- node2
- node3

List2 的列表

-
    - field1
    - field2
    - field3
-
    - field1
    - field2
    - field3
-
    - field1
    - field2
    - field3

List3 of list

-
    - valueA1
    - valueA2
    - valueA3
-
    - valueB1
    - valueB2
    - valueB3
-
    - valueC1
    - valueC2
    - valueC3

我想最终得到一个这样的字典字典:

{ node1: 
    {field1:valueA1, field2:valueA2, field3:valueA3},
  node2: 
    {field1:valueB1, field2:valueB2, field3:valueB3},
  node3:
    {field1:valueC1, field2:valueC2, field3:valueC3}
}

假设我可以使用不同的数据结构,但最终,我需要像这样将数据嵌套到一个变量中,以便稍后在 playbook 中使用,并最终保存到一个 json 文件中。

法兰西

这本剧本完成了这项工作(使用 jinja2):

- hosts: localhost
  gather_facts: false
  vars:
    list1:
      - node1
      - node2
      - node3
    list2:
      - - field1
        - field2
        - field3
      - - field1
        - field2
        - field3
      - - field1
        - field2
        - field3
    list3:
      - - valueA1
        - valueA2
        - valueA3
      - - valueB1
        - valueB2
        - valueB3
      - - valueC1
        - valueC2
        - valueC3
  tasks:
    - name: loop over lists
      set_fact:
        list4: >-
            {%- set ns = namespace() -%}
            {%- set ns.dico = {} -%}
            {%- for l1 in list1 -%}
            {%- set ll = loop -%}
            {%- set ns.l1 = {} -%}
            {%- for l2 in list2 -%}
            {%- set ns.d2 = {} -%}            
            {%- for sl2 in l2 -%}
            {%- if ns.d2.update({sl2: list3[ll.index0][loop.index0]}) -%}{%- endif -%}                       
            {%- endfor -%}
            {%- if ns.dico.update({l1: ns.d2}) -%}{%- endif -%} 
            {%- endfor -%}
            {%- endfor -%}
            {{ ns.dico }}
    - debug:
        msg: "{{ list4 }}"

结果:

ok: [localhost] => {
    "msg": {
        "node1": {
            "field1": "valueA1",
            "field2": "valueA2",
            "field3": "valueA3"
        },
        "node2": {
            "field1": "valueB1",
            "field2": "valueB2",
            "field3": "valueB3"
        },
        "node3": {
            "field1": "valueC1",
            "field2": "valueC2",
            "field3": "valueC3"
        }
    }
}

您也可以使用自定义过滤器(完整的 python 脚本):

#!/usr/bin/python
class FilterModule(object):
    def filters(self):
        return {
            'listzip': self.listzip
        }

    def listzip(self, l1, l2, l3):
        result = {
            node: {
                    field: value for field, value in zip(l2[idx], l3[idx])
                } for idx, node in enumerate(l1)
        }
        return result

你像这样使用它:

- name: loop
  set_fact:
    list4: "{{ list1 | listzip(list2, list3) }}"

- debug:
    msg: "{{ list4 }}"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章