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 (运行时对象构造)。
我是 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
' 键。
出于好奇,您可以查看