我正在尝试使用具有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'var替换'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'"}
有人可以帮助我了解为什么这不起作用吗?
答案 0 :(得分:1)
一旦您进入Jinja模板领域,就无需使用更多的花括号;您可以使用Jinja template language(在许多情况下与Python非常相似)。
特别是在哪里写:
{% for host in groups['{{dc}}-linux'] %}
例如,如果您使用的是Python,则可以将变量dc
和字符串-linux
连接起来。 Jinja有a specific string concatenation operator,我认为应该可以
{% for host in groups[dc ~ '-linux'] %}