我正在从几个具有动态命名列和数据行的远程主机上提取数据文件。我想计算一个合并的数据结构。我无法从源中获取 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] 删除。
我来说两句