2016-12-01 51 views
0

上Ansible 2.2我有Ansible 2字典路口

all_subnets: 
id | subnet   | mask | sectionId 
-----+----------------+------+----------- 
4831 | 172.31.0.0  | 16 | 19   
4832 | 192.168.0.0 | 24 | 19   
4858 | 192.168.248.0 | 21 | 19   
4859 | 192.168.248.0 | 27 | 19   
4860 | 192.168.248.32 | 28 | 19   

和含有期望的子網現在

my_subnets: 
    - subnet: "192.168.0.0" 
    mask: "24" 
    - subnet: "192.168.248.32" 
    mask: "28" 

另一個JSON名單,我想相交的兩個列表:

id | subnet   | mask | sectionId 
-----+----------------+------+----------- 
4832 | 192.168.0.0 | 24 | 19   
4860 | 192.168.248.32 | 28 | 19   

我該如何做到這一點?

的Riccardo

回答

0

在這樣情況下,我寧願重構頂層「數據庫」值到一個字典(據推測,由ID鍵控)。這種格式可以輕鬆地根據ID或其他屬性訪問值的子集,或訪問整個值集。

這與Ansible的「保持簡單」的口頭禪一致,最大限度地減少了對交叉點和匹配等併發症的需求。

例如:

--- 
all_subnets: 
    4831: { id: 4831, subnet: "172.31.0.0",  mask: 16, sectionId: 19, } 
    4832: { id: 4832, subnet: "192.168.0.0", mask: 24, sectionId: 19, } 
    4858: { id: 4858, subnet: "192.168.248.0", mask: 21, sectionId: 19, } 
    4859: { id: 4859, subnet: "192.168.248.0", mask: 27, sectionId: 19, } 
    4860: { id: 4860, subnet: "192.168.248.32", mask: 28, sectionId: 19, } 

# Your use-case 
my_subnets: ["{{ all_subnets[4832] }}", "{{ all_subnets[4860] }}"] 

# Getting subnets matching a value 
my_subnets: "{{ all_subnets | selectattr('subnet', 'equalto', '192.168.248.0') | list }}" 

# Getting all subnets 
my_subnets: "{{ all_subnets.values() }}" 
+0

是十分明顯的。謝謝! – Riccardo79