ansible 嵌套 jinja 表达式[重复]

问题描述 投票:0回答:1

我正在尝试使用 Ansible 和 Jinja2 的模板生成一个文件,但我似乎无法识别变量。

我有许多数据中心(dc),并且在我运行此剧本的主机的hosts_vars 文件中将其声明为“dc”。我可以在模板中调用“dc”并且它可以工作。我的问题在于当我需要呼叫一组“dc”时,

即我的数据中心是“tucson”,我在“tucson”内有一个名为“tucson-linux”的组。我需要能够从“tucson-linux”动态获取主机列表。我可以使用以下代码静态地执行此操作,在本例中,我从该组中的每个主机获取“gui_addr”。

我的模板:

{
 "cluster": {
  "name": "{{ dc|upper }}-Cluster",
  "config": {
   "ip-address": [ {% for host in groups['tucson-linux'] %}"{{ hostvars[host].gui_addr + '",' }}{% endfor %} ]
 }
}

我尝试过用“dc”变量替换“tucson”的不同变体,但没有运气,我读到你不能嵌套 jinja 表达式,这似乎是我想要做的

{
 "cluster": {
  "name": "{{ dc|upper }}-Cluster",
  "config": {
   "ip-address": [ {% for host in groups['{{dc}}-linux'] %}"{{ hostvars[host].gui_addr + '",' }}{% endfor %} ]
 }
}

错误,

 fatal: [tucson-server-01]: FAILED! => {"changed": false, "msg": "AnsibleUndefinedVariable: 'dict object' has no attribute '{{dc}}-linux'"}

有人可以帮助我理解为什么这不起作用吗?

ansible jinja2
1个回答
4
投票

一旦进入 Jinja 模板领域,您就不需要使用更多花括号;您可以使用 Jinja 模板语言(在许多情况下与 Python 非常相似)。

特别是你写的地方:

{% for host in groups['{{dc}}-linux'] %}

如果您使用 Python,您将连接变量

dc
和字符串
-linux
。 Jinja 有 一个特定的字符串连接运算符 我认为这应该可行

{% for host in groups[dc ~ '-linux'] %}
© www.soinside.com 2019 - 2024. All rights reserved.