如何将库存文件中的组值传递给 ansible 中的 jinja2 模板文件

如何将库存文件中的组值传递给 ansible 中的 jinja2 模板文件

我有一个名为医院库存并且它包含以下具有单个值的组。

[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",

相关内容