我有一个名为医院库存并且它包含以下具有单个值的组。
[dockerSwarmManager]
hp2-3.mydomain.com
然后我有一个文件名安全.json.j2在文件夹内调用模板。在那里我想在下面的占位符中引用上面提到的值。
"wellKnownUrl": "https://_placeholder_value_/my-configuration",
有没有直接的方法可以做到这一点?
作为替代方案,我的做法是在主目录文件内部默认值目录并使用它。
swarm_hostname: "\
{% for host in groups['dockerSwarmManager'] -%}\
{{host}}\
{%- if not loop.last %}, {% endif -%}\
{%- endfor %}"
尽管我得到了预期的输出,但我认为使用循环仅从库存文件内的组中提取单个值并不好。
答案1
如果您绝对确定该组只包含一个值,则可以使用first()
对变量进行过滤以获取列表中的第一个元素:
swarm_hostname: "{{ groups['dockerSwarmManager'] | first }}"
如果可能有多个主机,你也可以使用join()
:
swarm_hostname: "{{ groups['dockerSwarmManager'] | join(',') }}"
这将创建一个以逗号分隔的列表,我认为从您的示例来看这是可以接受的。
当然,这也可以直接在您的 JSON 模板中使用:
"wellKnownUrl": "https://{{ groups['dockerSwarmManager'] | first }}/my-configuration",
答案2
您正在寻找 Ansible “魔法变量“,特别是“inventory_hostname”。您可以在这样的 jinja2 模板中使用它,使用 jinja2‘双括号’变量样式:
"wellKnownUrl": "https://{{ inventory_hostname }}/my-configuration",
该模板行将解析为以下字符串:
"wellKnownUrl": "https://hp2-3.mydomain.com/my-configuration",