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?
Warum nicht einfach über 'servers [ansible_hostname] .exports.data'? –
@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
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. –