首页 > 解决方案 > 在 Ansible 中使用带有两个变量的 Jinja 过滤器

问题描述

我正在尝试在包含 IP 列表的组中获取一个随机主机。我们遇到了一些问题,因为我们的组名使用了一个变量,但是{{由于 Jinjarandom调用,该行已经在 's 中。

- hosts: "{{ {{ env }}_as_group | random }}"

ERROR! template error while templating string: expected token 'end of print statement', got '{'. String: {{ {{ env }}_as_group | random }}

env 变量在执行时被传递到剧本中ansible-playbook "-e env=stage" myplaybook.yml

在网上环顾四周,大多数人用 来解决这个问题vars[env],但这似乎对我们不太有效 -

- hosts: "{{ vars[env]_as_group | random }}"

ERROR! template error while templating string: expected token 'end of print statement', got '_as_group'. String: {{ tag_aws_autoscaling_groupName_[ env ]_as_group | random }}

如果我成功了- hosts: "{{ stage_as_group | random }}",它会按预期工作。

如何设置主机以在组中提取随机值{{ env }}_as_group

标签: ansible

解决方案


在 Ansible 中,胡子不应该堆叠

所以你应该使用正确的 Jinja连接运算符: ~
结尾:

- hosts: "{{ vars[env ~ '_as_group'] | random }}"

这就是说我并不完全清楚到底stage_as_group是什么:它是列表还是主机组?
如果这是您清单中的一个组,这将不起作用,因为它random适用于一个序列,并且主机组是一个字符串,而不是一个序列。

对于那个用例,您可能想要这个:

- hosts: "{{ groups[env ~ '_as_group'] | random }}"

推荐阅读