我需要將一個簡單的串列轉換為一個復雜的串列。
簡單的看起來像這樣:
customers:
- customer01-node01.private.foo.it
- customer02-node01.private.foo.it
- customer04-node03.private.foo.it
- customer03-node02.private.foo.it
- customer05-node02.private.foo.it
- customer01-node04.private.foo.it
- customer02-node04.private.foo.it
- customer04-node06.private.foo.it
- customer03-node05.private.foo.it
- customer05-node05.private.foo.it
我試圖找到一種方法來獲得一個復雜的,按客戶分組節點。我正在尋找的最終結果是這個:
customers_list:
- customer: customer01
nodes:
- node01.private.foo.it
- node04.private.foo.it
- customer: customer02
nodes:
- node01.private.foo.it
- node04.private.foo.it
- customer: customer03
nodes:
- node02.private.foo.it
- node05.private.foo.it
- customer: customer04
nodes:
- node03.private.foo.it
- node06.private.foo.it
- customer: customer05
nodes:
- node02.private.foo.it
- node05.private.foo.it
uj5u.com熱心網友回復:
決議資料
- set_fact:
customers_parsed: "{{ customers_parsed|d([]) [{'customer': _customer,
'node': _node}] }}"
loop: "{{ customers }}"
vars:
_customer: "{{ item.split('-')|first }}"
_node: "{{ item.split('-')|last }}"
給
customers_parsed:
- customer: customer01
node: node01.private.foo.it
- customer: customer02
node: node01.private.foo.it
- customer: customer04
node: node03.private.foo.it
- customer: customer03
node: node02.private.foo.it
- customer: customer05
node: node02.private.foo.it
- customer: customer01
node: node04.private.foo.it
- customer: customer02
node: node04.private.foo.it
- customer: customer04
node: node06.private.foo.it
- customer: customer03
node: node05.private.foo.it
- customer: customer05
node: node05.private.foo.it
然后按屬性客戶對專案進行分組并連接串列
- set_fact:
customers_list: "{{ customers_list|d([]) [{'customer': item.0,
'nodes': _nodes}] }}"
loop: "{{ customers_parsed|groupby('customer') }}"
vars:
_nodes: "{{ item.1|map(attribute='node')|list }}"
給
customers_list:
- customer: customer01
nodes:
- node01.private.foo.it
- node04.private.foo.it
- customer: customer02
nodes:
- node01.private.foo.it
- node04.private.foo.it
- customer: customer03
nodes:
- node02.private.foo.it
- node05.private.foo.it
- customer: customer04
nodes:
- node03.private.foo.it
- node06.private.foo.it
- customer: customer05
nodes:
- node02.private.foo.it
- node05.private.foo.it
uj5u.com熱心網友回復:
您可以使用自定義過濾器:
您在 playbook 檔案夾中創建一個檔案夾filter_plugins(我將檔案命名為myfilters.py和過濾器custom)
檔案夾 filter_plugins 中的 myfilters.py:
#!/usr/bin/python
class FilterModule(object):
def filters(self):
return {
'custom': self.custom
}
def custom(self, listvar):
result = {}
final = []
for it in listvar:
f, s = it.split('-')
if f in result:
result[f].append(s)
else:
result[f] = [s]
for k in result:
final.append({'customer':k, 'nodes': result[k]})
return final
劇本:
---
- hosts: localhost
vars:
customers:
- customer01-node01.private.foo.it
- customer02-node01.private.foo.it
- customer04-node03.private.foo.it
- customer03-node02.private.foo.it
- customer05-node02.private.foo.it
- customer01-node04.private.foo.it
- customer02-node04.private.foo.it
- customer04-node06.private.foo.it
- customer03-node05.private.foo.it
- customer05-node05.private.foo.it
tasks:
- name: parsevar
set_fact:
customers_list: "{{ customers | custom }}"
- name: display
debug:
msg: "{{ customers_list }}"
結果:
ok: [localhost] => {
"msg": [
{
"customer": "customer01",
"nodes": [
"node01.private.foo.it",
"node04.private.foo.it"
]
},
{
"customer": "customer02",
"nodes": [
"node01.private.foo.it",
"node04.private.foo.it"
]
},
{
"customer": "customer04",
"nodes": [
"node03.private.foo.it",
"node06.private.foo.it"
]
},
{
"customer": "customer03",
"nodes": [
"node02.private.foo.it",
"node05.private.foo.it"
]
},
{
"customer": "customer05",
"nodes": [
"node02.private.foo.it",
"node05.private.foo.it"
]
}
]
}
使用自定義過濾器的優勢:您只有一項任務來轉換資料
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/394072.html
上一篇:MDK 分散加載檔案剖析(一)
