2016-11-07 3 views
0

Ich bin ziemlich neu zu Jinja2, und ich frage mich, wie dies zu erreichen ist.Komplexe Filterung in Ansible/Jinja2

sagen, dass ich die folgende vars haben:

--- 
servers: 
    192.168.0.1: 
    names: 
     - foo.example.com 
     - foo 
    exports: 
     data: 
     foo1: /disks/foo1 
     foo2: /disks/foo2 
    192.168.0.2: 
    ... 

ich einen Symlink /data/foo1-/disks/foo1 und /data/foo2 zu /disks/foo2, sondern nur auf foo Server erstellt werden soll; Auf anderen Servern erstellen Sie Symlinks zu den jeweiligen Exporten. Also ich dachte file status=link with_items=... wäre die richtige Sache zu tun. In Python kann ich das Array bekomme ich die folgende Logik verwenden müssen:

[ 
    { 'mount': mount, 'export': export } 
    for ip, server in servers.iteritems() 
    if ansible_hostname in server['names'] 
    and 'exports' in server 
    and 'data' in server['exports'] 
    for mount, export in server['exports']['data'].iteritems()' 
] 

Ich weiß nicht, wie dies in Jinja2 zu tun. Ich wollte etwas wie

{{ servers | select('ansible_hostname in self.names') | ... }} 

tun, aber das funktioniert nicht. Müsste ich ein Plugin für diese Logik erstellen? Oder ist mein Ansatz falsch und ich sollte die Struktur meiner servers Daten überdenken?

+0

Warum nicht einfach über 'servers [ansible_hostname] .exports.data'? –

+0

@KonstantinSuvorov: weil ich nicht weiß, welche Form 'ansible_hostname' braucht. Jetzt, wo ich es sage, klingt es dumm - es ist wahrscheinlich das, was ich in "Inventar" stecke, oder? Ich werde versuchen und morgen damit spielen; In der Zwischenzeit bin ich immer noch neugierig auf komplexe Transformationen in Jinja2. – Amadan

+0

Normalerweise möchten Sie die Variable 'inventory_hostname' verwenden, die Sie als Hostnamen im Inventar verwenden. 'servers [ansible_hostname]' greift auf 'servers' 'Schlüssel mit dem Namen des' ansible_hostname's Wertes zu. Nur aus Neugier können Sie [diese] (http://stackoverflow.com/a/40395995/2795592) und [diese] (http://stackoverflow.com/a/40036807/2795592) überprüfen. –

Antwort

1

Antwort von meinem Kommentar:

Normalerweise wollen Sie inventory_hostname Variable verwenden - es ist das, was Sie im Inventar als Hostnamen verwenden.
servers[ansible_hostname] wird auf servers 'Schlüssel mit dem Namen ansible_hostname Wert zugreifen.

Nur aus Neugier können Sie this (komplexe Filterkette) und this (Laufzeitobjektkonstruktion) überprüfen.