Katakanlah Anda memiliki larik kamus dan Anda ingin membuat larik dengan beberapa atribut kamus. Ada beberapa metode untuk melakukan ini: selectattr, map dan filter ekstrak baru.
Itu berfungsi dengan baik sampai Anda memutuskan untuk menggunakan host dari beberapa grup sebagai larik kamus awal. Jadi Anda harus mendapatkan hostvars
untuk setiap host dalam grup dengan filter. Kami biasanya dapat mengatasi ini dengan beberapa iterasi jinja tetapi itu tidak berfungsi untuk mengatur variabel.
Yang mengatakan ada solusi :
def fetchlistfromdict(d, l):
result = []
for item in l:
result.append(d[item])
return result
class FilterModule(object):
def filters(self):
return {
'fetchlistfromdict': fetchlistfromdict,
}
Dan sekarang:
{{ hostvars|fetchlistfromdict(groups['webservers']) |map(attribute='custom_facts.aliases.0.ip')|list}}
Kasus ini tampaknya sangat spesifik dan mungkin terkait dengan modul route53
.
Jadi bisakah kita menambahkan filter ini ke ansible? Haruskah saya membuat PR? Bagaimana dengan penamaan? Saya telah menyimpan yang asli tetapi list_from_dict
terlihat lebih baik untuk saya.
{{ hostvars|fetchlistfromdict(groups['webservers']) |map(attribute='custom_facts.aliases.0.ip')|list}}
Apa yang dilakukan ini berbeda dari
{{ groups['webservers']|map('extract', hostvars, ['custom_facts','aliases','0','ip'])|list }}
?
@amenonsen poin bagus, saya hanya mencoba mendapatkan ini dengan map(attribute=
, sepertinya filter ekstrak baru berfungsi, menantikan untuk bermain dengannya di rilis baru!
Contoh ini harus disertakan dalam dokumentasi. Saya mencari cukup lama sebelum saya menemukan masalah ini.
Komentar yang paling membantu
Contoh ini harus disertakan dalam dokumentasi. Saya mencari cukup lama sebelum saya menemukan masalah ini.