Advanced filtering
在這個教程中我們將看下如何使用F這個對象進(jìn)行高級的主機過濾衣吠,讓我們從初始化nornir開始然后
看下inventory:
from nornir import InitNornir
from nornir.core.filter import F
nr = InitNornir(config_file="advanced_filtering/config.yaml")
---
%cat advanced_filtering/inventory/hosts.yaml
cat:
groups:
- terrestrial
- mammal
data:
domestic: true
diet: omnivore
additional_data:
lifespan: 17
famous_members:
- garfield
- felix
- grumpy
bat:
groups:
- terrestrial
- mammal
data:
domestic: false
fly: true
diet: carnivore
additional_data:
lifespan: 15
famous_members:
- batman
- count chocula
- nosferatu
eagle:
groups:
- terrestrial
- bird
data:
domestic: false
diet: carnivore
additional_data:
lifespan: 50
famous_members:
- thorondor
- sam
canary:
groups:
- terrestrial
- bird
data:
domestic: true
diet: herbivore
additional_data:
lifespan: 15
famous_members:
- tweetie
caterpillaer:
groups:
- terrestrial
- invertebrate
data:
domestic: false
diet: herbivore
additional_data:
lifespan: 1
famous_members:
- Hookah-Smoking
octopus:
groups:
- marine
- invertebrate
data:
domestic: false
diet: carnivore
additional_data:
lifespan: 1
famous_members:
- sharktopus
%cat advanced_filtering/inventory/groups.yaml
---
mammal:
data:
reproduction: birth
fly: false
bird:
data:
reproduction: eggs
fly: true
invertebrate:
data:
reproduction: mitosis
fly: false
terrestrial: {}
marine: {}
你可以看到我們已經(jīng)準(zhǔn)備了一些擁有不同屬性的動物袖订。F對象可以讓你訪問魔法方法,這些魔法方法都是兩個下劃線和魔法方法的名稱組成的灾梦。例如玫坛,如果你想檢查一個列表里是否包含指定的元素可以通過__contains魔法方法掂僵。讓我們通過這個特性獲取所有屬于鳥類的動物:
birds = nr.filter(F(groups__contains="bird"))
print(birds.inventory.hosts.keys())
輸出:
dict_keys(['eagle', 'canary'])
我們還可以通過~來進(jìn)行取反:
birds = nr.filter(~F(groups__contains="bird"))
print(birds.inventory.hosts.keys())
輸出:
dict_keys(['cat', 'bat', 'caterpillaer', 'octopus'])
我們還可以復(fù)合F對象通過符號&和|來單獨執(zhí)行且和或的操作:
domestic_or_bird = nr.filter(F(groups__contains="bird") | F(domestic=True))
print(domestic_or_bird.inventory.hosts.keys())
輸出:
dict_keys(['cat', 'eagle', 'canary'])
domestic_mammals = nr.filter(F(groups__contains="mammal") & F(domestic=True))
print(domestic_mammals.inventory.hosts.keys())
輸出:
dict_keys(['cat'])
如你所想,你可以組合所有的符號:
flying_not_carnivore = nr.filter(F(fly=True) & ~F(diet="carnivore"))
print(flying_not_carnivore.inventory.hosts.keys())
輸出:
dict_keys(['canary'])
你還可以通過訪問魔法方法的方式訪問嵌套的數(shù)據(jù)授嘀,通過在你想訪問的數(shù)據(jù)前加兩個下劃線。你可以根據(jù)需求繼續(xù)建造甚至訪問嵌套數(shù)據(jù)的魔法方法锣险。例如蹄皱,讓我們獲取那些壽命大于等于15的動物:
long_lived = nr.filter(F(additional_data__lifespan__ge=15))
print(long_lived.inventory.hosts.keys())
輸出:
dict_keys(['cat', 'bat', 'eagle', 'canary'])
還有兩個"特殊服務(wù)"來幫助你處理lists览闰,any和all。這些方法可以讓你發(fā)送一個列表的元素來獲取那些包含一個或包含全部元素的對象巷折。例如:
marine_and_invertebrates = nr.filter(F(groups__all=["marine", "invertebrate"]))
print(marine_and_invertebrates.inventory.hosts.keys())
輸出:
dict_keys(['octopus'])
bird_or_invertebrates = nr.filter(F(groups__any=["bird", "invertebrate"]))
print(bird_or_invertebrates.inventory.hosts.keys())
輸出:
dict_keys(['eagle', 'canary', 'caterpillaer', 'octopus'])