Ansible/Jinja2 中的复杂过滤

Complex filtering in Ansible/Jinja2

我是 Jinja2 的新手,我想知道如何实现这一目标。

假设我有以下 vars:

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

我想创建一个符号链接 /data/foo1/disks/foo1/data/foo2/disks/foo2,但只能在 foo 服务器上;在其他服务器上,为它们各自的导出创建符号链接。所以我认为 file status=link with_items=... 是正确的做法。在 Python 中,我可以使用以下逻辑获取我需要的数组:

[
    { '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()'
]

我不知道如何在 Jinja2 中执行此操作。我想做类似

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

但这不起作用。我需要为这个逻辑创建一个插件吗?还是我的方法全错了,我应该重新考虑我的 servers 数据的结构?

我评论的答案:

通常你想使用 inventory_hostname 变量——它是你在清单中用作主机名的。
servers[ansible_hostname] 将访问名称为 ansible_hostname 值的 servers' 键。

出于好奇,您可以查看 (complex filter chain) and (运行时对象构造)。