【问题标题】:How to populate Jinja2 template that is stored in Ansible variable?如何填充存储在 Ansible 变量中的 Jinja2 模板?
【发布时间】:2019-01-08 13:03:20
【问题描述】:

我正在寻找一种方法来填充作为 Ansible 变量值一部分的 Jinja2 模板。我有如下所示的 YAML 文件:

metadata:
  name: {{ metadata_name }}-prod
  labels:
    app: {{ app_name }}
    env: {{ load_zone }}

在我的剧本中,我将文件读入变量manifest

name: load file into variable
include_vars:
  file: "/etc/configs/mydata"
  name: manifest

现在我需要一种用实际值替换 manifest 变量中的 Jinja2 模板的方法。例如,假设metadata_name 的值是“my_app”,app_name 是“我的应用程序”,load_zone 是“us_east”,那么 而不是 manifest 值,即:

metadata:
  name: {{ metadata_name }}-prod
  labels:
    app: {{ app_name }}
    env: {{ load_zone }}

我想得到这个值:

metadata:
  name: my_app-prod
  labels:
    app: My Application
    env: us_east

任何人都可以提供有关 Ansible 模块或功能...或技巧的建议吗?

【问题讨论】:

  • 这 3 个项目是 static 还是在剧本运行时计算出来的?也就是说:load_zone 是否会随着时间而变化,或者主机以已知的load_zone 开始,而您只需将该信息提供给您的剧本?
  • 我不确定我是否理解您的问题。我已经编辑了这个问题,以提供更好的例子来说明我想要实现的目标。假设模板中的变量总是有值是安全的。
  • 好的,那么也许我不理解您的问题:metadata: 业务是您正在阅读的文件、您尝试创建的文件还是 @ 987654334@ 在你的剧本中代表dict
  • 为了缩小问题范围,我有一个事实是字典(从文件映射)。一些字典的值是 jinja2 模板。我正在寻找一种方法来评估这些模板,以便字典的值将被评估 jinja2 表达式而不是模板。

标签: ansible jinja2


【解决方案1】:

似乎使用 Jinja2 过滤器对变量(事实)的任何评估都可以做到。例如,假设问题中的字典存储在变量manifest 和字典值中的其他模板变量中,以下表达式会将变量值替换为字典值:

- hosts: localhost
  tasks:
    - name: evaluate dictionary
      set_fact:
        manifest: "{{ manifest }}"

请注意,如果模板中使用的变量未定义,undefined 字符串将被替换为值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 2015-12-08
    相关资源
    最近更新 更多