我正在尝试使用 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'"}
有人可以帮助我理解为什么这不起作用吗?
一旦进入 Jinja 模板领域,您就不需要使用更多花括号;您可以使用 Jinja 模板语言(在许多情况下与 Python 非常相似)。
特别是你写的地方:
{% for host in groups['{{dc}}-linux'] %}
如果您使用 Python,您将连接变量
dc
和字符串 -linux
。 Jinja 有 一个特定的字符串连接运算符 我认为这应该可行
{% for host in groups[dc ~ '-linux'] %}