【问题标题】:Using Jinja2 Expression within Jinja2 Statement在 Jinja2 语句中使用 Jinja2 表达式
【发布时间】:2018-05-17 01:04:47
【问题描述】:

假设我有以下 Jinja2 变量:

  • 'dev_ami' = 'ami-123456'
  • 'dev_located_ami' = 'ami-123456'
  • 'prod_ami' = 'ami-654321'
  • 'prod_located_ami' = 'ami-654321'

我想在“dev_ami”变量等于“dev_located_ami”变量时设置一个条件。这很容易做到,如以下语句所示:

{% if dev_ami == dev_located_ami %}
... do some stuff
{% else %}
... do some other stuff
{% endif %}

但我想根据列表 ['dev'、'prod' 等...] 中包含的部署环境动态比较 amis。以下包含一个模板错误,因为在这样的语句中存在一个表达式 - {% {{ .. }} %}

{% for env_type in ['dev','prod'] %}
{% if {{ env_type }}_ami == {{ env_type }}_located_ami %}
... do stuff
{% else %}
... do other stuff
{% endif %}
{% endfor %}

我试图在下面的代码中设置变量来表示我想要的表达式,但不幸的是,它们按字面意思编译为“dev_ami”和“dev_located_ami”,而我希望它们编译为相应的变量值“ami-123456”和“ami-123456”:

{% for env_type in ['dev','prod'] %}
{% set ami = "%s_ami"|format(env_type) %}
{% set located_ami = "%s_located_ami"|format(env_type) %}
{% if ami == located_ami %}
... do stuff
{% else %}
... do other stuff
{% endif %}
{% endfor %}

我已经检查了各种过滤器,但到目前为止都没有成功。希望获得有关使此特定实现正常工作的建议。提前谢谢你。

【问题讨论】:

    标签: ansible jinja2


    【解决方案1】:

    我认为您可能在处理问题时考虑到了错误的数据结构。

    动态生成变量名称以比较不同环境中的 amis 对我来说听起来有点矫枉过正。你熟悉列表和字典吗?

    尝试从这样的东西开始(伪代码):

    dict = { environments:
                prod:
                   ami1: foo
                   ami1_located: foo
                dev:
                   ami1: bar
                   ami1_located:baz
    }
    
    for env in dict[environments]:
       if env[ami1] == env[ami1_located]:
          [...]
    

    【讨论】:

    • 感谢您的字典创意。我熟悉数据结构,但我正在比较的 amis 是从 aws ansible 模块和多个区域动态获取的,因此在这种情况下,使用 amis 字典并不是我真正要寻找的答案。感谢您的帮助。
    猜你喜欢
    • 2010-11-30
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    相关资源
    最近更新 更多