Saltstack - 解析YAML属性文件以设置Jinja变量 - For循环

时间:2017-07-28 13:36:31

标签: variables properties yaml jinja2 salt-stack

我尝试用Jinja解析一个属性文件来设置变量。

我在此文件中有多个类别和子类别,如:

  • jboss_container
    • 一些属性
    • foobar的
  • jboss_datasource_install
    • datasource1
      • PROP1
      • PROP2
    • datasource2
  • jboss_app_deploy
    • APP1
    • APP2

目标是从每个类别设置变量并在for循环中重用它们。   - >例如,我想在每个子类别上安装2个jboss数据源并循环

foobar.properties.yml:

jboss_container:
    jboss_container_values:
      jboss_container_install: 'True'
      jboss_app_name: 'foobar'
      jboss_version: 'x.x.x'
      ...

jboss_datasource_install:
    datasource1:
      jboss_datasource_install: 'True'
      jboss_datasource_name: 'foobar'
      jboss_datasource_jta: 'true'
      ...
    datasource2:
      jboss_datasource_install: 'True'
      ...

init.sls:

{% import_yaml 'foobar_properties.yml' as jboss_apps %}

% for jboss_container, jboss_container_values in jboss_apps.iteritems() %}
      {% for key, value in jboss_container_values.items() %}
                  {% if value.get('jboss_container_install') != 'False' %}

# Do stuff - {{ value.jboss_app_name }}

                  {% endif %}
      {% endfor %}
{% endfor %}

{% for jboss_datasource_install, jboss_datasource_install_name in jboss_apps.iteritems() %}
      {% for key, value in jboss_datasource_install_name.items() %}
                  {% if value.get('jboss_datasource_install') != 'False' %}

# Do stuff - {{ value.jboss_datasource_install }}

                  {% endif %}
      {% endfor %}
{% endfor %}

实际上在Salt中出现此错误:

Jinja变量'dict对象'没有属性'jboss_app_name'

任何想法如何做到这一点?

非常感谢:)

2 个答案:

答案 0 :(得分:0)

您的外部循环遍历jboss_datasource_install,内部循环遍历datasource1。您的if然后要求

value.get('jboss_container_install')

dict不包含名为jboss_container_install的键,因此返回None。由于这不等于'False',因此Jinja会尝试插入value.jboss_app_name,这是错误的来源。

一个简单的解决方法是将if - Statement重写为:

{% if value.get('jboss_container_install') == 'True' %}

但是你的外环似乎很奇怪。如果您只想迭代jboss_container,则可以替换

{% for jboss_container, jboss_container_values in jboss_apps.iteritems() %}
  {% for key, value in jboss_container_values.items() %}

{% for key, value in jboss_apps['jboss_container']['jboss_container_values'].iteritems() %}

答案 1 :(得分:0)

Infortunatly with:

{% for key, value in jboss_apps['jboss_container']['jboss_container_values'].iteritems() %} 
{% if value.get('jboss_container_install') == 'True' %}
# Do stuff - {{ value.jboss_app_name }}

我收到了这个错误: 失败:Jinja变量'str object'没有属性'get'

没有If语句,我收到此错误: 失败:Jinja变量'str object'没有属性'jboss_app_name'

如果我尝试使用{{jboss_app_name}}而不是{{value.jboss_app_name}},则会发生同样的错误。